针对各种 CRL 文件验证 SSL 证书

Verify SSL certificate against various CRL files

我获得了多个证书文件,例如"cert1.crt"、"cert2.crt" 等,以及多个 CRL 列表,"list1.crl"、"list2.crl" 等。没有提供 rootCA 或任何其他类型的文件。我的任务是找出哪些证书没有被撤销。尽管对 "verification" 命令进行了广泛搜索,但我未能找到至少能为我提供线索的任何命令或过程。最后,我设法做了一些 bash 脚本特技飞行,让我手动测试每个 .crt 文件的序列号

for((i=1;i<9;i++))
do
echo $i
fileIn="crl"$i".crl"
#serial is manually c/p from each .crt file
serial="1319447396"
OUTPUT="$(openssl crl -in $fileIn -noout -text | grep $serial)"
echo $OUTPUT
done

这样我可以一次手动完成一个,但它只适用于少量文件(目前为 9 个)。如果有几十个文件,它会变得乏味和无效,如果超过 100 个文件,就不可能这样做了。

我想知道是否有 "smart" 方法来验证 .crt 和 .crl?或者至少有没有办法 bash 编写作业脚本,这样我就不必手动检查每个 .crt 了?现在它超出了我的脚本知识范围。

所以,如果存在这样的东西,我会很高兴:

openssl x509 -verify cert1.cert -crl_list list8.crl

一般来说,是的,每个证书都会根据 CRL 检查,detailed in this guide

但是,实际上,每个 crl 都是一个简单的吊销证书序列号列表。
crl 中包含的列表可以扩展为:

openssl crl -inform DER -text -noout -in mycrl.crl

假设 crl 为 DER 格式(根据需要进行调整)。

  1. 将每个(所有)crl 展开为一个文本文件,例如:

    openssl crl -inform DER -text -noout -in mycrl.crl > mycrl.crl.txt
    

    输出文件可以减少到只有 Serial Number: 行。

  2. 从证书的文本扩展中获取序列号:

    mycrt=$(openssl x509 -in mycrt.com.crt -serial -noout)
    mycrt=${mycrt#*=}
    
  3. one 调用 grep:

    if grep -rl "$mycrt" *.crl.txt 2>/dev/null; then
        echo "the certificate has been revoked"
    fi
    

完整脚本:

#!/bin/bash

# Create (if they don't exist) files for all the crl given.
for crl in *.crl; do
    if [[ ! -e "$crl.txt" ]]; then
    openssl crl -inform DER -text -noout -in "$crl" |
        awk -F ': ' '/Serial Number:/{print }'> "$crl.txt"
    fi
done

# Process all certificates
for crt in *.crt; do
    mycrt=$(openssl x509 -in "$crt" -serial -noout)
    mycrt=${mycrt#*=}
    if grep -rl "$mycrt" *.crl.txt; then
        echo "Certificate $crt has been revoked"
    fi
done

我终于设法以一种可能不是最优的方式解决了这个问题,但需要的 bash 知识要少得多。这是我的脚本:

#!/bin/bash

for((j=1;j<10;j++))
do
indicator=0
cert="cert"$j".crt"
for((i=1;i<9;i++))
do
infile="crl"$i".crl"
SERIAL="$(openssl x509 -noout -text -in $cert | grep Serial | cut -d  'x' -f 2 | cut -d ')' -f 1)"
OUTPUT="$(openssl  crl -inform DER -in $infile -noout -text | grep $SERIAL )"
if [ -n $OUTPUT ]
then ((indicator++))
fi
done
echo $cert
if [ $indicator == 0 ]
then echo "not revoked" 
else
echo "revoked"
fi
done