PhantomJS nie otwiera witryny HTTPS

104

Używam następującego kodu opartego na przykładzie loadspeed.js, aby otworzyć witrynę https: //, która również wymaga uwierzytelnienia serwera http.

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();
    });
}  

Nie ładuje strony przez cały czas. Co tu może być nie tak? Czy zabezpieczone witryny mają być obsługiwane inaczej? Witryna może być jednak pomyślnie dostępna z przeglądarki.

Właśnie zaczynam od Phantoma w tej chwili i uważam, że zbyt dobrze jest przestać się bawić, mimo że nie posuwam się naprzód z tym problemem.

Sreerag
źródło

Odpowiedzi:

153

Wypróbowałem odpowiedzi Freda i Camerona Tinkera, ale tylko --ssl-protocol = jakakolwiek opcja wydaje mi się pomagać:

phantomjs --ssl-protocol=any test.js

Uważam również, że korzystanie z niego powinno być o wiele bezpieczniejsze, --ssl-protocol=anyponieważ nadal używasz szyfrowania, ale --ignore-ssl-errors=truezignorujesz (duh) wszystkie błędy ssl, w tym złośliwe.

JLarky
źródło
1
Musiałem użyć tych 3 argumentów i rozwiązano: "--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

Problem jest najprawdopodobniej spowodowany błędami certyfikatu SSL. Jeśli uruchomisz phantomjs z opcją --ignore-ssl-errors = yes , powinno przystąpić do ładowania strony tak, jak gdyby nie było błędów SSL:

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

Widziałem kilka witryn, które miały problemy z nieprawidłową implementacją swoich certyfikatów SSL lub wygasły, itp. Pełna lista opcji wiersza poleceń dla phantomjs jest dostępna tutaj: http://phantomjs.org/api/command-line. html . Mam nadzieję, że to pomoże.

Cameron Tinker
źródło
2
Dziękuję, to również rozwiązało mój problem. W moim przypadku nie dostałem błędu Cert w przeglądarce, więc było to bardzo zagmatwane, ale zrobiłem curl verbose i zauważyłem, że jeden, który nie działał, używał Wildcard Cert (tj .: CN = *. Example.com). Byłoby miło, gdyby phantomjs mógł podać szczegółowy powód, dla którego to się nie powiodło.
naoko
7
Święte małpy. Chciałbym, aby wyjaśniono błąd SSL, tylko przepełnienie stosu, a różowy jednorożec pomógł mi wyśledzić główną przyczynę. Dzięki chłopaki
SimplGy
Cieszę się, że to pomaga ludziom. Być może PhantomJS będzie wymagał aktualizacji, aby zapewnić szczegółowe błędy SSL z innym argumentem wiersza poleceń. Wiem, że informacje o błędach SSL są dostępne w Qt, ale w większości przypadków ludzie po prostu tłumią błędy bez jawnej obsługi ich.
Cameron Tinker
Wiem, że jestem spóźniony do gry, ale stwierdziłem, że dodanie opcji po nazwie skryptu nie zadziałało - musisz to wywołać w kolejności:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds
Tak, --ignore-ssl-errors=yesopcja powinna znajdować się przed nazwą skryptu. Dziękuję za zwrócenie uwagi.
Cameron Tinker,
71

Należy pamiętać, że od 16.10.2014 PhantomJS domyślnie używa SSLv3 do otwierania połączeń HTTPS. W związku z niedawno ogłoszoną luką POODLE, wiele serwerów wyłącza obsługę SSLv3.

Aby to obejść, powinieneś być w stanie uruchomić PhantomJS z:

phantomjs --ssl-protocol=tlsv1

Miejmy nadzieję, że PhantomJS zostanie wkrótce zaktualizowany, aby TLSv1 stał się domyślnym zamiast SSLv3.

Micheasza
źródło
4
Wersja 1.9.8 przełącza domyślnie na TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs
Naprawiłem to dla mnie, SSLv3 został wyłączony na serwerze
Chris Herring,
2
Zauważ, że aktualizacja do PhantomJS 1.9.8 prowadzi do nowego błędu .
Artjom B.
To powinna być akceptowana odpowiedź. Wyłączenie SSL lub zezwolenie na dowolny protokół nie jest moim zdaniem dobrym rozwiązaniem. Dzięki za udostępnienie.
Dominic P,
3
Jak uzyskać więcej szczegółowych informacji dotyczących debugowania problemów z uzgadnianiem protokołu SSL?
wrschneider
24

napotkał ten sam problem ...
--ignore-ssl-errors = tak nie wystarczyło, aby to naprawić, musiałem zrobić jeszcze dwie rzeczy:
1) zmienić agenta użytkownika
2) wypróbować wszystkie protokoły ssl, jedyny, który działał był tlsv1 dla tej strony
Mam nadzieję, że to pomoże ...

Fred
źródło
2
Zmiana protokołów ssl na tlsv1 też działała, dzięki!
Dave Stibrany
1
+1 Naprawiono mój problem, na szczęście nie ma cię tu ze mną, bo bym cię teraz pocałował lol, wiwaty
Martin
Właśnie tego potrzebowałem. Dziękuję Ci bardzo! Zamiast tlsv1 użyłem „any” i to też działa. (wydaje się trochę bezpieczniejsze, gdybym odwiedził inne witryny ssl.
user1841243
1
zmienić klienta użytkownika na co?
Lucas Steffen
15

Doświadczyłem tego samego problemu (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Użycie --ignore-ssl-errors = yes i --ssl-protocol = tlsv1 rozwiązało problem. Użycie tylko jednej z opcji nie rozwiązało tego problemu.

Jojje
źródło
Ta sztuczka rozwiązała mój problem z kodowaniem CI, uruchamiając pakiet phantomjs + behat (po ~ 10 godzinach debugowania i wypróbowywania różnych rzeczy)
ZeNC
Tak. po kilku głupich godzinach twój komentarz zrobił mój dzień!
Yarimadam
1

Otrzymywałem

Błąd podczas tworzenia kontekstu SSL „z phantomJS (działającego na CentOS 6.6)

Tworzenie ze źródła naprawiło to za mnie. Nie zapomnij użyć stworzonych przez siebie phantomjów. (zamiast / usr / local / bin / phantomjs, jeśli go masz)

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>
Mert Değirmenci
źródło
1
Nie wiem, dlaczego ludzie negatywnie oceniają Twoją odpowiedź. Po wypróbowaniu wszystkich wyżej wymienionych rozwiązań i dniach zmagań jest to jedyne rozwiązanie, które zadziałało. phantomJS jest dość irytujące przy kompilacji z powodu qt, ale warto.
FlorianB
0

Jeśli ktoś używa Phantomjs z Sahi, --ignore-ssl-errorsopcja musi znaleźć się w twoim pliku browser_types.xml. U mnie to zadziałało.

<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>
ctasca
źródło
0

O co chodzi shebang?

Jeśli używasz shebang do wykonywania phantomjsskryptów, użyj następującego wiersza shebang

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

// ... rest of your script

Użyj dowolnej z powyższych odpowiedzi. Osobiście podoba mi się, --ignore-ssl-errors=yesponieważ weryfikacja certyfikatu z podpisem własnym moich serwerów WWW jest nieistotna.

Jossef Harush
źródło
0

Żadna z pozostałych odpowiedzi nie pomogła mi; możliwe, że konkretne witryny, z którymi pracowałem, były zbyt wybredne ze względu na ich nagłówki HTTP. Oto, co zadziałało:

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

Dowiedziałem się, że PhantomJS używa "Keep-Alive" (pisanego wielką literą), a połączenie nie było utrzymywane przy życiu. :)

JstnPwll
źródło
0

Dostawałem SSL Handshake Failedwczoraj. Próbowałem wielu kombinacji opcji phantomJS ( --ignore-ssl-errors=yesitp.), Ale żadna z nich nie działała.

Aktualizacja do phantomJS 2.1.1 naprawiła to.

Skorzystałem z instrukcji instalacji phantomJS na https://gist.github.com/julionc/7476620 , zmieniając wersję phantomJS na 2.1.1.

VikR
źródło
0

Na komputerze, na którym próbujesz uruchomić phantomjs, aby połączyć się ze zdalnym serwerem, uruchom „openssl ciphers”. Skopiuj i wklej wymienione szyfry do opcji wiersza poleceń --ssl-ciphers = "". Informuje to łączący serwer sieciowy, które szyfry są dostępne do komunikacji z klientem. Jeśli nie ustawisz tych dostępnych na swoim komputerze, może użyć dowolnego szyfru, którego twój komputer nie rozumie, że domyślne nowoczesne przeglądarki robią to, co jest używane jako ustawienie domyślne.

Bobby Edge
źródło
-2

Jedyną rzeczą, która działała dla mnie, było podniesienie phantomjów z 1,9x do 2.x;)

giorgio79
źródło