如何用Python cryptography库验证分离式PKCS7/SMIME签名?
使用cryptography库复现OpenSSL SMIME签名验证命令
你提到的PKCS7/SMIME签名验证功能,在cryptography 3.4版本及以上已正式支持,无需依赖内部测试代码,以下是对应OpenSSL命令的实现方案:
核心实现代码
from cryptography.hazmat.primitives.serialization import pkcs7 from cryptography.x509 import load_pem_x509_certificate from cryptography.hazmat.backends import default_backend # 加载CA证书(对应OpenSSL的-CAfile ca.crt) with open("ca.crt", "rb") as f: ca_cert = load_pem_x509_certificate(f.read(), default_backend()) # 加载DER格式的签名文件(对应OpenSSL的-inform der -in sig.rsa) with open("sig.rsa", "rb") as f: pkcs7_signature = pkcs7.load_der_pkcs7_signature(f.read()) # 加载原始内容文件(对应OpenSSL的-content data.txt) with open("data.txt", "rb") as f: content = f.read() # 执行签名验证(对应OpenSSL的-verify -purpose any) try: pkcs7_signature.verify( content=content, trusted_certificates=[ca_cert], purpose=pkcs7.Purpose.ANY ) print("签名验证通过") except pkcs7.InvalidSignature: print("签名验证失败")
关键说明
- 必须确保cryptography版本≥3.4,旧版本不支持该验证API
- 代码中
pkcs7.Purpose.ANY对应OpenSSL命令的-purpose any,若需特定用途验证,可替换为pkcs7.Purpose.EMAIL_PROTECTION等枚举值 - 验证失败会抛出
pkcs7.InvalidSignature异常,需捕获处理
内容的提问来源于stack exchange,提问作者cegfault
相关产品推荐
相关产品推荐

