2

この問題を解決するためにあらゆることを試しましたが、何も機能しません。すべてをアンインストールして再インストールしました。まだ愛はありません。Evernote API に接続しようとすると、次のエラーが表示されます。

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

私は実行しています: RVM 1.15.9
Ruby 1.9.3-p194
OpenSSL 1.0.1c
Rails 3.2.8
Homebrew 0.9.3

私は文字通りすべてを試しました。このガイドに従ってくださいhttp://railsapps.github.com/openssl-certificate-verify-failed.html

Evernote API を使おうとしたことから、すべてが始まりました。cURL は、HTTPS アドレスへの ping で正常に動作します。乾杯。

4

1 に答える 1

3

SSL v2 と v3 の間の問題である可能性があります。

コマンドライン診断:

これを診断するには、コマンド ラインでこれを試してください。

$ openssl s_client -connect sandbox.evernote.com:443

コマンドは次のように失敗する場合があります。

CONNECTED(00000003)
140386475906720:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure
...

SSL3だけで試してみてください:

openssl s_client -no_tls1 -no_ssl2 -ssl3 -connect  sandbox.evernote.com:443

次のような結果が必要です。

CONNECTED(00000003)
depth=2 C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network
...

最初のコマンドが失敗し、2 番目のコマンドが成功する場合、問題は SSL2 対 SSL3 である可能性が非常に高くなります。

ルビー診断:

#!/usr/bin/env ruby                                                                                                                                                                                                                                                              
require 'net/http'
uri = URI.parse('https://sandbox.evernote.com/')
req = Net::HTTP::Get.new(uri.path)
sock = Net::HTTP.new(uri.host, 443)
sock.use_ssl = true

# Try with default SSL                                                                                                                                                                                                                                                           
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSL default"
rescue
  puts "failure with SSL default"
end

# Try with just SSL3                                                                                                                                                                                                                                                             
sock.ssl_version="SSLv3"
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSLv3"
rescue
  puts "failure with SSLv3"
end

修正方法:

警告: これはハックです。自己責任。誰かがこれを行うより良い方法を見つけた場合は、ここにコメントしてください。

HTTP.new にパッチを適用して、常に SSLv3 を使用するように強制します

require 'net/http'
module Net
  class HTTP < Protocol
    def HTTP.new(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil)
      socket = Proxy(p_addr, p_port, p_user, p_pass).newobj(address, port)
      socket.ssl_version = "SSLv3"
      socket
    end
  end
end

uri = URI.parse('https://sandbox.evernote.com/')
req = Net::HTTP::Get.new(uri.path)
sock = Net::HTTP.new(uri.host, 443)
sock.use_ssl = true

# Try with default SSL                                                                                                                                                                                                                                                           
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSL default"
rescue
  puts "failure with SSL default"
end
于 2012-09-20T15:19:35.070 に答える