将Java翻译为Python -- 用PEM证书文件签名字符串

2 投票
3 回答
1396 浏览
提问于 2025-04-15 21:37

我正在尝试把下面的Java代码转换成Python代码。

 // certificate is contents of https://fps.sandbox.amazonaws.com/certs/090909/PKICert.pem
 // signature is a string that I need to verify.
 CertificateFactory factory = CertificateFactory.getInstance("X.509");
 X509Certificate x509Certificate = 
            (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certificate.getBytes()));
 Signature signatureInstance = Signature.getInstance(signatureAlgorithm);
 signatureInstance.initVerify(x509Certificate.getPublicKey());
 signatureInstance.update(stringToSign.getBytes(UTF_8_Encoding));
 return signatureInstance.verify(Base64.decodeBase64(signature.getBytes()));

这段代码是用在AWS FPS的PKI签名验证上。你可以在这里找到相关的文档:http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/VerifyingSignature.html

谢谢你的帮助!

3 个回答

0

经过一番考虑,我决定不使用本地库来验证签名(因为M2Crypto在64位Windows上不容易使用)。后来我发现,亚马逊的FPS API的新版本里有一个REST/SOAP调用可以用来验证签名,所以如果去他们服务器的请求不太贵的话,你可以直接调用VerifySignature。我在下一个版本的boto中添加了对这个功能的支持,叫做boto.fps.connection.verify_signature。

0

我写了很多关于X509的Python代码。每次我都习惯通过subprocess模块来调用openssl。最近,谷歌的keyczar库引起了一些关注,不过我自己还没用过它。

2

我查了一下用pyCrypto和keyczar来实现这个功能,但发现它们都不能解析X509证书。虽然keyczar有一个叫keyczar.util.ParseX509()的功能,但它的能力有限,不能处理AWS的证书,估计也不能处理其他实际使用中的证书。

我觉得M2Crypto可以用。下面这个代码片段需要一个真实的签名和明文内容才能真正测试。

from M2Crypto import X509

cert = X509.load_cert("PKICert.pem")
pub_key = cert.get_pubkey()

plaintext = "YYY"  # Put plaintext message here
signature = "XXX"  # Put signature of plaintext here

pub_key.verify_init()
pub_key.verify_update(plaintext)
if not pub_key.verify_final(signature):
    print "Signature failed"

撰写回答