使用客户端证书和 TLS_RSA_WITH_AES_256_CBC_SHA 以及其他密码套件

Use Client Cert and TLS_RSA_WITH_AES_256_CBC_SHA and other cipher suites

我正在与需要 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 中的显示方式类似于

所以非常感谢你。我注意到我正在给客户端 "Hello",但我从未在 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

They ciphers they support are:

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 like TLS_RSA_WITH_AES_128_CBC_SHA, to OpenSSL cipher string names, like AES128-SHA, using the openssl ciphers man page。这是一个简单的查找 - 只需在页面上搜索 IANA 注册表名称,您最终就会找到 OpenSSL 的名称。

我认为您应该使用的密码字符串是:

http.ciphers = ["AES256-SHA:AES128-SHA:DES-CBC3-SHA"]

... does anyone know what I can change http.ssl_version = :TLSv1_2 ... to make it also allow TLSv3?

为此,您需要在 OpenSSL 中设置上下文选项。在Ruby中,您需要设置OpenSSL::SSL::SSL_OP_NO_SSLv2OpenSSL::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 坚持他们的立场。我认为他们有时有点过于宽容,这往往会导致安全性较弱。但我认为他们在 post-Snowed 时代做出了正确的决定,我们对窥探和间谍活动的范围有了很好的了解。

在@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"}