我如何在 python 中获取证书颁发者信息?

新手上路,请多包涵

我想要来自 python 证书的“颁发给”信息。我尝试使用 SSL 和 SSLSocket 库但没有发生。

在此处输入图像描述

原文由 Raj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 503
2 个回答

更新的答案

如果可以建立到远程服务器的连接,则可以使用 ssl 标准库模块:

 import ssl, socket

hostname = 'google.com'
ctx = ssl.create_default_context()
with ctx.wrap_socket(socket.socket(), server_hostname=hostname) as s:
    s.connect((hostname, 443))
    cert = s.getpeercert()

subject = dict(x[0] for x in cert['subject'])
issued_to = subject['commonName']
issuer = dict(x[0] for x in cert['issuer'])
issued_by = issuer['commonName']

>>> issued_to
u'*.google.com'
>>> issued_by
u'Google Internet Authority G2'

原答案

使用 pyOpenSSL

 from OpenSSL import crypto

cert_file = '/path/to/your/certificate'
cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(cert_file).read())
subject = cert.get_subject()
issued_to = subject.CN    # the Common Name field
issuer = cert.get_issuer()
issued_by = issuer.CN

You can also access additional components, eg organisation ( subject.O / issuer.O ), organisational unit ( subject.OU / issuer.OU ).

您的证书文件可能是另一种格式,因此您可以尝试 crypto.FILETYPE_ASN1 而不是 crypto.FILETYPE_PEM

原文由 mhawke 发布,翻译遵循 CC BY-SA 4.0 许可协议

pyOpenSSL 库似乎不太适合这项任务。这是他们在官方文档中所说的

注意:Python Cryptographic Authority 强烈建议尽可能使用 pyca/cryptography。

有一些使用 Python 标准库的变通方法,但其中大多数看起来很混乱。

这是通过 pyca/cryptography 完成的方法。它看起来非常简单干净

from cryptography.x509 import load_pem_x509_certificate

cert = load_pem_x509_certificate(certificate_content)
certificate_serial_number = cert.serial_number
certificate_issuer_info = cert.issuer.rfc4514_string()
certificate_subject_info = cert.subject.rfc4514_string()

结果将打印包含发行人详细信息的整行

CN=name,O=Org\, Inc.,L=Tucson,ST=Arizona,C=US
CN=Sectigo RSA Organization Validation Secure Server CA,O=Sectigo Limited,L=Salford,ST=Greater Manchester,C=GB

要访问有关证书的特定详细信息,您可以使用 cert.issuer 对象。

原文由 Henry Harutyunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏