我正在使用需要TLSv1及更高版本的服务器进行SSL握手。
他们支持的密码是:
TLS_RSA_WITH_AES_256_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
我目前的连接看起来像这样:
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.cert = OpenSSL::X509::Certificate.new(File.read("my.cer"))
http.ca_file = 'their_root.cer'
http.ciphers = ['need-to-figure-out']
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ssl_version = :TLSv1_2
request = Net::HTTP::Post.new(uri.request_uri)
request.body = my_xml
response = http.request(request)
我需要弄清楚Ruby是否支持这些密码,因为我无法使用puts OpenSSL::Cipher.ciphers
方法在列出的密码中找到它们,但是为了建立这种连接,它们是必需的。
此外,是否有人知道我可以更改http.ssl_version = :TLSv1_2
,以使其也允许TLSv3?
感谢您的所有评论。有效的密码是
proxy_request.ciphers = ["AES256-SHA:AES128-SHA:DES-CBC3-SHA"]
它出现在Wireshark中,如
非常感谢你。我注意到我正在给客户"你好",但我从来没有在Wireshark中看到过服务器Hello,这与臭名昭着的错误相吻合
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A
/Users/me/.rbenv/versions/2.1.6/lib/ruby/2.1.0/net/http.rb:927:in `connect'
基于我的wireshark,有没有人知道我做错了什么?
您可以在此问题中更全面地查看我的脚本。提前致谢 API Request - OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A
答案 0 :(得分:1)
他们支持的密码是:
TLS_RSA_WITH_AES_256_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA
和
http.ciphers = ['need-to-figure-out']
您可以使用IANA cipher suite names将OpenSSL cipher string names TLS_RSA_WITH_AES_128_CBC_SHA
映射到openssl ciphers
man page,如AES128-SHA
。它只是一个简单的查找 - 只需在页面中搜索IANA注册表名称,您最终将获得OpenSSL的名称。
我相信你应该使用的密码字符串是:
http.ciphers = ["AES256-SHA:AES128-SHA:DES-CBC3-SHA"]
...有谁知道我可以改变
http.ssl_version = :TLSv1_2
...让它也允许TLSv3?
为此,在OpenSSL中,您需要设置上下文选项。在Ruby中,您需要将OpenSSL::SSL::SSL_OP_NO_SSLv2
设置为OpenSSL::SSL::SSL_OP_NO_TLSv1_1
。这将留下TLS 1.2和TLS 1.3(当TLS 1.3可用时)。另请参阅How to set TLS context options in Ruby (like OpenSSL::SSL::SSL_OP_NO_SSLv2)。
TLS_RSA_WITH_*
方案是RSA密钥传输方案。 TLS 1.3不会提供它们。它们已被删除,有利于提供前瞻性保密的计划。提供前向保密的方案是Diffie-Hellman方案,如TLS_DHE_*
和TLS_ECDHE_*
。
即使银行业也无法获得IETF to change the decision。帽子离开IETF坚守阵地。我认为他们有时过于宽容,往往会导致安全性下降。但我认为他们在后雪时代做出了正确的决定,我们很清楚窥探和间谍的程度。
答案 1 :(得分:0)
在@jww 回答之后,有一个 ruby 库允许您将 OpenSSL 密码名称与 IANA/标准/RFC 名称进行映射:
require 'tls_map' # gem install tls-map
tm = TLSmap::App.new
tm.search(:openssl, 'AES128-SHA', :iana)
# => {:iana=>"TLS_RSA_WITH_AES_128_CBC_SHA"}