我有一个项目,我需要通过检查过期和 ca 受信任列表来检查给定 URL 的证书。我已经实现了过期,并且我在进行 ca 受信任列表检查时遇到了额外的困难。
因此,我设法在 x509 变量中获得了证书:
der_cert = sock.getpeercert(True) # non-binary form
pem_cert = ssl.DER_cert_to_PEM_cert(der_cert)
byte_pem_cert = bytes(pem_cert, 'UTF-8')
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, byte_pem_cert)
然后,从证书的字典形式中,我可以导出 .crt 文件(这是 ca 颁发者)
der_cert_dict = sock.getpeercert(False)
ca_issuers = str(der_cert_dict['caIssuers']).replace("'", "").replace("(", "").replace(")", "").replace(",", "")
我已经了解 crt 文件是 der 文件,所以,基本思想是检查我的初始 x509 对象是否与 ca_issuer 相同?
因为,当我这样做时:
store = OpenSSL.crypto.X509Store()
store.add_cert(OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, bytes_root_pem))
store_ctx = OpenSSL.crypto.X509StoreContext(store, x509)
try:
store_ctx.verify_certificate()
print("Verify - OK")
except OpenSSL.crypto.X509StoreContextError as e:
print(Fore.LIGHTRED_EX + "CA doesn't match, got the " 'following error from pyOpenSSL: ' + Fore.WHITE +
e.args[0][2])
我总是最终无法获得颁发者证书。