我想.crt
使用单个命令将证书链中的所有证书导出到单独的文件。我怎样才能做到这一点?
提供一些背景信息:
- 我想使用
openssl
bash 实用程序:(openssl s_client -showcerts -connect <host>:<port> & sleep 4)
上面的命令可能打印多个证书,也就是说,它可能会打印多个具有以下模式的字符串:
-----BEGIN CERTIFICATE-----
X.509 证书编码为 base64-----END CERTIFICATE-----
。例如:-----BEGIN CERTIFICATE----- MIIFNzCCAx+gAwIBAgITUwAAAAJpqCKn3YTQ6gAAAAAAAjANBgkqhkiG9w0BAQsF... -----END CERTIFICATE-----
文件的内容
.crt
应该与打印的 base64 编码证书完全相同,包括标签。
答案1
通过管道进入awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "cert-" i ".crt" }'
例如:
echo "" |
openssl s_client -showcerts -connect www.example.com:443 |
awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > "cert-" i ".crt" }'
答案2
事实证明awk
可以用来解决这个问题:
(openssl s_client -showcerts -connect <host>:<port> & sleep 4) | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{if(/-----BEGIN CERTIFICATE-----/){a++}; out="/tmp/<host>"a".crt"; print > out}'
将<host>
和替换<port>
为实际值。该sleep
命令的作用是限制openssl
命令的超时时间。