如何使用 openssl 验证 DER 证书?
How to verify DER certificate with openssl?
PEM 工作正常
openssl verify -CAfile CA/ca.crt leaf.cert.pem
但无法验证使用 openssl x509 -in leaf.cert.pem -outform der -out leaf.cert.der
生成的 DER
openssl verify -CAfile CA/ca.crt leaf.cert.der
生产
unable to load certificate
4613703104:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
openssl verify
不接受 -inform der
作为其他 openssl 命令。
这是否意味着没有办法直接验证DER,我需要将其转换为PEM然后验证?
人们通常使用管道将一个命令的输出通过管道传输到另一个命令。
因此,要验证 DER 格式,您可以这样做:
openssl x509 -inform der -in .\leaf.cert.cer -outform pem | openssl
verify -CAfile CA/ca.crt
假设“leaf.cert.cer”是 DER 格式,“CA/ca.crt”是 PEM 格式。
分解:
openssl x509 -inform der -in .\leaf.cert.cer -outform pem
将 DER 证书转换为 PEM 格式并输出到标准输出。
openssl verify -CAfile CA/ca.crt
从标准输入验证 PEM 证书。
然后将两者与管道“|”结合起来命令将第一个命令的标准输出通过管道传输到第二个命令的标准输入。
创建 bash 脚本来检查证书状态。
如果需要,转换为 PEM 格式。
#!/bin/bash
#
# Check certificate revocation status.
# Convert certificate to PEM format if needed.
CERT=
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
CERT_PEM_TMP=$(mktemp -p $DIR -t "cert_pem.XXXXXXXXXX")
ISSUER_CRT_TMP=$(mktemp -p $DIR -t "issuer_crt.XXXXXXXXXX")
ISSUER_PEM_TMP=$(mktemp -p $DIR -t "issuer_pem.XXXXXXXXXX")
cert_to_pem () {
_CertFn=
_PemCertFn=
_Res=$(grep -c '\-\-BEGIN CERTIFICATE\-\-' $_CertFn)
echo "is_pem RES: $_Res"
if [ $_Res == "0" ]; then
echo "DER format"
openssl x509 -inform DER -in $_CertFn -out $_PemCertFn
else
ech "PEM Format"
openssl x509 -inform PEM -in $_CertFn -out $_PemCertFn
fi
}
cert_to_pem $CERT $CERT_PEM_TMP
CRT_URI=$( openssl x509 -in $CERT_PEM_TMP -text -noout | grep 'CA Issuers' | sed -e "s/^.*CA Issuers - URI://" )
echo "CRT_URI: $CRT_URI"
curl --silent $CRT_URI > $ISSUER_CRT_TMP
#./export_to_pem.tcl $ISSUER_CRT_TMP $ISSUER_PEM_TMP
cert_to_pem $ISSUER_CRT_TMP $ISSUER_PEM_TMP
OSCP_URI=$(openssl x509 -in $CERT_PEM_TMP -ocsp_uri -noout)
OSCP_HOST=$(echo $OSCP_URI | sed -e 's|^[^/]*//||' -e 's|/.*$||')
echo "check certificate: $CERT"
echo "ISSUER_PEM_TMP: $ISSUER_PEM_TMP"
echo "CERT_PEM_TMP: $CERT_PEM_TMP"
echo "OSCP_URI: $OSCP_URI"
echo "OSCP_HOST: $OSCP_HOST"
echo "Server response:"
openssl ocsp -no_nonce -issuer $ISSUER_PEM_TMP -cert $CERT_PEM_TMP -url $OSCP_URI -header Host=$OSCP_HOST
echo "Server response end:"
rm $CERT_PEM_TMP
rm $ISSUER_CRT_TMP
rm $ISSUER_PEM_TMP
PEM 工作正常
openssl verify -CAfile CA/ca.crt leaf.cert.pem
但无法验证使用 openssl x509 -in leaf.cert.pem -outform der -out leaf.cert.der
生成的 DER
openssl verify -CAfile CA/ca.crt leaf.cert.der
生产
unable to load certificate
4613703104:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
openssl verify
不接受 -inform der
作为其他 openssl 命令。
这是否意味着没有办法直接验证DER,我需要将其转换为PEM然后验证?
人们通常使用管道将一个命令的输出通过管道传输到另一个命令。
因此,要验证 DER 格式,您可以这样做:
openssl x509 -inform der -in .\leaf.cert.cer -outform pem | openssl
verify -CAfile CA/ca.crt
假设“leaf.cert.cer”是 DER 格式,“CA/ca.crt”是 PEM 格式。
分解:
openssl x509 -inform der -in .\leaf.cert.cer -outform pem
将 DER 证书转换为 PEM 格式并输出到标准输出。
openssl verify -CAfile CA/ca.crt
从标准输入验证 PEM 证书。
然后将两者与管道“|”结合起来命令将第一个命令的标准输出通过管道传输到第二个命令的标准输入。
创建 bash 脚本来检查证书状态。 如果需要,转换为 PEM 格式。
#!/bin/bash
#
# Check certificate revocation status.
# Convert certificate to PEM format if needed.
CERT=
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
CERT_PEM_TMP=$(mktemp -p $DIR -t "cert_pem.XXXXXXXXXX")
ISSUER_CRT_TMP=$(mktemp -p $DIR -t "issuer_crt.XXXXXXXXXX")
ISSUER_PEM_TMP=$(mktemp -p $DIR -t "issuer_pem.XXXXXXXXXX")
cert_to_pem () {
_CertFn=
_PemCertFn=
_Res=$(grep -c '\-\-BEGIN CERTIFICATE\-\-' $_CertFn)
echo "is_pem RES: $_Res"
if [ $_Res == "0" ]; then
echo "DER format"
openssl x509 -inform DER -in $_CertFn -out $_PemCertFn
else
ech "PEM Format"
openssl x509 -inform PEM -in $_CertFn -out $_PemCertFn
fi
}
cert_to_pem $CERT $CERT_PEM_TMP
CRT_URI=$( openssl x509 -in $CERT_PEM_TMP -text -noout | grep 'CA Issuers' | sed -e "s/^.*CA Issuers - URI://" )
echo "CRT_URI: $CRT_URI"
curl --silent $CRT_URI > $ISSUER_CRT_TMP
#./export_to_pem.tcl $ISSUER_CRT_TMP $ISSUER_PEM_TMP
cert_to_pem $ISSUER_CRT_TMP $ISSUER_PEM_TMP
OSCP_URI=$(openssl x509 -in $CERT_PEM_TMP -ocsp_uri -noout)
OSCP_HOST=$(echo $OSCP_URI | sed -e 's|^[^/]*//||' -e 's|/.*$||')
echo "check certificate: $CERT"
echo "ISSUER_PEM_TMP: $ISSUER_PEM_TMP"
echo "CERT_PEM_TMP: $CERT_PEM_TMP"
echo "OSCP_URI: $OSCP_URI"
echo "OSCP_HOST: $OSCP_HOST"
echo "Server response:"
openssl ocsp -no_nonce -issuer $ISSUER_PEM_TMP -cert $CERT_PEM_TMP -url $OSCP_URI -header Host=$OSCP_HOST
echo "Server response end:"
rm $CERT_PEM_TMP
rm $ISSUER_CRT_TMP
rm $ISSUER_PEM_TMP