在python中获取公钥BIT STRING

问题描述 投票:0回答:1

我有 PEM 编码的证书。我想获取公钥的ASN.1 BIT STRING。我正在使用 pyca 的 cryptography 包。我得到的只是 DER 格式的整个主题公钥信息。我的问题是有什么简单的方法可以只获取公钥的位字符串吗?主要是,我想计算构建 OCSP 请求所需的issuerKeyHash

输入:

from cryptography import x509
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat

with open ("test_issuer.pem","rb") as file:
    pem_data = file.read()
    issuer_cert = x509.load_pem_x509_certificate(pem_data)

pubkey = issuer_cert.public_key()
pubkey_bytes = pubkey.public_bytes(encoding=Encoding.DER, format=PublicFormat.SubjectPublicKeyInfo)
print(pubkey_bytes.hex())

输出:

3059301306072a8648ce3d020106082a8648ce3d030107034200041306605a1910efd18b382f05719062bea9c63a118124bc3cde6a4959734ecef00129c92573255bca278f5a5f3e403128bd9b9ad9d5517c4f796120e673a9aa9e

如前所述,这是整个主题公钥信息(91 字节)。使用 ASN.1 查看器或 openssl,我观察到实际的位串(不包括所有算法信息、标签和长度)从字节 25 开始。我当然可以编写一个函数来读取所有标签和长度信息并提取位串。但是有没有内置的函数可以达到这个目的?

预期输出:

041306605a1910efd18b382f05719062bea9c63a118124bc3cde6a4959734ecef00129c92573255bca278f5a5f3e403128bd9b9ad9d5517c4f796120e673a9aa9e
python cryptography ocsp
1个回答
0
投票

您期望的输出是未压缩格式的十六进制编码的公钥。要获得未压缩的格式,只需更改编码和格式规范:

from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
...
pubkey_bytes = pubkey.public_bytes(Encoding.X962, PublicFormat.UncompressedPoint)
© www.soinside.com 2019 - 2024. All rights reserved.