ERR_SSL_PROTOCOL_ERROR 仅针对部分用户(nodejs、express)

ERR_SSL_PROTOCOL_ERROR only for some users (nodejs, express)

只有一些(不是全部)用户在尝试访问我的快递网站时在 Chrome 中收到 ERR_SSL_PROTOCOL_ERROR。我没有收到这个错误,所以调试起来很麻烦。

我正在使用从提供商 (1&1) 下载的 PFX 文件创建 https 服务器:

var options = {
  pfx: fs.readFileSync('./mysite_private_key.pfx'),
  passphrase: 'MYPASSPHRASE',
};
https.createServer(options, app).listen(443); 

https://whatsmychaincert.com 告诉我链是正确的但抱怨握手:

[mysite] has the correct chain.

[mysite]: TLS handshake error: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error SSL Labs might be able to tell you what went wrong

我用谷歌搜索没有成功,有人知道问题出在哪里吗? Ty.

握手失败的一个可能原因可能是缺少中间证书,ca tls.createSecureContext 选项。它应该在您的提供商的网站上 public。

希望对您有所帮助。

如今,当我们的服务器(例如 1&1)被安全配置时,仅支持 tls v1.2 和 tls v1.3 ..

所以你如何调试这个:

  • 扫描您的站点 SSL Labs Test 也可以查看支持哪些密码,或者在我们的 nginx/apache 配置中查看

  • tail -f 服务器日志,尤其是 catchall/other_vhosts 日志文件,因为当服务器无法决定名字

  • 尝试 更新 用户 chrome 至少支持 tls 1.2

    chrome 有一些命令行开关来改变它的密码行为:

    • --ssl-version-max 指定最大 SSL/TLS 版本("tls1.2" 或 "tls1.3")。 ↪
    • --ssl-version-min 指定最低 SSL/TLS 版本("tls1"、"tls1.1"、"tls1.2" 或 "tls1.3")。 ↪

危险区域:

  • 作为最后的手段,您可以尝试在您的 nginx-config(ssl_ciphers 指令)中接受遗留密码,例如 socat 或(最后的手段)socat23 以检查您的客户支持哪个版本,

记得在生产环境中禁用 tls v1.2 以下的所有内容

最后我放弃了 1&1 并使用了 GoDaddy 的 CA 服务,问题就消失了。