我有一个 apache web 服务器,带有 mod_ssl 和 letsencrypt 的 SSL 证书。certbot
报告称证书没有问题,不会过期。有几个不同的用户(我的许多用户)报告称,他们从服务器获得了无效/过期的 SSL 证书(我已经看到了wget
他们的输出来证明这一点)。
为了调试这个问题,我想记录每个 SSL 连接的大量详细信息。我想记录每个 SSL 连接的远程 IP、SSL 连接的详细信息(例如协议)、客户端提供的 SNI(服务器名称标识)值,以及服务器上使用了哪些 SSL 证书/链/密钥。我想
使用ErrorLog ssl:traceN
(针对各种N
)我可以获得其中一些详细信息。但我看不到服务器为每个连接使用的 SSL 证书。我该怎么做?
答案1
mod_ssl
导出一堆环境变量(参见此处的列表),可用于记录有关证书的信息,例如,在LogFormat
这样的指令中:
LogFormat "cert_CN='%{SSL_SERVER_S_DN_CN}e', cert_expires='%{SSL_SERVER_V_END}e', vhost='%{Host}i', client='%h'" ssl_combined
但是,在开始记录之前,请务必检查本文关于 DST Root CA X3 证书过期的问题。它是签署 Let's Encrypt 根 CA 的证书,已于 9 月过期。但是,Let's Encrypt 根 CA 本身几乎被每个系统接受为受信任的 CA。因此,过期不是问题,颁发的证书继续有效,除了对于使用openssl
版本 <1.1.0 的旧系统,当发现受信任的 CA 时不会停止验证,而是坚持检查整个链(并失败)。
如果有问题的系统使用的是较旧的版本openssl
,则无法在服务器端解决问题,openssl
应在客户端进行升级。如果这不可行,将过期证书列入黑名单会有所帮助。
答案2
Apache HTTPDmod_ssl
设置了各种环境变量,其中一些变量可用于识别服务器证书。例如,有SSL_SERVER_CERT
(完整的 PEM 编码证书)、SSL_SERVER_S_DN
(主题的 DN)、SSL_SERVER_M_SERIAL
(证书序列号)。
您可以在日志配置中使用它们:
CustomLog "logs/ssl_request_log" "... %{SSL_SERVER_S_DN}x ..."
读mod_ssl 手册了解详情。