web-dev-qa-db-fra.com

PhantomJS ne parvient pas à ouvrir le site HTTPS

J'utilise le code suivant basé sur l'exemple loadspeed.js pour ouvrir un site https: // qui requiert également une authentification du serveur 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();
    });
}  

Il ne parvient pas à charger la page tout le temps. Quel pourrait être le problème ici? Les sites sécurisés doivent-ils être gérés différemment? Le site est accessible avec succès depuis le navigateur.

Je viens juste de commencer avec Phantom pour le moment et je trouve ça trop beau d’arrêter de jouer même si je n’avance pas avec ce problème.

102
Sreerag

J'ai essayé les réponses de Fred et Cameron Tinker, mais seule l'option --ssl-protocol = any semble m'aider:

phantomjs --ssl-protocol=any test.js

Aussi, je pense qu’il devrait être beaucoup plus sûr d’utiliser --ssl-protocol=any puisque vous utilisez toujours le cryptage, mais --ignore-ssl-errors=true ignorera (duh) toutes les erreurs ssl, y compris les malveillantes.

151
JLarky

Le problème est probablement dû à des erreurs de certificat SSL. Si vous démarrez phantomjs avec l'option --ignore-ssl-errors = yes, la page devrait être chargée comme s'il n'y avait pas d'erreur SSL:

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

J'ai vu quelques sites Web avoir des problèmes d'implémentation incorrecte de leurs certificats SSL ou ils ont expiré, etc. Une liste complète des options de ligne de commande pour phantomjs est disponible ici: http://phantomjs.org/api/command- line.html . J'espère que ça aide.

121
Cameron Tinker

Notez que depuis le 2014-10-16, PhantomJS utilise par défaut SSLv3 pour ouvrir des connexions HTTPS. Avec la vulnérabilité POODLE récemment annoncée, de nombreux serveurs désactivent la prise en charge de SSLv3.

Pour résoudre ce problème, vous devriez pouvoir exécuter PhantomJS avec:

phantomjs --ssl-protocol=tlsv1

Espérons que PhantomJS sera bientôt mis à jour pour faire de TLSv1 la valeur par défaut au lieu de SSLv3.

71
Micah

connu le même problème ...
-- ignore-ssl-errors = yes n'était pas suffisant pour résoudre le problème pour moi.
1) changer d'utilisateur-agent
2) a essayé tous les protocoles ssl, le seul qui a fonctionné était tlsv1 pour la page en question.
J'espère que cela t'aides...

24
Fred

J'ai rencontré le même problème (casperjs 1.1.0-beta3/phantomjs 1.9.7). Utiliser --ignore-ssl-errors = yes et --ssl-protocol = tlsv1 a résolu le problème. L'utilisation d'une seule des options ne m'a pas résolu le problème.

15
Jojje

Je recevais 

Erreur lors de la création du contexte SSL "à partir de phantomJS (exécuté sur CentOS 6.6)

Construire à partir de la source l'a corrigé pour moi. N'oubliez pas d'utiliser les fantômes que vous avez construits. (au lieu de/usr/local/bin/phantomjs si vous en avez)

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
Mert Değirmenci

Si quelqu'un utilise Phantomjs avec Sahi, l'option --ignore-ssl-errors doit figurer dans votre fichier browser_types.xml. Cela a fonctionné pour moi.

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

Je recevais SSL Handshake Failed hier. J'ai essayé beaucoup de combinaisons d'options phantomJS (--ignore-ssl-errors=yes etc.), mais aucune d'entre elles n'a fonctionné.

La mise à niveau vers phantomJS 2.1.1 a corrigé le problème. 

J'ai utilisé les instructions d'installation de phantomJS sur https://Gist.github.com/julionc/7476620 , en modifiant la version de phantomJS en 2.1.1.

0
VikR

Qu'en est-il de Shebang?

Si vous utilisez Shebang pour exécuter des scripts phantomjs, utilisez la ligne Shebang suivante

#!/usr/bin/phantomjs --ignore-ssl-errors=yes

var system = require('system');
var webpage = require('webpage');

// ... rest of your script

Utilisez l’une des réponses ci-dessus. Personnellement, j'aime bien --ignore-ssl-errors=yes car il est inutile de valider le certificat auto-signé de mes serveurs Web en boucle.

0
Jossef Harush

Sur la machine sur laquelle vous essayez d'exécuter phantomjs pour vous connecter à un serveur distant, exécutez "algorithmes de chiffrement openssl". Copiez et collez les chiffrements répertoriés dans l’option de ligne de commande --ssl-ciphers = "". Cela indique au serveur Web qui se connecte quels chiffrements sont disponibles pour communiquer avec votre client. Si vous ne définissez pas ceux disponibles sur votre propre ordinateur, celui-ci peut utiliser n'importe quel chiffrement que votre ordinateur ne comprend pas que les navigateurs modernes par défaut utilisent pour le réglage par défaut.

0
Bobby Edge

Aucune des autres réponses ici ne m'a aidé; il se peut que le ou les sites spécifiques avec lesquels je travaillais aient été trop difficiles avec leurs en-têtes HTTP. C'est ce qui a fonctionné:

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

J'ai découvert que PhantomJS utilisait "Keep-Alive" (en majuscule) et que la connexion n'était pas maintenue en vie. :)

0
JstnPwll