在 Python3 中使用加密模块加载 openssl 私钥时无法反序列化密钥数据错误
Could not deserialize key data error while loading openssl private key with cryptography module in Python3
我正在尝试使用 Python 的加密模块加载使用 OpenSSL 生成的私钥。
openssl genrsa -out rootCA.key 4096
密钥生成为:
它被加载为:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.serialization import load_der_private_key
import os
with open(os.getcwd() + '/rootCA.key', 'rb') as f:
der_data=bytes(f.read())
key = load_der_private_key(der_data, password=None, backend=default_backend())
print (key)
但是我收到这个错误:
File "loading_key.py", line 9, in <module>
key = load_der_private_key(der_data, password=None, backend=default_backend())
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/serialization/base.py", line 28, in load_der_private_key
return backend.load_der_private_key(data, password)
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1080, in load_der_private_key
password,
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1251, in _load_key
self._handle_key_loading_error()
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1309, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
有人可以帮忙解决这个问题吗?我似乎无法找出问题所在,因为它看起来非常简单。我在 cryptography
模块中看不到与此相关的任何其他命令,因此我不确定这是否是一种不正确的处理方式。
编辑:
供参考,或遇到类似问题的任何人,这是最终解决方案的样子:
with open(os.getcwd() + '/rootCA.key', "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
openssl genrsa
命令生成 PEM 格式的密钥(它是一个文本文件,开始和结束分隔符围绕着以 base64 编码的密钥,您可以使用任何编辑器或寻呼机查看它)。
但是,load_der_private_key
函数期望以 DER 格式(作为原始字节)提供一个密钥。该函数无法处理 PEM 格式的密钥,这就是它抛出错误的原因。
要修复,请将 PEM 文件的内容传递给 load_pem_private_key
而不是 load_der_private_key
,或者通过 运行 [=] 从 PEM 文件生成密钥的 DER 表示14=] 然后将该 DER 文件的内容传递给 load_der_private_key
.
我正在尝试使用 Python 的加密模块加载使用 OpenSSL 生成的私钥。
openssl genrsa -out rootCA.key 4096
密钥生成为:
它被加载为:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.serialization import load_der_private_key
import os
with open(os.getcwd() + '/rootCA.key', 'rb') as f:
der_data=bytes(f.read())
key = load_der_private_key(der_data, password=None, backend=default_backend())
print (key)
但是我收到这个错误:
File "loading_key.py", line 9, in <module>
key = load_der_private_key(der_data, password=None, backend=default_backend())
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/serialization/base.py", line 28, in load_der_private_key
return backend.load_der_private_key(data, password)
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1080, in load_der_private_key
password,
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1251, in _load_key
self._handle_key_loading_error()
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1309, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
有人可以帮忙解决这个问题吗?我似乎无法找出问题所在,因为它看起来非常简单。我在 cryptography
模块中看不到与此相关的任何其他命令,因此我不确定这是否是一种不正确的处理方式。
编辑:
供参考,或遇到类似问题的任何人,这是最终解决方案的样子:
with open(os.getcwd() + '/rootCA.key', "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
openssl genrsa
命令生成 PEM 格式的密钥(它是一个文本文件,开始和结束分隔符围绕着以 base64 编码的密钥,您可以使用任何编辑器或寻呼机查看它)。
但是,load_der_private_key
函数期望以 DER 格式(作为原始字节)提供一个密钥。该函数无法处理 PEM 格式的密钥,这就是它抛出错误的原因。
要修复,请将 PEM 文件的内容传递给 load_pem_private_key
而不是 load_der_private_key
,或者通过 运行 [=] 从 PEM 文件生成密钥的 DER 表示14=] 然后将该 DER 文件的内容传递给 load_der_private_key
.