【问题标题】:Use Client Cert and TLS_RSA_WITH_AES_256_CBC_SHA and other cipher suites使用客户端证书和 TLS_RSA_WITH_AES_256_CBC_SHA 和其他密码套件
【发布时间】:2017-06-12 16:42:06
【问题描述】:

我正在与需要 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?

编辑:

感谢您的所有 cmets。有效的密码是

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

【问题讨论】:

  • 我不记得看到有关 Ruby 和客户端证书的问题。祝你好运。我在 Ruby 中做简单的 Security 101 事情变得如此沮丧,我不再使用它。另请参阅 How to set SSLContext options in RubyHow to set TLS context options in Ruby (like OpenSSL::SSL::SSL_OP_NO_SSLv2)
  • 阅读ruby documentation, OpenSSL::Cipher.ciphers 是可用密码列表。这个mapping of openssl cipher suite names to rfc names 帮助缩小了每个密码的名称,并且它们看起来不受支持。 ssl 版本的This documentation 不显示TLSv1_3 受支持。
  • @jww 您可能希望将此添加为答案。它可能不完全完整,但比一系列 cmets 更好。
  • 非常感谢大家提供这些信息。是的,请将这些作为答案发布!我正在解析这些信息,并会及时通知您
  • 嘿@jww 你的密码确实是正确的。如果您发布该答案,我将很乐意接受。我仍然遇到 Read Server Hello A Issue 的问题,我发布了 Edit。如果您添加答案,我将接受它并将我的编辑移至新问题,否则我将在此处继续。如果有人有任何想法,请告诉我。再次感谢。

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


【解决方案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']

您可以使用openssl ciphers man pageIANA cipher suite names(如TLS_RSA_WITH_AES_128_CBC_SHA)映射到OpenSSL cipher string names(如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_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 致敬,因为他们坚守阵地。我认为他们有时有点过于包容,这通常会导致安全性变弱。但我认为他们在雪后时代做出了正确的决定,我们对窥探和间谍活动的程度有了很好的了解。

【讨论】:

    【解决方案2】:

    在@jww 回答之后,有一个 ruby​​ 库允许您使用 IANA/标准/RFC 名称映射 OpenSSL 密码名称:

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

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2010-10-16
      • 2010-11-22
      相关资源
      最近更新 更多