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

How to extract public key from a x509 certificate in python?

下面显示了我遵循的代码示例,但是我得到的错误响应为 - "Unable to load certificate"。

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

请帮我解决这个问题。

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

PEM 格式的证书有 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 分隔符以及介于两者之间的 base64 编码数据,但它也需要每行最多 64 个字符(最初定义在 RFC 1421 but also present in RFC 7468).

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