如何使用Chrome和Firefox与Ruby服务器建立安全的HTTP / 2连接?

时间:2016-10-22 15:50:03

标签: ruby google-chrome ssl httpserver http2

以下服务器代码与curl和Safari建立SSL连接,但它不适用于Firefox或Chrome。保存证书例外后,在Safari上运行。

  server = TCPServer.new( 8080 )

  ctx = OpenSSL::SSL::SSLContext.new
  ctx.cert = OpenSSL::X509::Certificate.new(File.open('lib/keys/server.crt'))
  ctx.key = OpenSSL::PKey::RSA.new(File.open('lib/keys/server.key'))

  ctx.ssl_version = :TLSv1_2
  ctx.options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options]
  ctx.ciphers = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers]

  server = OpenSSL::SSL::SSLServer.new(server, ctx)

我尝试将证书添加到Firefox和Keychain(OSX),但我仍然得到

  

https://localhost:8080/的网页可能会暂时停用,或者可能已永久移至新的网址。

     

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

谷歌搜索表明密码存在问题,但以下情况没有什么区别:

ctx.ciphers = 'AESGCM:HIGH:!aNULL:!MD5'
ctx.ciphers = 'EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES'
ctx.ciphers = 'TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5'

评论ctx.ciphers也无济于事。

在Firefox上,连接挂起。找不到错误的好方法。

使用Chrome 53,Firefox 46和OpenSSL 1.0.2j。

什么可能导致此错误?

1 个答案:

答案 0 :(得分:1)

Chrome似乎坚持为HTTP / 2使用短暂的ECDH密钥交换,为了实现这一点,您需要设置tmp_ecdh_callback

ctx.tmp_ecdh_callback = lambda do |*args|
  OpenSSL::PKey::EC.new 'prime256v1'
end

我的基础是example code from the Ruby http-2 gem,我认为这也是你的代码所在。请注意,在该代码中,它使用lambda do |_args|,(使用下划线但没有*)这会导致问题,因为args的数量错误,lambda严格传递正确的数字,所以你得到错误。我已将其更改回原来的*args,似乎有been changed to fix Rubocop warnings。由于您似乎积极参与该回购,您可能希望将其更改为|*_args|