有一個指令叫做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')