2016-07-17 5 views
2

私はMechanizeを使用してサイトをスクラップし、ホスト名の不一致に関連するエラーを取得しています。私は問題の根本が、私が掻いているサイトでSNIが使用されていることを発見しました。正しい証明書が使用されていることを確認するためにホスト名を指定したいと思います。Mechanize Hostname Matching

OpenSSL::SSL::SSLSocket.hostname = "website.com" 

が、このことが可能です:

agent = Mechanize.new 
agent.user_agent = custom_user_agent 
agent.verify_mode = OpenSSL::SSL::VERIFY_PEER 

page = agent.get "website.com" 

そして、ここでは私が使用され、正しい証明書を確認するために追加(またはこれらの線に沿って何か)する必要があると思うものです:

は、ここに私の現在の設定ですMechanizeで行うか、手動で使用する証明書を指定する方法を理解する必要がありますか?

私はVERIFY_NONEソリューションについて認識していますが、導入した脆弱性を考慮して回避することをお勧めします。

+1

OpenSSL 1.0.2以下は***ではありません***はホスト名の一致を実行します。 cURLやMechanizeなどのアプリケーションは、マッチングを実行する必要があります。 [OpenSSL 1.1.0はそれを実装する予定です](http://wiki.openssl.org/index.php/Hostname_validation)。あなたがホスト名に合った問題を抱えているなら、この時点でMechanizeから確実に来ます。 SNIはTLS機能なので、TLS 1.0以上を使用していることを確認してください。私はあなたの問題がMecahanize(またはRuby)であると推測しています* SNIを使用していません*です。 – jww

+0

@jww Mechanizeで設定する方法はないようです。あなたはSNIをサポートするために、そうするか、あるいは、代わりにMechanizeに気づいていますか? –

+1

多分(私はRubyやMechanizeの開発者ではない)[RubyのTLSコンテキストオプションを設定する方法(OpenSSL :: SSL :: SSL_OP_NO_SSLv2のように)](http://stackoverflow.com/q/22550213)と[ OpenSSL :: SSL :: SSLError:hostnameがサーバー証明書と一致しません](http://stackoverflow.com/q/23190868)。呼び出される必要があるOpenSSL関数は['SSL_set_tlsext_host_name'](http://wiki.openssl.org/index.php/SSL/TLS_Client)ですが、Rubyが呼び出す場合にはわかりません。 – jww

答えて

1

ホスト名を指定したり、ホスト名をMechanizeで確認する必要はありません。

Rubyのネット:: HTTPはあなたのためにそれを処理します。ホスト名の不一致があるかどう

https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L928

にOpenSSL :: SSL :: SSLError例外が発生します。

+0

興味深い。したがって、ホスト名の不一致の問題はランダムに発生し、SNIの問題がその原因になると聞きました。ホスト名の指定が問題でない場合は、この問題のデバッグ方法について知っていますか? –

+0

Rubyを削除したい場合は、opensslを使ってそれをデバッグすることができます。正しいSNI設定は 'openssl s_client -connect example.com:443'で失敗し、' -servername example.com'を指定すると成功します。 一貫してまたは断続的に障害が発生する場合は、サーバーに問題があります。サーバーを制御していないと仮定すると、所有者/管理者と連絡を取り、SSLセットアップを修正するよう依頼することができます。 –

+0

Mechanizeでは断続的にしか失敗しないようです。私はopensslを使ったときにエラーを認識しました: 'verifyエラー:num = 19:証明書チェーンの自己署名証明書'。これはMechanizeで断続的な失敗を引き起こすでしょうか? –