2017-03-18 27 views
-1

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

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多个文件就不可能这样做。

我想知道是否有一种“聪明”的方式来验证.crt对抗.crl?或者至少有一种方法来打脚本的工作,所以我不必手动检查每个.crt?现在它超出了我的脚本知识。

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

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

https://raymii.org/s/articles/OpenSSL_manually_verify_a_certificate_against_a_CRL.html – 2017-03-18 20:43:48

+0

谢谢,雨果。我很清楚这篇文章以及其他一些文章,因为我在提出问题之前尽可能多地搜索了它,但它并没有为我的问题提供解决方案,因为验证方法不适用于问题在眼前。正如我在文章中提到的,我没有提供一个CA文件,用于您提到的网站提供的验证方法。我确实找到了OpenSSL的方式来解决它,但我缺乏的是bash命令知识来做到这一点。 – Gishas

回答

2

在一般情况下,是的,每个证书检查针对CRL,因为是detailed in this guide

但实际上,每个crl都是一个简单的撤销证书序列号列表。

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

Asuming的CRL是DER形式(如需要适应):
包含在CRL列表可以与扩展。

  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. 用grep中的所有文本文件中的序列号从步骤一(如果该证书匹配被撤销)在一个通话与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 $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 
+0

谢谢。它工作(顺便说一句,它表明我的所有证书已被撤销)。老实说,你向我介绍了很多新的命令,我甚至不知道它是如何工作的。在我自己的话,大概需要我几天,甚至更专用的bash教程学习,时间,这,唉,我没有在我手上的那一刻,让你真正帮助了很多。你做了很棒的工作解释,谢谢你的时间! – Gishas

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 
+0

请检查SERIAL(小写)与输出(大写)的情况。你应该让他们平等。一个'SERIAL = $ {SERIAL ^^}'应该就够了。 – sorontar

+0

在此,要为'M * N'(M = CRL的的数,n = CRT的数)执行命令。在我的代码中,crl只处理一次,然后每个crt处理一个grep命令。对于少数不太重要的crt,但对于许多crt和crl来说,这会使剧本变得很慢。 – sorontar

+0

哇,非常感谢,sorontar!你的脚本绝对是优越的,但是凭借我对bash的现有知识,我发现以我的方式执行它更方便,即更少的不同命令。我有点时间了,下周我的密码学检查做准备,所以我必须找到我什么工作和进行,研究不同的问题。再次感谢您的帮助,我非常喜欢您的代码! – Gishas