我有 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
您期望的输出是未压缩格式的十六进制编码的公钥。要获得未压缩的格式,只需更改编码和格式规范:
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
...
pubkey_bytes = pubkey.public_bytes(Encoding.X962, PublicFormat.UncompressedPoint)