2012-09-17 52 views
5

我需要在python中生成一個包含自簽名證書和私鑰的PKCS12文件。我組裝了下面的Python代碼完成這個任務:是否有可能在Python中生成正確的PKCS12(.pfx)文件?

import OpenSSL 
key = OpenSSL.crypto.PKey() 
key.generate_key(OpenSSL.crypto.TYPE_RSA, 1024) 
cert = OpenSSL.crypto.X509() 
cert.set_serial_number(0) 
cert.get_subject().CN = "me" 
cert.set_issuer(cert.get_subject()) 
cert.gmtime_adj_notBefore(0) 
cert.gmtime_adj_notAfter(10*365*24*60*60) 
cert.set_pubkey(key) 
cert.sign(key, 'md5') 
open("certificate.cer", 'w').write( 
    OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)) 
open("private_key.pem", 'w').write( 
    OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key)) 
p12 = OpenSSL.crypto.PKCS12() 
p12.set_privatekey(key) 
p12.set_certificate(cert) 
open("container.pfx", 'w').write(p12.export()) 

這段代碼創建一個.CER文件,我可以在Windows中查看和似乎是正確的。它還創建了一個「.pfx」文件,該文件旨在成爲具有證書和相應私鑰的「PKCS#12」容器 - 簽署可執行文件所需的東西。不幸的是,如果我嘗試打開W​​indows上失敗這個「.PFX」文件‘文件無效’的錯誤,並通過命令行工具解析它也失敗:

certutil -asn container.pfx 

與‘解碼錯誤’的失敗文件的中間。

是我在我的代碼中做錯了什麼或者Python + OpenSSL不打算在Windows下創建有效的PKCS#12文件?

P.S.我正在使用最新的ActivePython 2.7 32位版本。

回答

10

我有一個假設,你需要在二進制模式下打開container.pfx

open("container.pfx", 'wb').write(p12.export()) 
+0

非常合理的假設:) –

+1

哦。再次,這個自動的「\ n」翻譯在幾個工作小時內對我造成嚴重影響:(。非常感謝!Stackoverflow真棒:)。 – grigoryvp

+1

我也滑了幾個小時!感謝您的帖子:-) –

相關問題