PhantomJSがHTTPSサイトを開けない


104

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

回答:


153

私はフレッドとキャメロンティンカーの答えを試しましたが、--ssl-protocol = anyオプションだけが私に役立つようです:

phantomjs --ssl-protocol=any test.js

また--ssl-protocol=any、暗号化をまだ使用しているため、安全に使用できるはずですが--ignore-ssl-errors=true、悪意のあるエラーを含むすべての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証明書の誤った実装や期限切れなどの問題が発生しているWebサイトがいくつかあります。phantomjsのコマンドラインオプションの完全なリストは、http://phantomjs.org/api/command-lineで入手できます。 html。これがお役に立てば幸いです。


2
ありがとう、これで私の問題も解決しました。私の場合、ブラウザーでCertエラーが発生しなかったため、非常に混乱しましたが、詳細なカールを行いましたが、機能しないものはワイルドカード証明書(つまり、CN = *。example.com)を使用していることに気付きました。phantomjsがこれが失敗した理由に関して詳細な理由を返すことができるといいですね。
naoko 2013

7
聖なる猿。SSLエラーが説明されていて、スタックオーバーフローとピンクのユニコーンだけが根本的な原因の追跡に役立ちました。みんなありがとう
SimplGy 2013

これが人々を助けていることをうれしく思います。おそらく、PhantomJSは、別のコマンドライン引数で詳細なSSLエラーを提供するための更新が必要になります。SSLエラー情報がQtで利用できることは知っていますが、ほとんどの場合、明示的に処理せずにエラーを抑制します。
Cameron Tinker

私はゲーム後半だけど、私は、そのオプションを追加した後にスクリプト名が作業をしませんでした-あなたは順番にそれを呼び出す必要があります:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

はい、--ignore-ssl-errors=yesオプションはスクリプト名の前に置く必要があります。これを指摘していただきありがとうございます。
Cameron Tinker、2014年

71

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

これを回避するには、PhantomJSを次のように実行できる必要があります。

phantomjs --ssl-protocol=tlsv1

うまくいけば、PhantomJSが間もなく更新され、SSLv3ではなくTLSv1がデフォルトになります。


4
バージョン1.9.8はデフォルトをTLSv1に切り替えます:github.com/ariya/phantomjs/issues/12670
Andy

私のために修正しました。SSLv3がサーバーで無効にされました
Chris Herring

2
PhantomJS 1.9.8にアップデートすると、新しいバグが発生することに注意してください。
Artjom B.

これは受け入れられる答えになるはずです。SSLを無効にするか、プロトコルを許可することは、私の考えでは良い解決策ではありません。共有いただきありがとうございます。
ドミニクP

3
SSLハンドシェイクの問題からより詳細なデバッグを取得するにはどうすればよいですか?
wrschneider 2015年

24

同じ問題を経験しました...
--ignore-ssl-errors = yesは私にとってそれを修正するのに十分ではなく、さらに2つのことをしなければなりませんでした:
1)user-agentを変更する
2)すべてのssl-protocolsを試しました問題のページのtlsv1でしたこれが役に立てば幸い
...


2
ssl-protocolsをtlsv1に変更することも私にとってうまくいきました、ありがとう!
Dave Stibrany、2013年

1
+1私の問題を修正しました。幸運なことに、今あなたにキスをすることができないので、あなたはここにいませんlol、乾杯
マーティン

これはまさに私が必要としたものです。どうもありがとうございました!tlsv1の代わりに「any」を使用しましたが、これも機能します。(他のssl Webサイトにアクセスした方が少し安全だと思います。
user1841243

1
ユーザーエージェントを何に変更しますか?
Lucas Steffen

15

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


このトリックは、ファントムjs + behatスイートを実行しているコードシップCIの問題を修正しました(〜10時間のデバッグと試行後)
ZeNC

ええ。ばかげた時間の後、あなたのコメントは私の日を作りました!
ヤリマダム2016

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
なぜ人々があなたの答えを否定的に評価するのか私にはわかりません。上記のすべての解決策を試した後、数日の苦労の末、これが私にとって有効な唯一の解決策でした。phantomJSは、qtのためにコンパイルがかなり面倒ですが、それだけの価値はあります。
FlorianB 2016年

0

誰かが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

どうshebangですか?

phantomjsスクリプトの実行にシバンを使用している場合は、次のシバン行を使用します

#!/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 ciphers」を実行します。リストされている暗号をコピーして--ssl-ciphers = ""コマンドラインオプションに貼り付けます。これは、クライアントとの通信に使用できる暗号を接続するWebサーバーに通知します。自分のマシンで使用できるものを設定しない場合、マシンは、デフォルトの最新のブラウザがデフォルト設定に使用されていることを理解していない任意の暗号を使用できます。


-2

私のために働いた唯一のものは、phantomjsを1.9xから2.xに上げることでした;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.