记录 apache 为每个 SSL 连接使用的 SSL 证书,以增强日志记录和调试

记录 apache 为每个 SSL 连接使用的 SSL 证书,以增强日志记录和调试

我有一个 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 手册了解详情。

相关内容