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