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

时间:2017-01-27 03:21:08

标签: ruby-on-rails ruby ssl openssl net-http

我正在使用需要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中,如

enter image description here

非常感谢你。我注意到我正在给客户"你好",但我从来没有在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

wireshark

2 个答案:

答案 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 namesOpenSSL 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"}