以下服务器代码与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。
什么可能导致此错误?
答案 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|
。