2010-04-15 44 views
2

我試圖將遵循Java轉換爲其Python等效項。將Java轉換爲Python - 使用PEM證書文件簽名字符串

// 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

感謝您的幫助!

+0

我已經爲此添加了賞金。我會接受任何完整的實施。我更喜歡使用最小依賴性的實現,儘管我認識到要解碼x509證書並執行RSA簽名需要PyCrypto或類似軟件。另外,實現應該可移植到Windows,並且應該在進程中運行(不需要子進程調用)。 – 2010-09-17 15:57:37

+0

如果您提供了一個要驗證的示例簽名,這將非常有幫助。從代碼看起來它是Base64編碼的。 – Von 2010-09-23 02:09:26

回答

0

我寫了很多處理X509內容的Python代碼。我一直回到通過子進程模塊調用openssl。谷歌的keyczar圖書館雖然從未使用過它,但仍有一些嗡嗡聲。

2

我看着用pyCrypto和keyczar做這件事,但問題是沒有能力解析X509證書(keyczar有keyczar.util.ParseX509(),但它是有限的,並且不適用於AWS證書或I猜測任何真實世界的證書)。

我相信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" 
+1

我想到的一個想法是,如果您願意使用openssl來提取RSA密鑰並保存到可能使用pyCrypto的文件中,那麼AWS證書中的RSA密鑰不可能經常更改keyczar與原始RSA密鑰。 – Von 2010-09-23 15:32:19

0

畢竟是說,做,我決定不使用本機庫驗證簽名(因爲M2Crypto輕易不會移植到64位Windows)。我發現後續版本的Amazon FPS API包含一個REST/SOAP調用來驗證簽名,因此如果往返服務器的往返不太昂貴,則可以撥打VerifySignature。我在boto的下一個版本中增加了對boto.fps.connection.verify_signature的支持。