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是有效的文件。有效性得到了验证。
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQDI12sYCMQR+V2hJTih
UZIy70KYR1YF6Yt393nswK0m7pPAf7bMN1F8w8pcFcYF0g2HaKTEAQAPlWZVOD0i
m2SYzDdm7gCx2AKYr40ijrSmzeis6SjTaBR7XljH5fFfnSkMTAXebnu2+LhIPtq+
etj72v2KVuo9bQr4h41Wz4sIo3Ix2PkAFslPxv4j73rqGKBjezoLhXHjHbnryaNY
icAOT+tI+GW7Hl7C33dJimGXmb3glI3qX7uxflFceV9Q3Bl3iFrzIGlA3kCdFwAz
s1TiUDxJl1TqfnZlxyQgwWrYqlaMfteP1LngTj69xYHoBm8ML4PKlFpm4hvEt9eQ
zQIDAQAB
-----END PUBLIC KEY-----
-----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')