【问题标题】:Python load stored certificate private keyPython加载存储的证书私钥
【发布时间】:2022-12-18 11:06:55
【问题描述】:

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

在服务器上,我有:

  • 存储在“我的本地计算机”中的证书,从可导出的 PXF 文件安装。
  • 蟒蛇 3.7.0
  • 密码学pip包版本37.0.2
  • 视窗服务器 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.

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

【问题讨论】:

  • 您从 pem_data 加载证书,然后尝试加载与私钥相同的数据。大概你想在那里加载一些不同的字节?
  • 这是一个很大的可能性。但是 datapem_dataserialization.load_pem_private_key 一起工作。我的猜测是我错误地使用了 ssl 和密码库,但我找不到如何使用。

标签: python windows certificate


【解决方案1】:

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

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

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

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

此功能的结果可以让您按顺序获得所需的一切让另一方验证你.私钥显然包含在 privateKey 变量中,您可以通过组合 cert 和 additionalCerts 获得证书链。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 2015-07-19
    • 2012-10-25
    • 2013-05-30
    • 2019-12-06
    • 2018-11-10
    • 2011-02-06
    • 2017-12-26
    相关资源
    最近更新 更多