PhantomJS ne parvient pas à ouvrir le site HTTPS

104

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

Son échec de charger la page tout le temps. Qu'est-ce qui ne va pas ici? Les sites sécurisés doivent-ils être traités différemment? Le site est cependant accessible avec succès à partir du navigateur.

Je ne fais que commencer avec Phantom en ce moment et je trouve que c'est trop beau pour arrêter de jouer même si je ne vais pas de l'avant avec ce problème.

Sreerag
la source

Réponses:

153

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

phantomjs --ssl-protocol=any test.js

Aussi, je pense qu'il devrait être beaucoup plus sûr à utiliser --ssl-protocol=anycar vous utilisez toujours le cryptage, mais --ignore-ssl-errors=trueignorera (duh) toutes les erreurs ssl, y compris les erreurs malveillantes.

JLarky
la source
1
J'ai dû utiliser ces 3 arguments et cela a résolu: "--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

Le problème est probablement dû à des erreurs de certificat SSL. Si vous démarrez phantomjs avec l' option --ignore-ssl-errors = yes , il devrait procéder au chargement de la page comme il le ferait s'il n'y avait pas d'erreurs SSL:

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

J'ai vu quelques sites Web ayant des problèmes avec la mise en œuvre 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.

Cameron Tinker
la source
2
Merci, cela a également résolu mon problème. Mon cas, je n'ai pas eu d'erreur Cert sur le navigateur, donc c'était très déroutant, mais j'ai curl verbose et j'ai remarqué que celui qui ne fonctionnait pas utilisait Wildcard Cert (c'est-à-dire: CN = *. Example.com). Ce serait bien si phantomjs peut renvoyer une raison détaillée expliquant pourquoi cela a échoué.
naoko
7
Saints singes. Je souhaite que l'erreur SSL soit expliquée, seul le débordement de pile et la licorne rose m'ont aidé à en localiser la cause. Merci les gars
SimplGy
Heureux que cela aide les gens. Peut-être que PhantomJS aura besoin d'une mise à jour pour fournir des erreurs SSL détaillées avec un autre argument de ligne de commande. Je sais que les informations d'erreur SSL sont disponibles dans Qt, mais la plupart du temps, les gens suppriment simplement les erreurs sans les traiter explicitement.
Cameron Tinker
Je sais que je suis en retard au jeu, mais j'ai trouvé que l'ajout de l'option après le nom du script ne fonctionnait pas - vous devez l'appeler dans l'ordre:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds
Oui, l' --ignore-ssl-errors=yesoption doit venir avant le nom du script. Merci de l'avoir signalé.
Cameron Tinker
71

Notez qu'à partir du 16/10/2014, PhantomJS utilise par défaut SSLv3 pour ouvrir les connexions HTTPS. Avec la vulnérabilité POODLE récemment annoncée, de nombreux serveurs désactivent la prise en charge de SSLv3.

Pour contourner cela, 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.

Michée
la source
4
La version 1.9.8 bascule la valeur par défaut sur TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs
Correction du problème pour moi, SSLv3 était désactivé sur le serveur
Chris Herring
2
Notez que la mise à jour vers PhantomJS 1.9.8 entraîne un nouveau bogue .
Artjom B.20
Cela devrait être la réponse acceptée. Désactiver SSL ou autoriser tout protocole ne sont pas de bonnes solutions à mon avis. Merci d'avoir partagé.
Dominic P
3
Comment puis-je obtenir un débogage plus détaillé des problèmes de négociation SSL?
wrschneider
24

rencontré le même problème ...
--ignore-ssl-errors = yes n'était pas suffisant pour le réparer pour moi, j'ai dû faire deux autres choses:
1) changer l'agent utilisateur
2) essayé tous les protocoles ssl, le seul qui fonctionnait était tlsv1 pour la page en question
J'espère que cela aide ...

Fred
la source
2
Changer les protocoles SSL en tlsv1 a également fonctionné pour moi, merci!
Dave Stibrany
1
+1 Correction de mon problème, heureusement que vous n'êtes pas ici avec moi car je vous embrasserais tout de suite lol, bravo
Martin
C'est exactement ce dont j'avais besoin. Merci beaucoup! Au lieu de tlsv1, j'ai utilisé "any" et cela fonctionne également. (semble un peu plus sûr si je dois visiter d'autres sites Web SSL.
user1841243
1
changer user-agent en quoi?
Lucas Steffen
15

J'ai rencontré le même problème (casperjs 1.1.0-beta3 / phantomjs 1.9.7). L'utilisation de --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 permis de résoudre le problème.

Jojje
la source
Cette astuce a résolu mon problème sur la codification CI, en exécutant une suite phantomjs + behat (après ~ 10 heures de débogage et d'essais)
ZeNC
Ouais. après quelques heures stupides ton commentaire a fait ma journée!
Yarimadam le
1

Je recevais

Erreur lors de la création du contexte SSL "à partir de phantomJS (fonctionnant sous CentOS 6.6)

Construire à partir de la source l'a corrigé pour moi. N'oubliez pas d'utiliser les phantomjs que vous avez créés. (au lieu de / usr / local / bin / phantomjs si vous l'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>
Mert Değirmenci
la source
1
Je ne sais pas pourquoi les gens évaluent votre réponse négativement. Après avoir essayé toutes les solutions mentionnées ci-dessus et des jours de lutte, c'est la seule solution qui a fonctionné pour moi. phantomJS est assez ennuyeux à compiler à cause de qt, mais ça vaut le coup.
FlorianB
0

Si quelqu'un utilise Phantomjs avec Sahi, l' --ignore-ssl-errorsoption doit aller 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>
ctasca
la source
0

Et quoi shebang?

Si vous utilisez shebang pour exécuter des phantomjsscripts, 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. J'aime personnellement --ignore-ssl-errors=yescar il n'est pas pertinent de valider le certificat auto-signé de mes serveurs Web de bouclage.

Jossef Harush
la source
0

Aucune des autres réponses ici ne m'a aidé; il se peut que le ou les sites spécifiques avec lesquels je travaillais soient trop pointilleux 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. :)

JstnPwll
la source
0

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

La mise à niveau vers phantomJS 2.1.1 l'a corrigé.

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

VikR
la source
0

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

Bord de Bobby
la source
-2

La seule chose qui a fonctionné pour moi a été de faire passer les phantomjs de 1.9x à 2.x;)

giorgio79
la source