日志记录

日志记录

我正在为一些物联网设备运行 OpenVPN 服务器,其中许多设备需要更换证书,因为旧证书已过期。使用慢速移动连接更新这些证书是一个脆弱的手动过程,此外这些设备只能使用 OVPN 访问。因此,我想特别确保证书已成功替换,并使用这些证书建立了新连接。问题是我无法找到一种比较简单的方法从 OVPN 获取足够的详细信息,例如查看替换证书的序列号或发行时间。

那么,如何记录 OpenVPN 中每个连接的证书详细信息?

最好在状态日志中增加一些列,但即使--status 版本 2似乎没有提供证书中的任何额外详细信息。证书的通用名称等信息在新旧证书之间是相同的。是否支持基于内部可用数据的额外自定义列?

我还将日志级别提高到了 9,但除了记录大量低级别数据包相关内容外,我也没有看到客户端的任何其他证书详细信息。不过,根据日志级别,可能会很容易遗漏某些内容,因此无论如何,最好只记录这些证书详细信息本身。

--client-connect和等概念--learn-address似乎也只提供了通用名称。此外,由于事物只是暂时感兴趣的,因此我想避免在这种情况下实现一些过于定制的软件。

谢谢!

答案1

我的问题实际上包含两个部分:如何记录感兴趣的内容以及如何实现确保不再使用旧证书的目标。所以答案也不同。

日志记录

虽然我没有找到一个简单的配置来记录证书序列等其他详细信息,但可以借助--tls 验证。这需要一个脚本,并且 OVPN 为该脚本设置了多个环境变量,例如包含某些证书的序列号。

–tls验证命令运行命令 cmd 来验证待处理的 TLS 连接的 X509 名称,该连接已通过所有其他认证测试(通过 –crl-verify 指令的撤销除外;撤销测试在 –tls-verifytest 之后进行)。

支持的环境变量:

tls_id_{n}
tls_serial_{n}
tls_serial_hex_{n}

虽然不是严格的日志记录,但--tls-export-cert也可能引起人们的兴趣,因为从理论上讲,它使得某些客户端的整个证书可以在服务器上进行详细分析。

–tls-export-cert 目录存储客户端连接到此目录时使用的证书。这将在调用 –tls-verify 之前完成。证书将使用临时名称,并在 tls-verify 脚本返回时被删除。证书使用的文件名可通过 peer_cert 环境变量获得。

拒绝无效证书

我的最终目标是确保替换的证书按预期使用。一种方法是使用证书吊销列表,OVPN 支持一种非常简单的方法:证书不需要任何具体的文件格式,只需将一些文件名添加到某个配置的目录中,所有包含与某个文件名对应的序列号的证书都会被阻止。要记住的最重要的一点是文件名必须是十进制的证书序列号,其他一切都很简单。

–crl-验证crl ['目录']根据 PEM 格式的文件 crl 检查对等证书。[...]如果指定了可选的 dir 标志,则启用不同的模式,其中 crl 是包含以撤销序列号命名的文件的目录(文件可能为空,内容永远不会被读取)。如果客户端请求连接,其中客户端证书序列号(十进制字符串)是目录中存在的文件的名称,则将被拒绝。

server.conf仅包含以下附加配置:

crl-verify 'crl' 'dir'

其映射到以下目录:

crl
    7
    8
    9
crl_staging
    12
    13
    14
openvpn-status.log
server.conf

crl和中的文件crl_staging只是十进制证书序列号,可以根据需要在目录之间移动。如果 中有序列号crl,则连接被阻止,否则连接成功。日志中的示例错误消息如下所示:

ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS: new session incoming connection from [AF_INET]34.252.35.124:35231 (via [AF_INET][...]%eth1)
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY OK: depth=1, C=DE, ST=[...], O=[...], OU=[...], CN=[...], emailAddress=[...]
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 VERIFY CRL: certificate serial number 10 is revoked
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 OpenSSL: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS_ERROR: BIO read tls_read_plaintext error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS object -> incoming plaintext read error
ovpn-server[15859]: 00-0a-14-81-d9-e1/34.252.35.124:35231 TLS Error: TLS handshake failed

相关内容