根据各种CRL文件验证SSL证书

时间:2017-03-18 13:34:34

标签: bash ssl openssl ssl-certificate verify

我获得了多个证书文件,例如" cert1.crt"," cert2.crt"等,以及多个CRL列表," list1.crl"," list2.crl"等。没有提供rootCA或任何其他类型的文件。我的任务是找出哪些证书没有被撤销。尽管广泛搜索"验证"命令我找不到任何能给我提供至少线索的命令或程序。最后,我设法做了一些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多个就不可能这样做了。

我想知道是否有一个&#34; smart&#34;验证.crt对.crl的方法?或者至少有一种方法来压缩脚本的工作,所以我不必手动检查每个.crt?现在它超越了我的脚本知识。

所以,在伪,如果存在这样的事情,我会很激动:

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

2 个答案:

答案 0 :(得分:2)

通常,是的,每个证书都是根据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
    

    out文件可以简化为Serial Number:行。

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

    mycrt=$(openssl x509 -in mycrt.com.crt -serial -noout)
    mycrt=${mycrt#*=}
    
  3. 在第一步的所有文本文件中grep序列号(如果一个匹配证书被撤销)一次调用grep:

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

    #!/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 $2}'> "$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
    

答案 1 :(得分:0)

我终于设法以一种可能不是最佳的方式来解决这个问题,但需要更少的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