PhantomJS no puede abrir el sitio HTTPS

104

Estoy usando el siguiente código basado en el ejemplo de loadpeed.js para abrir un sitio https: // que también requiere autenticación del servidor 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();
    });
}  

No carga la página todo el tiempo. ¿Qué podría estar mal aquí? ¿Los sitios seguros deben manejarse de manera diferente? Sin embargo, se puede acceder al sitio con éxito desde el navegador.

Estoy empezando con Phantom en este momento y me parece demasiado bueno para dejar de jugar aunque no estoy avanzando con este problema.

Sreerag
fuente

Respuestas:

153

Probé las respuestas de Fred y Cameron Tinker, pero solo --ssl-protocol = cualquier opción parece ayudarme:

phantomjs --ssl-protocol=any test.js

También creo que debería ser mucho más seguro de usar --ssl-protocol=anyya que todavía está usando cifrado, pero --ignore-ssl-errors=trueignorará (duh) todos los errores ssl, incluidos los maliciosos.

JLarky
fuente
1
Tuve que usar estos 3 argumentos y se resolvió: "--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

Lo más probable es que el problema se deba a errores del certificado SSL. Si inicia phantomjs con la opción --ignore-ssl-errors = yes , debería proceder a cargar la página como lo haría si no hubiera errores SSL:

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

He visto algunos sitios web que tienen problemas con la implementación incorrecta de sus certificados SSL o que han expirado, etc. Una lista completa de opciones de línea de comando para phantomjs está disponible aquí: http://phantomjs.org/api/command-line. html . Espero que esto ayude.

Cameron Tinker
fuente
2
Gracias, esto también resolvió mi problema. En mi caso, no obtuve el error de Cert en el navegador, por lo que fue muy confuso, pero hice un curl detallado y noté que uno que no funcionaba estaba usando Wildcard Cert (es decir, CN = *. Example.com). Sería bueno si phantomjs pudiera devolver una razón detallada de por qué esto ha fallado.
naoko
7
Santos monos. Ojalá se explicara el error de SSL, solo el desbordamiento de la pila y el unicornio rosa me ayudaron a rastrear la causa raíz. Gracias chicos
SimplGy
Me alegro de que esto esté ayudando a la gente. Quizás PhantomJS necesite una actualización para proporcionar errores detallados de SSL con otro argumento de línea de comando. Sé que la información de error de SSL está disponible en Qt, pero la mayoría de las veces la gente simplemente suprime los errores sin manejarlos explícitamente.
Cameron Tinker
Sé que llego tarde al juego, pero descubrí que agregar la opción después del nombre del script no funcionó; debes llamarlo en orden:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds
Sí, la --ignore-ssl-errors=yesopción debe ir antes del nombre del script. Gracias por señalar esto.
Cameron Tinker
71

Tenga en cuenta que a partir del 16 de octubre de 2014, PhantomJS utiliza de forma predeterminada SSLv3 para abrir conexiones HTTPS. Con la vulnerabilidad POODLE anunciada recientemente, muchos servidores están deshabilitando el soporte SSLv3.

Para evitar eso, debería poder ejecutar PhantomJS con:

phantomjs --ssl-protocol=tlsv1

Con suerte, PhantomJS se actualizará pronto para que TLSv1 sea el predeterminado en lugar de SSLv3.

Miqueas
fuente
4
La versión 1.9.8 cambia el valor predeterminado a TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs
Me lo arregló, SSLv3 estaba deshabilitado en el servidor
Chris Herring
2
Tenga en cuenta que la actualización a PhantomJS 1.9.8 conduce a un nuevo error .
Artjom B.
Esta debería ser la respuesta aceptada. En mi opinión, deshabilitar SSL o permitir cualquier protocolo no son buenas soluciones. Gracias por compartir.
Dominic P
3
¿Cómo puedo obtener una depuración más detallada de los problemas de protocolo de enlace SSL?
wrschneider
24

experimenté el mismo problema ...
--ignore-ssl-errors = sí no fue suficiente para solucionarlo, tuve que hacer dos cosas más:
1) cambiar el agente de usuario
2) probé todos los protocolos ssl, el único que funcionó era tlsv1 para la página en cuestión
Espero que esto ayude ...

Fred
fuente
2
Cambiar los protocolos ssl a tlsv1 también funcionó para mí, ¡gracias!
Dave Stibrany
1
+1 Arreglado mi problema, afortunadamente no estás aquí conmigo, ya que te besaría ahora mismo jajaja, salud
Martin
Esto es exactamente lo que necesitaba. ¡Muchas gracias! En lugar de tlsv1 utilicé "any" y esto también funciona. (Parece un poco más seguro si visitara otros sitios web ssl.
user1841243
1
cambiar el agente de usuario a qué?
Lucas Steffen
15

Experimenté el mismo problema (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Usar --ignore-ssl-errors = yes y --ssl-protocol = tlsv1 lo resolvió. Usar solo una de las opciones no me resolvió.

Jojje
fuente
Este truco solucionó mi problema en el codificador CI, ejecutando una suite phantomjs + behat (después de ~ 10 horas de depuración y
prueba
Si. ¡Después de algunas horas tontas tu comentario me alegró el día!
Yarimadam
1

Estaba recibiendo

Error al crear el contexto SSL "desde phantomJS (que se ejecuta en CentOS 6.6)

Construir desde la fuente lo arregló para mí. No olvide utilizar los phantomjs que creó. (en lugar de / usr / local / bin / phantomjs si lo tiene)

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
fuente
1
No sé por qué la gente califica negativamente tu respuesta. Después de probar todas las soluciones mencionadas anteriormente y días de lucha, esta es la única solución que funcionó para mí. phantomJS es bastante molesto de compilar debido a qt, pero vale la pena.
FlorianB
0

Si alguien está usando Phantomjs con Sahi, la --ignore-ssl-errorsopción debe ir en su archivo browser_types.xml. Funcionó para mí.

<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
fuente
0

¿Qué hay de shebang?

Si está usando shebang para ejecutar phantomjsscripts, use la siguiente línea shebang

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

// ... rest of your script

Utilice cualquiera de las respuestas anteriores. Personalmente me gusta, --ignore-ssl-errors=yesya que es irrelevante validar el certificado autofirmado de mis servidores web loopback.

Jossef Harush
fuente
0

Ninguna de las otras respuestas aquí me ayudó; puede ser que los sitios específicos con los que estaba trabajando fueran demasiado exigentes con sus encabezados HTTP. Esto es lo que funcionó:

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

Descubrí que PhantomJS estaba usando "Keep-Alive" (en mayúsculas), y la conexión no se mantenía viva. :)

JstnPwll
fuente
0

Estaba recibiendo SSL Handshake Failedayer. Probé muchas combinaciones de opciones de phantomJS ( --ignore-ssl-errors=yesetc.), pero ninguna funcionó.

La actualización a phantomJS 2.1.1 lo solucionó.

Usé las instrucciones de instalación de phantomJS en https://gist.github.com/julionc/7476620 , cambiando la versión de phantomJS a 2.1.1.

VikR
fuente
0

En la máquina en la que está intentando ejecutar phantomjs para conectarse a un servidor remoto, ejecute "openssl ciphers". Copie y pegue los cifrados enumerados en la opción de línea de comandos --ssl-ciphers = "". Esto le dice al servidor web que se conecta qué cifrados están disponibles para usar para comunicarse con su cliente. Si no configura los que están disponibles en su propia máquina, puede usar cualquier cifrado que su máquina no comprenda que hacen los navegadores modernos predeterminados que se utilizan para la configuración predeterminada.

Bobby Edge
fuente
-2

Lo único que funcionó para mí fue subir phantomjs de 1.9xa 2.x;)

giorgio79
fuente