gpt4 book ai didi

python - 如何验证 pyOpenSSL 中的证书签名?

转载 作者:太空狗 更新时间:2023-10-30 00:12:57 51 4
gpt4 key购买 nike

我有两个证书,一个用于签署 client.crtroot.crt

我想验证 client.crt 确实是由 root.key 签名的。

在终端上使用 openssl,它是这样工作的:

$ openssl verify -CAfile root.crt client.crt  
> client.crt: OK

但是使用 pyOpenSSL - 按照 documentationthis blog post - 我试过这样的事情:

client_cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, file('client.crt').read())

root_cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, file('root.crt').read())

store = OpenSSL.crypto.X509Store()
store.add_cert(root_cert)

ctx = OpenSSL.crypto.X509StoreContext(store, client_cert)
ctx.verify_certificate()

我收到这个错误:

    > X509StoreContextError: [2, 1, 'unable to get issuer certificate']

我错过了什么?

最佳答案

问题是我的 root.crt 并不是真正的 root,而是一个证书链:

-----BEGIN CERTIFICATE----- 
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

OpenSSL.crypto.load_certificate 只加载第一个。

解决方案是提取链文件中的所有证书并将它们添加到X509Store

代码解决方案如下所示:

_PEM_RE = re.compile(b'-----BEGIN CERTIFICATE-----\r?.+?\r?-----END CERTIFICATE-----\r?\n?', re.DOTALL)


def parse_chain(chain):
# returns a list of certificates
return [c.group() for c in _PEM_RE.finditer(chain)]


client_cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, file('server.crt').read())

store = OpenSSL.crypto.X509Store()
for cert in parse_chain(file('root.crt').read()):
store.add_cert(OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))

ctx = OpenSSL.crypto.X509StoreContext(store, client_cert)
ctx.verify_certificate()

改编自https://github.com/hynek/pem/blob/master/src/pem/_core.py#L115

关于python - 如何验证 pyOpenSSL 中的证书签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46553338/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com