如何连接到 OpenVPN 服务器并转储连接时显示的证书链?

如何连接到 OpenVPN 服务器并转储连接时显示的证书链?

我的第一个想法是使用类似的东西openssl s_client,但是这只支持 TCP 而不支持 UDP,而且似乎需要一些特殊的魔法才能使 TLS over UDP 工作,我该如何与它交互并获取所呈现的证书链的转储?(我特别需要证书,而不是有关它们的信息)

答案1

建立在基本完整的解决方案在 Peter Šurda 的这个线程中(请参阅那里关于所用openvpn选项的一些解释),这应该可以完成获取服务器证书的工作。

我假设您有一个有效的 OVPN 配置文件,config.ovpn并且您正在使用用户名和密码对客户端进行身份验证(这可以省略,具体取决于您的设置)。

准备工作目录:

WD=/tmp/openvpn-cert
mkdir $WD

准备脚本来提取服务器证书和一些虚假凭证文件(我们不需要通过成功的身份验证):

echo -e '#!'"/bin/sh\ncp \$peer_cert $WD/server-cert-\$1.pem" >$WD/extract-cert.sh
chmod +x $WD/extract-cert.sh

echo -e "fakeusername\nfakepassword" >$WD/creds.dat

尝试连接openvpn

openvpn --config config.ovpn --auth-user-pass $WD/creds.dat --tls-export-cert $WD \
    --script-security 2 --tls-verify $WD/extract-cert.sh --log /dev/null

现在您应该有服务器证书$WD/server-cert-0.pem并且可以对其进行操作,例如获取不早于不晚于日期:

openssl x509 -in $WD/server-cert-0.pem -noout -dates

链中的其他证书将在等中可用$WD/server-cert-1.pem。该数字来自传递给 的第一个参数extract-cert.sh,即证书深度。请--tls-verify参阅脚本钩子部分手册页。

答案2

我恰好在 TCP 模式下运行 OpenVPN 服务器,我可以确认你不能用于openssl s_client获取证书:

[me@risby 17]$ openssl s_client -connect openvpn.example.com:1194
CONNECTED(00000003)
140413456672632:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 205 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

我只能推测,尽管 OpenVPN 使用 SSL,但其使用方式与标准 SSL/TLS 连接不同。因此,我认为这不是可行的方法。

我曾希望找到一个openvpn可以转储证书的客户端调用,但迄今为止还没有。很抱歉我没有提供更多信息,但我认为值得写一个答案,这样可以防止您浪费时间。

答案3

我遇到了同样的问题,可以使用带有特定参数的 openvpn 来解决。重要的是--tls-verify--tls-export-cert--tls-verify后面需要跟要执行的脚本的文件名。环境变量peer_cert将包含转储证书链的位置。后面--tls-export-cert需要跟将转储证书的目录名称。tls-verify 脚本完成后,证书将自动删除。

我发现的唯一问题是它要求您已经拥有 CA 证书。如果您没有证书,脚本将无法执行,而且我还没有找到解决这个问题的方法。

使用示例:

openvpn --remote remote.host.to.check 1194 --dev tun --proto udp --ca tmp/openvpnca.cert --client --auth-user-pass tmp/noauth.txt --remote-cert-tls server --tls-verify tmp/tls-verify.sh --script-security 2 --tls-export-cert tmp/tlsverifies

tmp/noauth.txt是一个包含两行虚假用户名/密码的虚拟文件。 tmp/tlsverifies是将转储链文件的目录。 是处理环境变量的tmp/tls-verify.shshell 脚本peer_cert

相关内容