【发布时间】:2019-02-22 23:50:02
【问题描述】:
我正在尝试使用curl 获取中间证书,并在不将其写入文件的情况下处理该证书。
我已经弄清楚如何处理叶子证书并获取分发点,但这就是我遇到的问题。
例如,让我们以 stackoverflow 为例(似乎相关)。 SO的第一个中间证书来自http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt。
在交互式 shell 中,我可以执行以下操作将证书的值存储到变量中:
DigiCertIntermediateCert=$(curl http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt)
然后我可以通过执行以下操作来检查证书的值:
echo "$DigiCertIntermediateCert" | openssl x509 -inform DER -outform 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
当我们输入 url 时会输出什么?
...
[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 形式(因为“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:
说没有足够的数据。
为什么脚本和我在 shell 中执行的操作会有所不同?如何通过 openssl 工具提供二进制证书以获取 PEM 形式的证书?
【问题讨论】:
标签: bash openssl certificate