我正在尝试使用curl
获得中间证书,并在不将其写入文件的情况下对其进行处理。
我已经弄清楚了如何处理叶子证书并获得分发点,但这就是我遇到的问题。
举个例子,让我们来看一下stackoverflow(似乎相关)。 SO的第一个中间证书来自http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt
。
在交互式外壳中,我可以执行以下操作将证书的值存储到变量中:
DigiCertIntermediateCert = $(卷http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt)
然后我可以通过执行以下操作来检查证书的值:
回显“ $ DigiCertIntermediateCert” | openssl x509-通知DER-更新PEM
这将输出漂亮且友好的PEM格式的证书。看起来像这样:
-----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs
...
cPUeybQ=
-----END CERTIFICATE-----
(注意:当中间证书更改时,这将更改,如果这与您看到的值不完全相同,请不要惊慌)
整洁!似乎这样应该工作。让我们将所有这些逻辑放入具有一些基本案例处理的脚本中(例如,如果证书采用其他形式,那么我们应该将其解释为该形式)并且应该完成,对吧?
#! /bin/bash
cert_content=$(curl -s "$1")
echo "$cert_content"
if echo "$cert_content" | openssl x509 -text -noout; then
echo "Not converting"
echo "$cert_content"
else
echo "Converting"
echo "$cert_content" | openssl x509 -inform DER -outform PEM
fi
输入网址时,输出什么?
...
[binary contents of a certificate]
...
unable to load certificate
4667577964:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/pem/pem_lib.c:683:Expecting: TRUSTED CERTIFICATE
Converting
unable to load certificate
4421875308:error:0DFFF08E:asn1 encoding routines:CRYPTO_internal:not enough data:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/asn1/a_d2i_fp.c:251:
因此很容易看到证书为DER形式(因为“转换”行),但是证书似乎不完整-请注意错误:
unable to load certificate
4421875308:error:0DFFF08E:asn1 encoding routines:CRYPTO_internal:not enough data:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22.230.1/libressl-2.6/crypto/asn1/a_d2i_fp.c:251:
说没有足够的数据。
为什么脚本和我在shell中执行的操作之间有何不同?如何通过openssl工具提供二进制证书以获取PEM形式的证书?
答案 0 :(得分:0)
问题所暗示的是,我对shell的使用不够严格。 “交互式”会话是使用zsh
完成的,脚本是在bash
下运行的。 zsh
会将EOF
附加到通过其管道传递的变量中,而bash
(显然)没有。现在我的任务是如何将EOF附加到bash中的变量(显然,这是不平凡的)。