如何使用 nginx 反向代理并加密来排除服务器上的 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 故障?

如何使用 nginx 反向代理并加密来排除服务器上的 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 故障?

我有一台服务器(Debian 9.13),其中有多个网站在 Docker 容器中运行,并使用 nginx(1.13.12)作为反向代理。

该网站有两个域名:alchimie-web.com 和 lesamisdelachesnaie.fr

我一直在使用 Let's encrypt certbot(带有 Docker 映像)来颁发和更新证书,并且它运行良好。

alchimie-web.com 的证书已于 12 月 31 日更新,自此无法连接到 alchimie-web.com 上的服务(如www.alchimie-web.com)。

使用 Chrome 时,我收到 ERR_SSL_VERSION_OR_CIPHER_MISMATCH,使用 curl 时我收到:

# curl "https://www.alchimie-web.com"
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

lesamisdelachesnaie.fr 的证书已于 12 月 1 日更新,网站仍在运行。但它们是使用旧版本的 certbot Docker 映像颁发的。在此期间,我已将其更新为最新版本。

nginx 的 SSL 设置在部分中全局设置http

以下是相关片段:

   # global SSL configuration
    ssl_certificate         /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key     /etc/nginx/ssl/privkey.pem;
    ssl_trusted_certificate   /etc/nginx/ssl/chain.pem;

    ssl_protocols           TLSv1.2 TLSv1.3; # TLSv1 TLSv1.1 

    # Diffie-Hellman
    ssl_ecdh_curve          secp384r1;

    # OCSP Stapling
    resolver 80.67.169.12 80.67.169.40 valid=300s;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_verify_depth        3;

    ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES;
    ssl_prefer_server_ciphers   on;

    # SSL cache
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_session_tickets off;

我尝试注释掉该ssl_ciphers指令并关闭它ssl_prefer_server_ciphers,但没有任何改变。

我没有从 ssllabs.com 获取任何有用的信息:

Assessment failed: Failed to communicate with the secure server

关于哪里出了问题以及/或者我应该在哪里解决这个问题有什么提示吗?

编辑:根据 @steffenullrich、@lexli 和 @vidarlo 的评论,我尝试过的方法

  • 检查日志:当我尝试从 Chrome 连接时,nginx 日志中没有什么特别的东西,或者curlopenssl s_client
    当我使用(不错的工具,感谢@lexli)扫描时cipherscan,我在 nginx 日志中收到错误:
    • SSL_do_handshake() failed (SSL: error:1417D18C:SSL routines:tls_process_client_hello:version too low) while SSL handshaking
    • SSL_do_handshake() failed (SSL: error:1417D102:SSL routines:tls_process_client_hello:unsupported protocol) while SSL handshaking
    • cipherscan总结主机似乎不支持 SSL 或 TLS 协议
  • 将 SSL 证书指令移至特定站点(server{...})部分(使用 include 指令):这没有什么区别
  • 检查配置和证书路径:nginx -t表示语法正确,测试通过。我检查发现,如果证书文件的路径或文件名错误,它会抛出错误。
  • 更新证书:无效果

我将 nginx 更新到最新的 Docker 镜像(1.23.3),它确实改变了一些东西,我会深入研究它......

答案1

我想先说openssl

$ openssl s_client -connect www.alchimie-web.com:443 -servername www.alchimie-web.com
CONNECTED(00000003)
140257366177600:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl/record/rec_layer_s3.c:1544:SSL alert number 40
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 330 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

由于某种原因,服务器无法与客户端协商连接。这可能是因为证书已损坏,它配置了一组与客户端接受的密码不重叠的密码,或类似情况。下一步是验证您的证书,并尝试续订,即使您的证书尚未过期。

您还应该验证您的配置以及配置的证书路径是否正确。

答案2

所以就这么简单:更新 nginx...

看起来 Letsencrypt 颁发的证书无法由旧版本的 nginx 处理。

答案3

就我而言,我通过将 Cloudflare DNS 从 切换到Proxied来修复此错误DNS only,并且成功了。Nginx 和 Certbot 位于 Cloudflare 后面。

相关内容