PhantomJS无法打开HTTPS站点


104

我正在使用以下基于loadspeed.js示例的代码来打开一个https://站点,该站点也需要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();
    });
}  

它一直无法加载页面。这有什么问题吗?安全站点的处理方式是否有所不同?虽然可以从浏览器成功访问该站点。

我现在只是从Phantom开始,即使我没有解决这个问题,也觉得无法停止游戏实在太好了。

Answers:


153

我尝试了Fred和Cameron Tinker的答案,但是只有--ssl-protocol = any选项似乎可以帮助我:

phantomjs --ssl-protocol=any test.js

另外,我认为使用它应该更安全,--ssl-protocol=any因为您仍在使用加密,但是--ignore-ssl-errors=true会忽略(duh)所有ssl错误,包括恶意错误。


1
我不得不使用这3个参数,并且解析为:“-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

该问题很可能是由于SSL证书错误所致。如果使用--ignore-ssl-errors = yes选项启动phantomjs ,则应该像没有SSL错误一样继续加载页面:

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

我见过一些网站在错误地实施SSL证书或证书过期等问题。有关phantomjs命令行选项的完整列表,请参见:http ://phantomjs.org/api/command-line 。 html。我希望这有帮助。


2
谢谢,这也解决了我的问题。在我的情况下,我没有在浏览器上看到Cert错误,因此非常混乱,但是我花了很多时间,并注意到一个不起作用的方法是使用通配符Cert(即:CN = *。example.com)。如果phantomjs可以返回有关失败原因的详细原因,那将是很好的。
naoko 2013年

7
神圣的猴子。我希望能够解释SSL错误,只有堆栈溢出和粉红色的独角兽可以帮助我找到根本原因。谢谢大家
SimplGy 2013年

很高兴这在帮助人们。也许PhantomJS需要更新才能使用另一个命令行参数提供详细的SSL错误。我知道Qt中提供了SSL错误信息,但是大多数情况下,人们只是隐瞒错误而未明确处理它们。
卡梅隆·廷克

我知道我迟到了,但是我发现在脚本名称添加选项不起作用-您需要按以下顺序调用它:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds 2014年

是的,该--ignore-ssl-errors=yes选项应位于脚本名称之前。感谢您指出这一点。
卡梅隆·廷克

71

请注意,自2014年10月16日起,PhantomJS默认使用SSLv3打开HTTPS连接。随着最近宣布的POODLE漏洞,许多服务器正在禁用SSLv3支持。

为了解决这个问题,您应该能够使用以下命令运行PhantomJS:

phantomjs --ssl-protocol=tlsv1

希望PhantomJS即将更新,以使TLSv1成为默认的,而不是SSLv3。


4
版本1.9.8
Andy Triggs

为我修复了此问题,服务器上禁用了SSLv3
Chris Herring 2014年

2
请注意,更新到PhantomJS 1.9.8会导致一个新的错误
Artjom B. 2014年

这应该是公认的答案。在我看来,禁用SSL或允许任何协议都不是好的解决方案。感谢分享。
Dominic P

3
如何从SSL握手问题中获取更多详细的调试信息?
wrschneider 2015年

24

遇到过同样的问题...
--ignore-ssl-errors = yes还不足以为我修复它,还必须做两件事:
1)更改用户代理
2)尝试了所有ssl协议,这是唯一可行的是问题页面的tlsv1,
希望对您有所 帮助...


2
将ssl协议更改为tlsv1也对我有用,谢谢!
Dave Stibrany

1
+1解决了我的问题,幸运的是你不在我身边,我现在会亲吻你,哈哈,干杯
Martin

这正是我所需要的。非常感谢你!我没有使用tlsv1,而是使用了“ any”,并且效果也不错。(似乎有点更安全,我应该访问其他SSL的网站。
user1841243

1
将用户代理更改为什么?
卢卡斯·斯特芬

15

我遇到了同样的问题(casperjs 1.1.0-beta3 / phantomjs 1.9.7)。使用--ignore-ssl-errors = yes和--ssl-protocol = tlsv1可解决此问题。仅使用其中一种选项并不能解决我的问题。


这个技巧解决了我在代码船CI上的问题,运行了phantomjs + behat套件(经过约10个小时的调试和尝试后)
ZeNC 2016年

是的 愚蠢的几个小时后,您的评论让我高兴!
Yarimadam

1

我正在收到

从phantomJS创建SSL上下文时出错”(在CentOS 6.6上运行)

从源代码构建为我修复。不要忘记使用您构建的phantomjs。(如果有的话,而不是/ usr / local / bin / phantomjs)

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
我不知道为什么人们对您的回答给予负面评价。在尝试了上述所有解决方案之后,经过几天的努力,这是唯一对我有用的解决方案。由于qt,phantomJS非常令人讨厌,但是值得这么做。
FlorianB

0

如果有人将Phantomjs与Sahi一起使用,则该--ignore-ssl-errors选项需要进入您的browser_types.xml文件。它为我工作。

<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

shebang

如果您使用shebang执行phantomjs脚本,请使用以下shebang行

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

// ... rest of your script

使用以上任何答案。我个人喜欢,--ignore-ssl-errors=yes因为与验证环回Web服务器的自签名证书无关。


0

这里没有其他答案对我有帮助。可能是我正在使用的特定站点的HTTP标头过于挑剔。这是有效的:

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

我发现PhantomJS正在使用“ Keep-Alive”(大写),并且连接没有保持活动状态。:)


0

SSL Handshake Failed昨天到。我尝试了phantomJS选项(--ignore-ssl-errors=yes等等)的许多组合,但是它们都不起作用。

升级到phantomJS 2.1.1可以修复它。

我在https://gist.github.com/julionc/7476620上使用了phantomJS安装说明,将phantomJS版本更改为2.1.1。


0

在您要运行phantomjs来连接到远程服务器的计算机上,运行“ openssl密码”。将列出的密码复制并粘贴到--ssl-ciphers =“”命令行选项中。这告诉正在连接的Web服务器哪些密码可用于与客户端通信。如果您未在自己的计算机上设置可用的密码,则它可以使用您的计算机无法理解的默认默认现代浏览器所使用的任何密码。


-2

唯一对我有用的是将phantomjs从1.9x升级到2.x;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.