Nginx error: "No shared cipher". But there are

Nginx error: "No shared cipher". But there are

我的 Nginx 服务器有一个 SSL 证书,看起来非常好,并且在大多数浏览器中都能完美运行。服务器是 https://live.evmote.com . You can "hit" the server by going to https://live.evmote.com/primus 。 SSL 证书检查在此处:https://www.ssllabs.com/ssltest/analyze.html?d=live.evmote.com

到目前为止,还不错。问题特别出在 Tesla Model S 浏览器(车载浏览器)上。它给出了 "Bad certificate" 错误。 Tesla 浏览器是出了名的糟糕并且支持不完整。无法从特斯拉查看证书链或调试问题。它更像是一个设备而不是一台计算机。 这是 Tesla 内部的 SSL 支持: http://i.imgur.com/EbIrClM.jpg

在 Nginx 服务器上,我在日志中收到此错误: SSL3_GET_CLIENT_HELLO:no 共享密码

现在,从 Tesla SSL 报告和服务器报告中可以清楚地看出,存在共享密码。我希望他们会就此握手: TLS_RSA_WITH_AES_256_CBC_SHA (0x35)

我不确定如何从这里进行故障排除。

谢谢, 瑞安

错误消息可能具有误导性。绝对有问题的是浏览器不支持 SNI,但您的网站需要它。至少它只为支持 SNI 的浏览器提供有效证书(live.evmote.com),所有其他浏览器都会获得一个自签名的通配符证书,该证书不会被进行适当证书验证的浏览器接受。

我们在 Java 客户端遇到了类似的问题。根本原因是在 SSL 上下文中明确设置了协议 (io.netty.handler.ssl.SslContext):

val ctx = io.netty.handler.ssl.SslContextBuilder.forClient()
    ...
    .protocols("SSLv2Hello,TLSv1.2,TLSv1.3".split(","))
    .build()

准确地说 SSLv2Hello,既不应该在这里声明也不应该在这里使用。

很遗憾,我们无法控制所有客户。所以进一步调查发现这个问题是在 OpenSSL 升级到 1.1.*.

后出现的

一旦我们将 OpenSSL 降级到 1.0.*,它就成功了。 Nginx 1.18.0 + OpenSSL 1.0.2u 可以使用 SSLv2Hello 无错误地处理握手,并且使用尽可能高的协议。