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.

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.


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.


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.


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 ...


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.


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>

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>

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.


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. :)


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.


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.


-2

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.