4

この投稿は、Rails 4 や Ruby 2 など、他の多くの投稿とほとんど同じです Net/HTTP SSL Request: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol and SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failedが、重要な違いが 1 つあります。「certificate verify failed」エラーは、SSL プロキシ ( Charles ) を介してプロキシされた場合にのみ発生し、最新バージョンでのみ発生します。ルビーの。

具体的には、次の (プロキシされていない) コードが機能します。

  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, nil)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

そして、この(プロキシされた)コードは「証明書の検証に失敗しました」というエラーで失敗します:

  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, "localhost", 8888)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

パズル

このエラーは、現在のバージョンの Ruby/OpenSSL でプロキシを通過する場合にのみ表示されます。特に:

  • プロキシを経由しない場合はエラーが発生しないため、ローカル証明書が有効であると考えられます。
  • Firefox または でプロキシを通過してもエラーは発生しないcurl -v https://www.ibm.com/ため、Charles 証明書は有効であると考えられます。
  • 以前のバージョンの Ruby / OpenSSL でプロキシを通過してもエラーは発生しません (2 つの環境については以下を参照してください)。

これらすべてのことから、証明書の問題ではなく、実際の Ruby のバグを疑うようになりますが、そうでないことが示されれば幸いです。

現在の環境

この環境でエラーを観察しています:

$ system_profiler SPSoftwareDataType | grep "System Version"
    System Version: OS X 10.8.5 (12F45)
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p247 (2013-06-27) [x86_64-darwin12.4.0]
OpenSSL 1.0.1e 11 Feb 2013
http-cookie (1.0.2)
http_router (0.10.2)
net-http-digest_auth (1.4)
net-http-persistent (2.9)
ntlm-http (0.1.1)

以前の環境

少し古いバージョンの ruby​​/OpenSSL では、エラーは表示されません。

$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin10.8.0]
OpenSSL 0.9.8y 5 Feb 2013
http_router (0.11.0, 0.10.2)
httpauth (0.2.0)
net-http-digest_auth (1.2.1)
net-http-persistent (2.8)
ntlm-http (0.1.1)
4

2 に答える 2

2

ここで起こっていることは、Charles が " https://www.ibm.com " の有効な証明書を提供できないということです。 「www.ibm.com」の名前であり、信頼できる認証局によって認定されています。そのため、クライアントが証明書を検証すると接続が失敗し、検証をスキップすると接続が機能します

http.verify_mode = OpenSSL::SSL::VERIFY_NONE

「net/https」は最近になってデフォルトで証明書を検証するように調整されたため、古いバージョンの ruby​​ で動作した可能性があります。

于 2014-01-05T22:11:49.930 に答える
0

ENV変数でその証明書を指す必要があることを思い出したようです。検証にあまり関心がない場合は、次のようにする方が簡単です。

http.verify_mode = OpenSSL::SSL::VERIFY_NONE
于 2013-10-20T02:02:45.130 に答える