我的第一个想法是使用类似的东西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.sh
shell 脚本peer_cert