如何使用单个命令将证书链中的所有证书导出到单独的 .crt 文件

如何使用单个命令将证书链中的所有证书导出到单独的 .crt 文件

我想.crt使用单个命令将证书链中的所有证书导出到单独的文件。我怎样才能做到这一点?

提供一些背景信息:

  1. 我想使用opensslbash 实用程序:(openssl s_client -showcerts -connect <host>:<port> & sleep 4)
  2. 上面的命令可能打印多个证书,也就是说,它可能会打印多个具有以下模式的字符串:-----BEGIN CERTIFICATE-----X.509 证书编码为 base64 -----END CERTIFICATE-----。例如:

    -----BEGIN CERTIFICATE-----
    MIIFNzCCAx+gAwIBAgITUwAAAAJpqCKn3YTQ6gAAAAAAAjANBgkqhkiG9w0BAQsF...
    -----END CERTIFICATE-----
    
  3. 文件的内容.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命令的超时时间。

相关内容