繁体   English   中英

PEM 格式的 base64 编码公钥的序列化

[英]Serialization of a base64-encoded public key in PEM format

在 Python 中,如何从 PEM 格式的 base64 编码公钥中提取公钥。 例如,如果我拿这个(它来自官方数据库):

publicKeyPem = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGvHqf7SYtlvevOyA/no+i1/WcmS0bOYP1bgP+pJTjTkBOpQi+f7Ie6415WFl9aoqzMmKRJmE6Ur4H+b9Vba7FA=="

首先,我对其进行解码:

publicKeyPem = b64decode(publicKeyPem)

然后这是我将其转换为公钥的尝试:

publicKey = serialization.load_pem_public_key(publicKeyPem)

但它失败了:

Traceback (most recent call last):
  File "/Users/bob/dcc/./test", line 8, in <module>
    publicKey = serialization.load_pem_public_key(publicKeyPem)
  File "/usr/local/lib/python3.9/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 30, in load_pem_public_key
    return ossl.load_pem_public_key(data)
  File "/usr/local/lib/python3.9/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 853, in load_pem_public_key
    self._handle_key_loading_error()
  File "/usr/local/lib/python3.9/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1129, in _handle_key_loading_error
    raise ValueError(
ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=151584876, lib=9, reason=108, reason_text=b'error:0909006C:PEM routines:get_name:no start line')])

如何修复我的代码?

奇怪的是,如果我使用load_der_public_key而不是load_pem_public_key它不会失败,但我确信它是 PEM 格式,而不是 DER 格式!

您的publicKeyPem值不是 PEM 公钥格式。 它甚至不会解码为有效文本。

In [2]: base64.b64decode(publicKeyPem)
Out[2]: b'0Y0\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x03B\x00\x04\x1a\xf1\xea\x7f\xb4\x98\xb6[\xde\xbc\xec\x80\xfez>\x8b_\xd6rd\xb4l\xe6\x0f\xd5\xb8\x0f\xfa\x92S\x8d9\x01:\x94"\xf9\xfe\xc8{\xae5\xe5ae\xf5\xaa*\xcc\xc9\x8aD\x99\x84\xe9J\xf8\x1f\xe6\xfdU\xb6\xbb\x14'

所有公共 pem 密钥都以ssh-rsa之类的内容开始第一行。 这可能就是您看到此错误原因的原因:

b'错误:0909006C:PEM 例程:get_name:没有起始行'

如果您使用有效的公钥格式,它将起作用:

publicKeyPem = b'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdcvOVcCa7O36PHLsf4xTob7zjF72lceX4qIzeZA4e5AmIKXeLPAZQoQ3GdeLpdTn/rOVlOcMdtWV3v69of8+UCUXZQor6n3DSQJa4gaqtxVf4j9ew//rhlIbZfOCjy6DkXQNbEJpmzIjJ5QfT+VwEteAEPxUKogHaLQzZJsk8aAWaeDowmJ/ycGaLttOmZNjvgkcY5L4wQ+ef/SKKiuUKl8K91mev/8LvxrLbbB5Cgr0fgkswp28tjm8U42Nxha+5rmB5nEV5NR50wLNNuZ/KTsQOtmUEuvNNVnSFKgDrrKaA1jgoZnBSL9uPWuClECOOa9bSm6IogCylI9M4pQnX'
serialization.load_pem_public_key(publicKeyPem)

因此,最终,您的数据只是存在问题:它不是 PEM 公钥。

暂无
暂无

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

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