PhantomJS non riesce ad aprire il sito HTTPS


104

Sto usando il seguente codice basato sull'esempio di loadpeed.js per aprire un sito https: // che richiede anche l'autenticazione del server 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();
    });
}  

Non riesce a caricare la pagina tutto il tempo. Cosa potrebbe essere sbagliato qui? I siti protetti devono essere gestiti in modo diverso? Tuttavia, è possibile accedere al sito con successo dal browser.

Sto appena iniziando con Phantom in questo momento e trovo che sia troppo bello per smettere di giocare anche se non sto andando avanti con questo problema.

Risposte:


153

Ho provato le risposte di Fred e Cameron Tinker, ma solo --ssl-protocol = qualsiasi opzione sembra aiutarmi:

phantomjs --ssl-protocol=any test.js

Inoltre penso che dovrebbe essere molto più sicuro da usare --ssl-protocol=anypoiché stai ancora utilizzando la crittografia, ma --ignore-ssl-errors=trueignorerà (duh) tutti gli errori SSL, inclusi quelli dannosi.


1
ho dovuto usare questi 3 argomenti e ha risolto: "--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

Il problema è molto probabilmente dovuto a errori del certificato SSL. Se avvii phantomjs con l' opzione --ignore-ssl-errors = yes , dovrebbe procedere al caricamento della pagina come se non ci fossero errori SSL:

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

Ho visto alcuni siti web che hanno problemi con l'implementazione errata dei loro certificati SSL o sono scaduti, ecc. Un elenco completo delle opzioni della riga di comando per phantomjs è disponibile qui: http://phantomjs.org/api/command-line. html . Spero che aiuti.


2
Grazie, questo ha risolto anche il mio problema. Nel mio caso, non ho ricevuto l'errore Cert sul browser, quindi è stato molto confuso, ma ho fatto un curl verbose e ho notato che uno che non funzionava utilizzava Wildcard Cert (ad esempio: CN = *. Example.com). Sarebbe bello se phantomjs potesse restituire una spiegazione dettagliata del motivo per cui questo non è riuscito.
naoko

7
Scimmie sacre. Vorrei che l'errore SSL fosse spiegato, solo l'overflow dello stack e l'unicorno rosa mi hanno aiutato a rintracciare la causa principale. Grazie ragazzi
SimplGy

Sono contento che questo aiuti le persone. Forse PhantomJS avrà bisogno di un aggiornamento per fornire errori SSL dettagliati con un altro argomento della riga di comando. So che le informazioni sugli errori SSL sono disponibili in Qt, ma la maggior parte delle volte le persone sopprimono semplicemente gli errori senza gestirli esplicitamente.
Cameron Tinker

So di essere in ritardo per il gioco, ma ho scoperto che l'aggiunta dell'opzione dopo il nome dello script non ha funzionato - devi chiamarla in ordine:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

Sì, l' --ignore-ssl-errors=yesopzione dovrebbe precedere il nome dello script. Grazie per averlo fatto notare.
Cameron Tinker

71

Si noti che a partire dal 16-10-2014, PhantomJS utilizza per impostazione predefinita SSLv3 per aprire le connessioni HTTPS. Con la vulnerabilità POODLE recentemente annunciata, molti server stanno disabilitando il supporto SSLv3.

Per aggirare questo problema, dovresti essere in grado di eseguire PhantomJS con:

phantomjs --ssl-protocol=tlsv1

Si spera che PhantomJS venga aggiornato presto per rendere TLSv1 l'impostazione predefinita invece di SSLv3.


4
La versione 1.9.8 cambia l'impostazione predefinita in TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs

Risolto il problema per me, SSLv3 era disabilitato sul server
Chris Herring

2
Nota che l'aggiornamento a PhantomJS 1.9.8 porta a un nuovo bug .
Artjom B.

Questa dovrebbe essere la risposta accettata. Disabilitare SSL o consentire qualsiasi protocollo non sono buone soluzioni secondo me. Grazie per la condivisione.
Dominic P

3
Come posso ottenere un debug più dettagliato dai problemi di handshake SSL?
wrschneider

24

ha riscontrato lo stesso problema ...
--ignore-ssl-errors = sì non è stato sufficiente per risolverlo, ho dovuto fare altre due cose:
1) cambiare user-agent
2) ho provato tutti i protocolli ssl, l'unico che ha funzionato era tlsv1 per la pagina in questione
Spero che questo aiuti ...


2
Cambiare i protocolli ssl in tlsv1 ha funzionato anche per me, grazie!
Dave Stibrany

1
+1 Risolto il mio problema, fortunato che non sei qui con me perché vorrei baciarti adesso lol, saluti
Martin,

Questo è esattamente ciò di cui avevo bisogno. Grazie mille! Invece di tlsv1 ho usato "any" e anche questo funziona. (sembra un po 'più sicuro dovrei visitare altri siti Web SSL.
user1841243

1
cambiare user-agent in cosa?
Lucas Steffen

15

Ho riscontrato lo stesso problema (casperjs 1.1.0-beta3 / phantomjs 1.9.7). L'utilizzo di --ignore-ssl-errors = yes e --ssl-protocol = tlsv1 lo ha risolto. L'utilizzo di una sola delle opzioni non ha risolto il problema.


Questo trucco ha risolto il mio problema su codeship CI, eseguendo una suite phantomjs + behat (dopo circa 10 ore di debug e prove)
ZeNC

si. dopo alcune sciocche ore il tuo commento ha fatto la mia giornata!
Yarimadam,

1

Stavo ricevendo

Errore durante la creazione del contesto SSL "da phantomJS (in esecuzione su CentOS 6.6)

La compilazione dalla sorgente ha risolto il problema per me. Non dimenticare di usare i phantomj che hai costruito. (invece di / usr / local / bin / phantomjs se ce l'hai)

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
Non so perché le persone valutano negativamente la tua risposta. Dopo aver provato tutte le soluzioni sopra menzionate e giorni di lotta, questa è l'unica soluzione che ha funzionato per me. phantomJS è abbastanza fastidioso da compilare a causa di qt, ma ne vale la pena.
FlorianB

0

Se qualcuno sta usando Phantomjs con Sahi, l' --ignore-ssl-errorsopzione deve andare nel tuo file browser_types.xml. Ha funzionato per me.

<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

Di cosa shebang?

Se stai usando shebang per eseguire phantomjsscript, usa la seguente riga shebang

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

// ... rest of your script

Usa una delle risposte precedenti. personalmente mi piace --ignore-ssl-errors=yespoiché è irrilevante convalidare il certificato autofirmato dei miei server web di loopback.


0

Nessuna delle altre risposte qui mi ha aiutato; è possibile che i siti specifici con cui stavo lavorando fossero troppo esigenti con le loro intestazioni HTTP. Questo è ciò che ha funzionato:

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

Ho scoperto che PhantomJS stava usando "Keep-Alive" (in maiuscolo) e la connessione non veniva mantenuta in vita. :)


0

Stavo ottenendo SSL Handshake Failedieri. Ho provato molte combinazioni di opzioni phantomJS ( --ignore-ssl-errors=yesecc.), Ma nessuna ha funzionato.

L'aggiornamento a phantomJS 2.1.1 lo ha risolto.

Ho usato le istruzioni di installazione di phantomJS su https://gist.github.com/julionc/7476620 , cambiando la versione di phantomJS a 2.1.1.


0

Sulla macchina su cui stai tentando di eseguire phantomjs per connetterti a un server remoto, esegui "openssl ciphers". Copia e incolla i codici elencati nell'opzione della riga di comando --ssl-ciphers = "". Questo dice al server web di connessione quali cifrari sono disponibili da usare per comunicare con il tuo client. Se non imposti quelli disponibili sulla tua macchina, può usare qualsiasi cifratura che la tua macchina non capisca che i browser moderni predefiniti lo fanno che vengono utilizzati per l'impostazione predefinita.


-2

L'unica cosa che ha funzionato per me è stato aumentare phantomjs da 1.9x a 2.x;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.