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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM