openssl命令行验证CA证书

有一个指令叫做openssl verify,但真是难用。
对于apache格式的CA证书,服务器端需要用户上传一个.key文件和一个.crt文件。
下文中假如我的文件叫ca.key,ca.crt。
找了很多资料,终于知道要这样写命令:

openssl verify -CAfile ca.crt ca.crt

对于用默认参数生成的crt文件确实可以校验,但是对于使用扩展指令生成的v3版crt就会报错。
对于用户上传的证书能否验证我也表示怀疑。

 对于.key和.crt的相关性,也就是是否是一对,也得不到验证。

 基于上述原因,我决定读出关键信息,自己来验证。

有效性及相关性验证

  • 如果能从ca.key和ca.crt中读出public key,我们可以认为ca.key和ca.crt是有效的文件。有效性得到了验证。
openssl rsa -pubout -in ca.key
返回内容如下:
writing RSA key

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQDI12sYCMQR+V2hJTih
UZIy70KYR1YF6Yt393nswK0m7pPAf7bMN1F8w8pcFcYF0g2HaKTEAQAPlWZVOD0i
m2SYzDdm7gCx2AKYr40ijrSmzeis6SjTaBR7XljH5fFfnSkMTAXebnu2+LhIPtq+
etj72v2KVuo9bQr4h41Wz4sIo3Ix2PkAFslPxv4j73rqGKBjezoLhXHjHbnryaNY
icAOT+tI+GW7Hl7C33dJimGXmb3glI3qX7uxflFceV9Q3Bl3iFrzIGlA3kCdFwAz
s1TiUDxJl1TqfnZlxyQgwWrYqlaMfteP1LngTj69xYHoBm8ML4PKlFpm4hvEt9eQ
zQIDAQAB
-----END PUBLIC KEY-----

openssl x509 -pubkey -noout -in self.crt
返回内容如下:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQDI12sYCMQR+V2hJTih
UZIy70KYR1YF6Yt393nswK0m7pPAf7bMN1F8w8pcFcYF0g2HaKTEAQAPlWZVOD0i
m2SYzDdm7gCx2AKYr40ijrSmzeis6SjTaBR7XljH5fFfnSkMTAXebnu2+LhIPtq+
etj72v2KVuo9bQr4h41Wz4sIo3Ix2PkAFslPxv4j73rqGKBjezoLhXHjHbnryaNY
icAOT+tI+GW7Hl7C33dJimGXmb3glI3qX7uxflFceV9Q3Bl3iFrzIGlA3kCdFwAz
s1TiUDxJl1TqfnZlxyQgwWrYqlaMfteP1LngTj69xYHoBm8ML4PKlFpm4hvEt9eQ
zQIDAQAB
-----END PUBLIC KEY-----

  • 如果两个文件中读出的public key的值相等,则可以认为两个文件是成对的。相关性得到了验证

有效期验证

openssl x509 -in ca.crt -noout -dates

返回内容如下:

notBefore=May 8 03:29:36 2021 GMT
notAfter=May 6 03:29:36 2031 GMT

只需要从上述字符串中解析出启止时间,然后和当前系统时间做比较,判断是否在有效期内就好。

下面是我用python写的示例代码:

 
import datetime
import re

info = '''
notBefore=May  8 03:29:36 2021 GMT
notAfter=May  6 03:29:36 2031 GMT
'''

print(info)
str_before = re.search(r'notBefore=(.+)',info)
print(str_before.group(1))
timestamp_before = datetime.datetime.strptime(str_before.group(1),'%b %d %H:%M:%S %Y %Z').timestamp()
str_after = re.search(r'notAfter=(.+)',info)
print(str_after.group(1))
timestamp_after = datetime.datetime.strptime(str_after.group(1),'%b %d %H:%M:%S %Y %Z').timestamp()

utc_now = datetime.datetime.utcnow()
print(utc_now)
timestamp_now = utc_now.timestamp()

if timestamp_now >= timestamp_before and timestamp_now <= timestamp_after:
    print('ACK')
else:
    print('NAK')

 

posted @ 2021-05-08 11:38  bert_qin  阅读(7106)  评论(0编辑  收藏  举报