0

我有一个项目,我需要通过检查过期和 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])

我总是最终无法获得颁发者证书。

4

0 回答 0