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,发现即使我没有继续解决这个问题,也不能停止玩耍。

4

12 回答 12

154

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

phantomjs --ssl-protocol=any test.js

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

于 2014-07-10T14:24:22.553 回答
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 _ 我希望这有帮助。

于 2012-08-31T17:53:08.460 回答
71

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

为了解决这个问题,您应该能够运行 PhantomJS:

phantomjs --ssl-protocol=tlsv1

希望 PhantomJS 将很快更新以使 TLSv1 成为默认设置,而不是 SSLv3。

于 2014-10-17T04:00:05.287 回答
24

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

于 2013-06-14T05:20:58.767 回答
16

我遇到了同样的问题(casperjs 1.1.0-beta3/phantomjs 1.9.7)。使用 --ignore-ssl-errors=yes 和 --ssl-protocol=tlsv1 解决了它。仅使用其中一个选项并没有为我解决问题。

于 2014-12-08T10:35:30.030 回答
1

我收到

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

从源头构建为我修复了它。不要忘记使用您构建的 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>
于 2015-04-07T17:02:16.100 回答
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>
于 2014-01-25T14:44:47.010 回答
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 服务器的自签名证书是无关紧要的。

于 2016-02-17T07:49:42.210 回答
0

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

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

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

于 2017-12-09T20:12:04.793 回答
0

SSL Handshake Failed我昨天得到了。我尝试了许多 phantomJS 选项(--ignore-ssl-errors=yes等)的组合,但没有一个起作用。

升级到 phantomJS 2.1.1 修复了它。

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

于 2018-01-03T20:57:44.650 回答
0

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

于 2018-12-11T00:49:07.487 回答
-2

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

于 2018-10-12T10:17:31.950 回答