将Java翻译为Python -- 用PEM证书文件签名字符串
我正在尝试把下面的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"