PhantomJS, HTTPS sitesini açamıyor


104

Http sunucusu kimlik doğrulaması gerektiren bir https: // sitesini açmak için loadspeed.js örneğini temel alan aşağıdaki kodu kullanıyorum.

var page = require('webpage').create(), system = require('system'), t, address;

page.settings.userName = 'myusername';
page.settings.password = 'mypassword';

if (system.args.length === 1) {
    console.log('Usage: scrape.js <some URL>');
    phantom.exit();
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}  

Sayfayı her zaman yükleyemiyor. Burada ne yanlış olabilir? Güvenli siteler farklı şekilde mi ele alınacak? Siteye yine de tarayıcıdan başarıyla erişilebilir.

Şu anda Phantom ile yeni başlıyorum ve bu konuda ilerlemiyor olsam da etrafta oynamayı bırakmanın çok iyi olduğunu düşünüyorum.

Yanıtlar:


153

Fred ve Cameron Tinker'in yanıtlarını denedim, ancak yalnızca --ssl-protocol = herhangi bir seçenek bana yardımcı olacak gibi görünüyor:

phantomjs --ssl-protocol=any test.js

Ayrıca --ssl-protocol=anyhala şifrelemeyi kullandığınız için kullanmanın daha güvenli olacağını düşünüyorum , ancak --ignore-ssl-errors=truekötü niyetli olanlar dahil tüm ssl hatalarını yok sayacak (duh).


1
Bu 3 bağımsız değişkeni kullanmak zorunda kaldım ve çözüldü: "--web-security = false", "--ssl-protocol = any", "--ignore-ssl-errors = true". webdriver.PhantomJS (service_args = ['- ignore-ssl-errors = true', "--web-security = false", "--ssl-protocol = any"])
Abdul Khalid

123

Sorun büyük olasılıkla SSL sertifika hatalarından kaynaklanmaktadır. Phantomjs'yi --ignore-ssl-errors = yes seçeneğiyle başlatırsanız , SSL hatası yokmuş gibi sayfayı yüklemeye devam etmelidir:

phantomjs --ignore-ssl-errors=yes [phantomOptions] script.js [scriptOptions]

SSL sertifikalarını yanlış bir şekilde uygulamada sorun yaşayan birkaç web sitesi gördüm veya bunların süresi doldu, vs. phantomjs için komut satırı seçeneklerinin tam listesini burada bulabilirsiniz: http://phantomjs.org/api/command-line. html . Umarım bu yardımcı olur.


2
Teşekkürler, bu benim sorunumu da çözdü. Benim durumum, tarayıcıda Cert hatası almadım, bu yüzden çok kafa karıştırıcıydı, ancak ayrıntılı bir şekilde kıvrıldım ve çalışmayanın Wildcard Cert kullanıyor olduğunu fark ettim (yani: CN = *. Example.com). Phantomjs'nin bunun neden başarısız olduğuna dair ayrıntılı bir neden döndürebilmesi güzel olurdu.
naoko

7
Kutsal maymunlar. SSL hatasının açıklanmasını diliyorum, yalnızca yığın taşması ve pembe tek boynuzlu at, temel nedeni bulmama yardımcı oldu. Teşekkürler çocuklar
SimplGy

Bunun insanlara yardım etmesine sevindim. Belki de PhantomJS, ayrıntılı SSL hatalarını başka bir komut satırı argümanıyla sağlamak için bir güncellemeye ihtiyaç duyacaktır. SSL hata bilgilerinin Qt'de mevcut olduğunu biliyorum, ancak çoğu zaman insanlar hataları açıkça işlemeden bastırırlar.
Cameron Tinker

Oyuna geç kaldığımı biliyorum, ancak senaryo adından sonra seçeneği eklemenin işe yaramadığını fark ettim - sırayla aramanız gerekiyor:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

Evet, --ignore-ssl-errors=yesseçenek komut dosyası adından önce gelmelidir. Bunu işaret ettiğiniz için teşekkür ederim.
Cameron Tinker

71

2014-10-16 itibarıyla PhantomJS'nin HTTPS bağlantılarını açmak için varsayılan olarak SSLv3 kullandığını unutmayın. Yakın zamanda duyurulan POODLE güvenlik açığı ile birçok sunucu SSLv3 desteğini devre dışı bırakıyor .

Bunu aşmak için PhantomJS'yi şunlarla çalıştırabilmelisiniz:

phantomjs --ssl-protocol=tlsv1

Umarız PhantomJS, TLSv1'i SSLv3 yerine varsayılan yapmak için yakında güncellenecektir.


4
Sürüm 1.9.8 varsayılanı TLSv1'e değiştiriyor: github.com/ariya/phantomjs/issues/12670
Andy Triggs

Benim için düzeltildi, sunucuda SSLv3 devre dışı bırakıldı
Chris Herring

2
PhantomJS 1.9.8'e güncellemenin yeni bir hataya yol açtığını unutmayın .
Artjom B.

Kabul edilen cevap bu olmalıdır. SSL'yi devre dışı bırakmak veya herhangi bir protokole izin vermek bence iyi bir çözüm değildir. Paylaşım için teşekkürler.
Dominic P

3
SSL anlaşması sorunlarından nasıl daha ayrıntılı hata ayıklama alabilirim?
wrschneider

24

aynı sorunu yaşadım ...
--ignore-ssl-errors = yes benim için düzeltmek için yeterli değildi, iki şey daha yapmak zorunda kaldı:
1) kullanıcı aracısını değiştir
2) tüm ssl protokollerini denedi, tek işe yarayan söz konusu sayfa için tlsv1 oldu
Umarım bu yardımcı olur ...


2
Ssl protokollerini tlsv1 olarak değiştirmek benim için de işe yaradı, teşekkürler!
Dave Stibrany

1
+1 Sorunumu düzelttim, şanslısın benimle şu anda seni öpeceğim gibi burada değilsin lol, şerefe
Martin

Bu tam olarak ihtiyacım olan şey. Çok teşekkür ederim! Tlsv1 yerine "herhangi" kullandım ve bu da işe yarıyor. (diğer SSL web sitelerini ziyaret
etsem

1
kullanıcı aracısını neye değiştirecek?
Lucas Steffen

15

Aynı sorunu yaşadım (casperjs 1.1.0-beta3 / phantomjs 1.9.7). --İgnore-ssl-errors = yes ve --ssl-protocol = tlsv1 kullanarak çözdü. Seçeneklerden yalnızca birini kullanmak benim için sorunu çözmedi.


Bu numara, kod gemisi CI'daki sorunumu çözdü, bir phantomjs + behat paketi çalıştırdı (~ 10 saat hata ayıklama ve bir şeyler denedikten sonra)
ZeNC

Evet. birkaç aptal saat sonra yorumunuz benim günümü yaptı
Yarimadam

1

Alıyordum

PhantomJS'den SSL içeriği oluşturulurken hata meydana geldi (CentOS 6.6'da çalışıyor)

Kaynaktan derlemek onu benim için düzeltti. Yaptığınız phantomj'leri kullanmayı unutmayın. (eğer varsa / usr / local / bin / phantomjs yerine)

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel libpng-devel libjpeg-devel
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh
cd bin/
./phantomjs <your JS file>

1
İnsanların cevabınızı neden olumsuz olarak değerlendirdiğini bilmiyorum. Yukarıda belirtilen tüm çözümleri denedikten ve günlerce mücadele ettikten sonra, benim için çalışan tek çözüm bu. phantomJS, qt nedeniyle derlemek oldukça can sıkıcı, ama buna değer.
FlorianB

0

Birisi Sahi ile Phantomjs kullanıyorsa, --ignore-ssl-errorsseçeneğin browser_types.xml dosyanıza gitmesi gerekir. Benim için çalıştı.

<browserType>
    <name>phantomjs</name>
    <displayName>PhantomJS</displayName>
    <icon>safari.png</icon>
    <path>/usr/local/Cellar/phantomjs/1.9.2/bin/phantomjs</path>
    <options>--ignore-ssl-errors=yes --debug=yes --proxy=localhost:9999 /usr/local/Cellar/phantomjs/phantom-sahi.js</options>
    <processName>"PhantomJS"</processName>
    <capacity>100</capacity>
    <force>true</force>
</browserType>

0

Ne dersin shebang ?

phantomjsKomut dosyalarını yürütmek için shebang kullanıyorsanız, aşağıdaki shebang satırını kullanın

#!/usr/bin/phantomjs --ignore-ssl-errors=yes
    
var system = require('system');
var webpage = require('webpage');

// ... rest of your script

Yukarıdaki cevaplardan herhangi birini kullanın. --ignore-ssl-errors=yesGeridöngü web sunucularımın kendinden imzalı sertifikasını doğrulamak alakasız olduğu için kişisel olarak seviyorum .


0

Buradaki diğer cevapların hiçbiri bana yardımcı olmadı; çalıştığım belirli site (ler) HTTP başlıkları konusunda çok seçici olabilir. Bu işe yaradı:

var page = webpage.create();
page.customHeaders = {
    "Connection": "keep-alive"
};

PhantomJS'nin "Keep-Alive" (büyük harfle yazılmış) kullandığını ve bağlantının canlı tutulmadığını öğrendim. :)


0

SSL Handshake FailedDün alıyordum . PhantomJS seçeneklerinin birçok kombinasyonunu denedim (--ignore-ssl-errors=yes vb.) , ancak hiçbiri işe yaramadı.

PhantomJS 2.1.1'e yükseltme sorunu çözdü.

Https://gist.github.com/julionc/7476620 adresindeki phantomJS kurulum talimatlarını kullandım ve phantomJS sürümünü 2.1.1 olarak değiştirdim.


0

Bir uzak sunucuya bağlanmak için phantomjs'yi çalıştırmaya çalıştığınız makinede, "openssl ciphers" komutunu çalıştırın. Listelenen şifreleri kopyalayıp --ssl-ciphers = "" komut satırı seçeneğine yapıştırın. Bu, bağlanan web sunucusuna, istemcinizle iletişim kurmak için hangi şifrelerin kullanılabileceğini söyler. Kendi makinenizde bulunanları ayarlamazsanız, makinenizin varsayılan ayar için kullanılan varsayılan modern tarayıcıların yaptığı herhangi bir şifreyi kullanabilir.


-2

Benim için işe yarayan tek şey phantomj'leri 1.9x'ten 2.x'e yükseltmekti;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.