web-dev-qa-db-ja.com

PhantomJSがHTTPSサイトを開けない

Loadspeed.jsの例に基づいた次のコードを使用して、httpサーバー認証も必要なhttps://サイトを開きます。

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から始めており、この問題を前に進めていませんが、遊んでいるのをやめるにはあまりにも良いと思います。

103
Sreerag

フレッドとキャメロンティンカーの答えを試しましたが、-ssl-protocol = anyオプションのみが私を助けているようです:

phantomjs --ssl-protocol=any test.js

また、暗号化を使用しているので--ssl-protocol=anyを使用する方がずっと安全だと思いますが、--ignore-ssl-errors=trueは悪意のあるものを含むすべてのsslエラーを無視します(duh)。

151
JLarky

この問題は、おそらくSSL証明書エラーが原因です。 -ignore-ssl-errors = yesオプションを指定してphantomjsを起動すると、SSLがなかった場合と同様にページの読み込みに進む必要がありますエラー:

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

SSL証明書を誤って実装したり、有効期限が切れたりするなどの問題を抱えているWebサイトがいくつかあります。phantomjsのコマンドラインオプションの完全なリストは、こちらから入手できます。 http://phantomjs.org/api/ command-line.html 。これがお役に立てば幸いです。

121
Cameron Tinker

2014-10-16現在、PhantomJSはデフォルトでSSLv3を使用してHTTPS接続を開くことに注意してください。 POODLEの脆弱性 が最近発表されたため、多くのサーバーがSSLv3サポートを無効にしています。

それを回避するには、PhantomJSを次のコマンドで実行できる必要があります。

phantomjs --ssl-protocol=tlsv1

願わくば、TLSv1をSSLv3ではなくデフォルトにするために、PhantomJSがすぐに更新されることを願っています。

71
Micah

同じ問題が発生しました...
-ignore-ssl-errors = yesはそれを修正するのに十分ではなく、さらに2つのことをしなければなりませんでした。
1)ユーザーエージェントの変更
2)すべてのssl-protocolsを試しましたが、問題のページのtlsv1のみが機能しました
お役に立てれば...

24
Fred

同じ問題が発生しました(casperjs 1.1.0-beta3/phantomjs 1.9.7)。 --ignore-ssl-errors = yesおよび--ssl-protocol = tlsv1を使用して解決しました。オプションの1つだけを使用しても、解決できませんでした。

15
Jojje

受けていた

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

SahiでPhantomjsを使用している場合、--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
ctasca

昨日SSL Handshake Failedを取得していました。 phantomJSオプションの多くの組み合わせ(--ignore-ssl-errors=yesなど)を試しましたが、どれも機能しませんでした。

PhantomJS 2.1.1へのアップグレードにより修正されました。

https://Gist.github.com/julionc/747662 でphantomJSインストール手順を使用し、phantomJSバージョンを2.1.1に変更しました。

0
VikR

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
Jossef Harush

Phantomjsを実行してリモートサーバーに接続しようとしているマシンで、「openssl ciphers」を実行します。リストされた暗号をコピーして、-ssl-ciphers = ""コマンドラインオプションに貼り付けます。これにより、接続するWebサーバーに、クライアントとの通信に使用できる暗号がわかります。自分のマシンで使用可能なものを設定しない場合、デフォルトの最新のブラウザがデフォルト設定に使用することをマシンが理解していない暗号を使用できます。

0
Bobby Edge

ここでの他の答えはどれも私を助けませんでした。私が働いていた特定のサイトが、HTTPヘッダーにこだわりすぎていた可能性があります。これがうまくいったものです:

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

PhantomJSが「キープアライブ」(大文字)を使用しており、接続が維持されていないことがわかりました。 :)

0
JstnPwll