Falha do PhantomJS ao abrir site HTTPS

104

Estou usando o seguinte código com base no exemplo loadspeed.js para abrir um site https: // que também requer autenticação de 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();
    });
}  

Não está carregando a página o tempo todo. Oque pode estar errado aqui? Os sites protegidos devem ser tratados de forma diferente? O site pode ser acessado com sucesso pelo navegador.

Estou começando com o Phantom agora e acho que é bom demais para parar de brincar, mesmo que não esteja avançando com esse problema.

Sreerag
fonte

Respostas:

153

Tentei as respostas de Fred e Cameron Tinker, mas apenas --ssl-protocol = qualquer opção parece me ajudar:

phantomjs --ssl-protocol=any test.js

Também acho que deveria ser mais seguro usar --ssl-protocol=anyporque você ainda está usando criptografia, mas --ignore-ssl-errors=trueirá ignorar (duh) todos os erros SSL, incluindo os maliciosos.

JLarky
fonte
1
Eu tive que usar esses 3 argumentos e resolveu: "--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

O problema é provavelmente devido a erros de certificado SSL. Se você iniciar o phantomjs com a opção --ignore-ssl-errors = yes , ele deve continuar a carregar a página como faria se não houvesse erros de SSL:

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

Eu vi alguns sites tendo problemas com a implementação incorreta de seus certificados SSL ou eles expiraram, etc. Uma lista completa de opções de linha de comando para phantomjs está disponível aqui: http://phantomjs.org/api/command-line. html . Eu espero que isso ajude.

Cameron Tinker
fonte
2
Obrigado, isso resolveu meu problema também. No meu caso, não recebi o erro Cert no navegador, por isso foi muito confuso, mas fiz uma curva detalhada e percebi que um que não funcionava estava usando Wildcard Cert (ou seja: CN = *. Example.com). Seria bom se os phantomjs pudessem retornar uma razão detalhada do motivo da falha.
naoko de
7
Macacos sagrados. Gostaria que o erro SSL fosse explicado, apenas o estouro de pilha e o unicórnio rosa me ajudaram a rastrear a causa raiz. Obrigado pessoal
SimplGy
Que bom que isso está ajudando as pessoas. Talvez o PhantomJS precise de uma atualização para fornecer erros verbosos de SSL com outro argumento de linha de comando. Eu sei que as informações de erro SSL estão disponíveis no Qt, mas na maioria das vezes as pessoas simplesmente suprimem os erros sem tratá-los explicitamente.
Cameron Tinker de
Sei que estou atrasado para o jogo, mas descobri que adicionar a opção após o nome do script não funcionou - você precisa chamá-lo em ordem:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds
Sim, a --ignore-ssl-errors=yesopção deve vir antes do nome do script. Obrigado por apontar isto.
Cameron Tinker
71

Observe que em 16/10/2014, o padrão do PhantomJS é usar SSLv3 para abrir conexões HTTPS. Com a vulnerabilidade POODLE anunciada recentemente, muitos servidores estão desativando o suporte SSLv3.

Para contornar isso, você deve ser capaz de executar o PhantomJS com:

phantomjs --ssl-protocol=tlsv1

Esperançosamente, PhantomJS será atualizado em breve para tornar o TLSv1 o padrão em vez de SSLv3.

Micah
fonte
4
A versão 1.9.8 muda o padrão para TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs
Corrigido para mim, SSLv3 foi desativado no servidor
Chris Herring
2
Observe que a atualização para o PhantomJS 1.9.8 leva a um novo bug .
Artjom B.
Esta deve ser a resposta aceita. Desativar SSL ou permitir qualquer protocolo não são boas soluções na minha opinião. Obrigado por compartilhar.
Dominic P
3
Como posso obter uma depuração mais detalhada de problemas de handshake SSL?
wrschneider
24

teve o mesmo problema ...
--ignore-ssl-errors = yes não foi o suficiente para consertar para mim, tive que fazer mais duas coisas:
1) alterar o agente do usuário
2) tentei todos os protocolos SSL, o único que funcionou foi tlsv1 para a página em questão
Espero que isso ajude ...

Fred
fonte
2
Alterar os protocolos SSL para tlsv1 também funcionou para mim, obrigado!
Dave Stibrany
1
+1 Resolvido meu problema, sorte que você não está aqui comigo como eu beijaria você agora lol, saúde
Martin
Isso é exatamente o que eu precisava. Muito obrigado! Em vez de tlsv1, usei "any" e também funciona. (parece um pouco mais seguro se eu visitar outros sites SSL.
user1841243
1
alterar o agente do usuário para o quê?
Lucas Steffen
15

Eu tive o mesmo problema (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Usando --ignore-ssl-errors = yes e --ssl-protocol = tlsv1 resolveu. Usar apenas uma das opções não resolveu para mim.

Jojje
fonte
Este truque corrigiu meu problema no codeship CI, executando um phantomjs + behat suite (após ~ 10 horas de depuração e experimentação)
ZeNC
sim. depois de algumas horas bobas seu comentário fez meu dia!
Yarimadam
1

Eu estava recebendo

Erro ao criar contexto SSL "de phantomJS (rodando em CentOS 6.6)

Construir da fonte consertou para mim. Não se esqueça de usar os phantomjs que você construiu. (em vez de / usr / local / bin / phantomjs se você tiver)

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
fonte
1
Não sei por que as pessoas avaliam sua resposta negativamente. Depois de tentar todas as soluções mencionadas acima, e dias de luta esta é a única solução que funcionou para mim. phantomJS é muito chato de compilar por causa do qt, mas vale a pena.
FlorianB de
0

Se alguém estiver usando Phantomjs com Sahi, a --ignore-ssl-errorsopção precisa ir no arquivo browser_types.xml. Funcionou para mim

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

Sobre o quê shebang?

Se você estiver usando shebang para executar phantomjsscripts, use a seguinte linha shebang

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

// ... rest of your script

Use qualquer uma das respostas acima. Eu pessoalmente gosto, --ignore-ssl-errors=yespois é irrelevante validar o certificado autoassinado dos meus servidores web de loopback.

Jossef Harush
fonte
0

Nenhuma das outras respostas aqui me ajudou; pode ser que os sites específicos com os quais eu estava trabalhando fossem muito exigentes com seus cabeçalhos HTTP. Isso é o que funcionou:

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

Eu descobri que o PhantomJS estava usando "Keep-Alive" (maiúsculo), e a conexão não estava sendo mantida ativa. :)

JstnPwll
fonte
0

Eu estava pegando SSL Handshake Failedontem. Eu tentei muitas combinações de opções phantomJS (--ignore-ssl-errors=yes etc.), mas nenhuma delas funcionou.

Atualizar para o phantomJS 2.1.1 corrigiu isso.

Usei as instruções de instalação do phantomJS em https://gist.github.com/julionc/7476620 , alterando a versão do phantomJS para 2.1.1.

VikR
fonte
0

Na máquina em que você está tentando executar o phantomjs para se conectar a um servidor remoto, execute "openssl ciphers". Copie e cole as cifras listadas na opção de linha de comando --ssl-ciphers = "". Isso informa ao servidor da web que está se conectando quais cifras estão disponíveis para uso na comunicação com seu cliente. Se você não definir os disponíveis em sua própria máquina, ele pode usar qualquer cifra que sua máquina não entenda que os navegadores modernos padrão fazem e que são usados ​​para a configuração padrão.

Bobby Edge
fonte
-2

A única coisa que funcionou para mim foi aumentar os phantomjs de 1.9x para 2.x;)

giorgio79
fonte