使用 HTTP2 和 TLS 的 Cowboy Web 服务器在 Chrome 中获取 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

Posted

技术标签:

【中文标题】使用 HTTP2 和 TLS 的 Cowboy Web 服务器在 Chrome 中获取 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY【英文标题】:Cowboy Webserver using HTTP2 and TLS getting ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY in Chrome 【发布时间】:2018-10-31 15:14:22 【问题描述】:

我正在使用:Erlang OTP 21 和 Cowboy 2.4 代码:

cowboy:start_tls( 
                  my_listener,
                  [
                      port, Web_Server_Port,
                      certfile, Cert_File,
                      keyfile, Key_File
                  ],
                  #env => #dispatch => dispatcher()
                )

我正在使用它来启动 Web 服务器,它在 HTTP1.1 上运行良好,但现在 Chrome 使用的是 HTTP2,并且无法禁用。 所以现在我收到了:

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

我在启用 HTTP2 的 Firefox 中也遇到了类似的问题:

Error code: NS_ERROR_NET_INADEQUATE_SECURITY

但在 Firefox 上我可以禁用 HTTP2。禁用 HTTP2 时它工作正常。 我已经验证我的证书是好的并且我在 HTTP1.1 下获得了绿色锁 我读过 HTTP2 对所使用的密码和它们出现的顺序更加严格。

修复 Chrome 中的 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY SSL 错误 https://www.jeffgeerling.com/blog/2016/fixing-errspdyinadequatetransportsecurity-ssl-error-chrome 但不确定这是否是问题所在。

我不确定要使用什么密码,也不完全确定如何指示它们在牛仔中的使用。我尝试在选项中添加密码选项,但这并不能解决问题:

ciphers, [
        ecdhe_ecdsa,aes_256_cbc,sha384,sha384,
         ecdhe_rsa,aes_256_cbc,sha384,sha384, 
         ecdh_ecdsa,aes_256_cbc,sha384,sha384,
         ecdh_rsa,aes_256_cbc,sha384,sha384,
         dhe_rsa,aes_256_cbc,sha256,
         dhe_dss,aes_256_cbc,sha256,
         ecdhe_ecdsa,aes_256_cbc,sha,
         ecdhe_rsa,aes_256_cbc,sha,
         dhe_rsa,aes_256_cbc,sha,
         dhe_dss,aes_256_cbc,sha,
         ecdh_ecdsa,aes_256_cbc,sha,
         ecdh_rsa,aes_256_cbc,sha,
         ecdhe_rsa,aes_128_cbc,sha,
         dhe_rsa,aes_128_cbc,sha,
         dhe_dss,aes_128_cbc,sha,
         ecdh_ecdsa,aes_128_cbc,sha,
         ecdh_rsa,aes_128_cbc,sha
    ]

关于我在这里做错了什么有什么建议吗?

【问题讨论】:

【参考方案1】:

HTTP/2 forbids the use of old ciphers 包括您列出的所有 CBC 密码。

启用一些像这样的 GCM 密码,这应该被大多数浏览器接受:

ciphers, ["ECDHE-RSA-AES256-GCM-SHA384"]

虽然默认情况下它应该允许这些。

更多信息请看这里:http://ezgr.net/increasing-security-erlang-ssl-cowboy/

【讨论】:

我尝试添加确切的密码字符串,但在控制台中收到此错误消息: =INFO REPORT==== 31-Oct-2018::14:29:41.874434 === TLS 服务器:在 ssl_connection.erl:1215 的状态密码中生成服务器警报:致命 - 意外消息- unexpected_msg,alert,2,20, "ssl_cipher.erl",308, undefined,decryption_failed 您使用的是哪个版本的 OpenSSL? 这是我在 2018 年 8 月 14 日更新到 OpenSSL 1.0.2p 的旧版本,但错误消息仍然相同。看来他们正在将 cipher_suites 转换为地图,例如#cipher => aes_256_gcm,key_exchange => ecdhe_rsa,mac => aead,prf => sha384 并且有一个函数可以转换为字符串,例如ssl:suite_to_str(#cipher => aes_256_gcm,key_exchange => ecdhe_rsa,mac => aead,prf => sha384)。这导致“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384”,但这也不被接受......想法?? 既然您已经更新了 OpenSSL,那么删除密码配置怎么样?虽然你确定 Erlang/Cowboy 正在使用更新的配置吗?您还尝试过我在答案中给出的最后一个链接中的 Cowboy 配置吗?

以上是关于使用 HTTP2 和 TLS 的 Cowboy Web 服务器在 Chrome 中获取 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY的主要内容,如果未能解决你的问题,请参考以下文章

netty系列之:让TLS支持http2

golang http2 client 和server 使用非TLS 模式(h2c)

如果客户端关闭会话,nodejs v8.11.3 使用 TLS 在 http2 中中止

nginx开启http2和TLS1.3

深入理解 WEB协议HTTP2

http2实现中的PRI方法导致问题