我有一台服务器(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 日志中没有什么特别的东西,或者
curl
,openssl 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 后面。