在Python3中使用加密模块加载openssl私钥时无法反序列化密钥数据错误

时间:2019-01-27 23:59:36

标签: python-3.x openssl python-cryptography

我正在尝试使用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()
         )

1 个答案:

答案 0 :(得分:1)

openssl genrsa命令产生一个PEM格式的密钥(这是一个文本文件,带有以base64编码的密钥周围的开始和结束定界符,您可以使用任何编辑器或寻呼机查看它。)

但是,load_der_private_key函数期望以DER格式(作为原始字节)获得键。该函数无法处理PEM格式的密钥,这就是它引发错误的原因。

要解决此问题,请将PEM文件的内容传递给load_pem_private_key而不是load_der_private_key,或者通过运行openssl rsa -in RootCA.key -inform pem -out RootCA.der -outform der从PEM文件生成密钥的DER表示,然后传递将该DER文件的内容保存到load_der_private_key