如何从 python 中的 x509 证书中提取公钥?

Posted

技术标签:

【中文标题】如何从 python 中的 x509 证书中提取公钥?【英文标题】:How to extract public key from a x509 certificate in python? 【发布时间】:2017-06-13 00:01:23 【问题描述】:

下面显示了我遵循的代码示例,但是我得到了错误响应 - “无法加载证书”。

from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend

cert_str = '-----BEGIN CERTIFICATE----- MIIDBTCCAe2gAwIBAgIQEsuEXXy6BbJCK3bMU6GZ/TANBgkqhkiG9w0BAQsFADAt... -----END CERTIFICATE-----';

cert_obj = load_pem_x509_certificate(str.encode(cert_str), default_backend())
public_key = cert_obj.public_key();

错误响应

Traceback (most recent call last):
  File "C:\xampp1\htdocs\TestWorkPlace\TestPython\src\test1.py", line 10, in <module>
    cert_obj = load_pem_x509_certificate(str.encode(cert_str), default_backend())
  File "C:\Program Files (x86)\Python\lib\site-packages\cryptography\x509\base.py", line 43, in load_pem_x509_certificate
    return backend.load_pem_x509_certificate(data)
  File "C:\Program Files (x86)\Python\lib\site-packages\cryptography\hazmat\backends\multibackend.py", line 341, in load_pem_x509_certificate
    return b.load_pem_x509_certificate(data)
  File "C:\Program Files (x86)\Python\lib\site-packages\cryptography\hazmat\backends\openssl\backend.py", line 1175, in load_pem_x509_certificate
    raise ValueError("Unable to load certificate")
ValueError: Unable to load certificate

请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

X509 证书中不包含私钥,只有公钥。要提取公钥,您已经获得了正确的代码,但您的证书将不会加载,因为它不是正确的 PEM 格式。

PEM 格式的证书具有 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 分隔符和介于两者之间的 base64 编码数据,但它还需要每行最多 64 个字符(最初在 RFC 1421 中定义,但也存在于 @987654322 中@)。

有些软件比规范更宽容,但pyca/cryptography(OpenSSL 或 LibreSSL)的底层库要求以这种方式格式化。

【讨论】:

以上是关于如何从 python 中的 x509 证书中提取公钥?的主要内容,如果未能解决你的问题,请参考以下文章

java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)

如何在 PyCrypto 中使用 X509 证书?

如何从 X509Store 加载受密码保护的证书?

使用 C# 从 CA 证书为设备创建 X509 证书

比较java中的2 x509证书

将 X509 值传递给 LDAP 服务器