【问题标题】:NGINX SSL handshake error - sslv3 alert certificate expired:SSL alert number 45NGINX SSL 握手错误 - sslv3 警报证书已过期:SSL 警报号 45
【发布时间】:2021-09-30 18:15:53
【问题描述】:

我正在使用 NGINX 作为 DNS over TLS 服务器。

然而,Android“私有 DNS”突然停止在所有设备上运行。

使用 kdig 仍然可以正常工作

kdig -d @my.dns.server +tls-ca +tls-host=my.dns.server example.org

然而,Android 请求却失败了,我在 NGINX 日志中收到以下错误

SSL_do_handshake() failed (SSL: error:14094415:SSL routines:ssl3_read_bytes:sslv3 alert certificate expired:SSL alert number 45) while SSL handshaking, client: **.**.**.**, server: 0.0.0.0:853

证书仍然有效,但我不确定它为什么会抛出此错误。

我的 NGINX SSL 配置是

ssl_certificate /etc/letsencrypt/live/my.dns.server/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/my.dns.server/privkey.pem; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
ssl_handshake_timeout    10s;
ssl_session_cache        shared:SSL:20m;
ssl_session_timeout      4h;

【问题讨论】:

  • 请务必查看letsencrypt.org/2020/12/21/extending-android-compatibility.html LE Root 证书今天已过期。
  • @PatrickMevzek 有没有办法强制 certbot 使用“ISRG Root X1”替代链?
  • 根据给定的链接,是的,似乎有可能:“备用链呢?今天,如果用户配置了备用链,一些 ACME 客户可以改为请求备用链。我们目前提供获取链的选项:Subscriber Certificate
  • 是的,我找到了。您可以将--preferred-chain "ISRG Root X1" 添加到certbot CLI 命令。现在效果很好。再次感谢@PatrickMevzek
  • 你应该根据你的发现写一个答案,然后选择它作为最佳答案。但是,我不是 100% 确定您的问题与编程无关,可能在 Server Fault 上更好

标签: nginx ssl dns


【解决方案1】:

问题:

letsencrypt 使用的 DST Root CA X3 证书已过期。他们已经开始额外使用新的 ISRG Root X1 证书多年,但一些旧设备(例如 android 应该不能再使用旧证书。

但letsencrypt 注意到许多旧的ssl 实现(包括android)不检查证书是否已过期。所以他们仍然可以为这些设备使用旧的 DST Root CA X3 证书。较新的 ssl 实现可以改用新的 ISRG Root X1 证书。

见:https://letsencrypt.org/2020/12/21/extending-android-compatibility.html

遗憾的是,一些较新的 ssl 实现(包括 android dot 客户端)注意到旧的过期证书并中止 ssl 连接,因为证书已过期。他们根本不检查新证书。由于这种依赖于实现的行为,一些较新的程序无法运行,但其他程序运行良好。

解决方案:

要使所有较新的 ssl 实现正常工作,您只需要使用新的 ISRG Root X1 证书。为此,您必须使用 ISRG Root X1 链。但这会破坏与旧设备的兼容,旧设备还不知道新的 ISRG Root X1 证书。

如果您使用 certbot,您可以使用以下标志 --preferred-chain "ISRG Root X1"

如果您使用 caddy 网络服务器,您可以将以下行添加到您的 Caddyfile 的开头:

{
    preferred_chains {
        root_common_name "ISRG Root X1"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2016-05-09
    • 2017-02-17
    • 2017-10-13
    • 2016-01-26
    • 2019-05-26
    • 2015-08-29
    相关资源
    最近更新 更多