繁体   English   中英

Python 加载存储的证书私钥

[英]Python load stored certificate private key

在 Windows 服务器上,我试图获取存储证书的私钥。

在服务器上,我有:

  • 存储在 Local Machine My 中的证书,从可导出的 PXF 文件安装。
  • Python 3.7.0
  • 密码学 pip package 版本 37.0.2
  • Windows 服务器 2019

问题:
我的脚本无法从加载的 PEM 中反序列化关键数据。
注意:我可以成功地将原始证书 PFX 文件用于其创建目的(向 Azure 进行身份验证)

代码00.py:

import ssl
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes,serialization

expected_thumbprint = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

def hex_string_readable(bytes):
        return ["{:02X}".format(x) for x in bytes]

for c in ssl.enum_certificates("MY"):
    data = c[0]
    pem_data = ssl.DER_cert_to_PEM_cert(data).encode()

    cert_details = x509.load_pem_x509_certificate(pem_data, default_backend())

    fingerprint = hex_string_readable(cert_details.fingerprint(hashes.SHA1()))
    fingerprint_string = ''.join(fingerprint)
    print(fingerprint_string)
    if fingerprint_string == expected_thumbprint:
        print("Certificate found!")
        private_key = serialization.load_pem_private_key(pem_data, None, backend=default_backend())
        break

结果:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Certificate found!
Traceback (most recent call last):
  File ".\code00.py", line 22, in <module>
    private_key = serialization.load_pem_private_key(pem_data, None, backend=default_backend())
  File "C:\temp\.venv\lib\site-packages\cryptography\hazmat\primitives\serialization\base.py", line 22, in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
  File "C:\temp\.venv\lib\site-packages\cryptography\hazmat\backends\openssl\backend.py", line 904, in load_pem_private_key
    password,
  File "C:\temp\.venv\lib\site-packages\cryptography\hazmat\backends\openssl\backend.py", line 1168, in _load_key
    self._handle_key_loading_error()
  File "C:\temp\.venv\lib\site-packages\cryptography\hazmat\backends\openssl\backend.py", line 1193, in _handle_key_loading_error
    "Could not deserialize key data. The data may be in an "
ValueError: Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.

有什么我做错了或有其他方法可以实现这个目标吗?
提前致谢。

我可能迟到了,但这可能对将来的某人有帮助。

在您的代码中,您实际上是在从 Windows 证书存储中搜索加载的证书。 Ssl 库加载了这些,但据我所知,它只加载了证书的公共部分。 如果您有只对服务器进行身份验证的 TLS 客户端,这就足够了,但是如果您有双向身份验证或 TLS 服务器,并且您需要使用 Windows 证书存储,事情就会变得困难。

困难在于 Windows crypto API 仅允许通过一个 function 导出私钥,它将 PFX 格式导出到文件或 memory。正如您提到的,您已经拥有包含私钥的 PFX 文件。 您可以使用它并将其加载到 Python 代码中,如下所示:

with open("Cert.pfx", "rb") as pfxFile:
    pfxBinData = pfxFile.read()
    privateKey, cert, additionalCerts = pkcs12.load_key_and_certificates(pfxBinData, b"PFX_PASSWORD")

此 function 的结果为您提供了您需要的一切,以便另一方对您进行身份验证 私钥显然包含在 privateKey 变量中,您可以通过组合 cert 和 additionalCerts 获得证书链。

如果您需要将其加载到 SSL 上下文中,一种解决方案是使用命名管道,因为 SSL 上下文仅允许从 PEM 格式的文件中加载证书链和私钥。 这对 Linux 来说非常好,但在 Windows 与其证书存储配对时非常痛苦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM