2010-11-18 145 views
86

我需要簽署Android應用程序(.apk)。
我有.pfx文件。我通過Internet Explorer將其轉換爲.cer文件,然後使用keytool將.cer轉換爲.keystore。然後我試着用jarsigner簽署.apk,但它說.keystore不包含私鑰。如何使用私鑰將.pfx文件轉換爲密鑰庫?

我在做什麼錯了?

+0

這可能是有用的:我如何找到並運行Windows的keytool http://stackoverflow.com/questions/5488339/how-can-i-find-and-run-the-keytool – 2014-04-07 06:29:25

回答

204

使用JDK 1.6或更高版本

已經指出的賈斯汀在低於密鑰工具單獨能夠做這個使用下面的命令(雖然只在JDK 1.6及更高版本)的評論:

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS 

使用JDK 1.5或以下

的OpenSSL可以做到這一切。 This answer on JGuru是迄今爲止我發現的最好的方法。

首先確保您已安裝OpenSSL。已經安裝了,因爲我發現與Mac OS X

以下兩個命令PFX文件轉換成可以被打開,一個Java PKCS12密鑰存儲的格式很多操作系統:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem 
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert" 

注意的是在第二個命令中提供的名稱是您的密鑰在新密鑰庫中的別名。

可以驗證使用Java keytool實用程序使用以下命令密鑰存儲的內容:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12 

最後,如果你需要,你可以通過導入創建的密鑰存儲將此轉換爲JKS密鑰存儲上述進入一個新的密鑰存儲:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS 
+25

不需要全部三個步驟,只需運行:keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS – JustinMorris 2012-08-22 21:40:06

+0

@Justin謝謝你指出這一點。 – MikeD 2012-10-04 09:51:27

+0

我認爲舊版本的keytool不會讓你這樣做。我記得8年前我必須運行openssl,但現在在Oracle JDK 6和7中使用keytool,就像Justin說的那樣,它就像一個魅力一樣。 – 2013-05-02 16:09:22

2

您的PFX文件應該包含其中的私鑰。直接從您的PFX文件(例如使用OpenSSL)導出私鑰和證書,並將它們導入您的Java密鑰庫中。

編輯

更多信息:

  • 下載OpenSSL的爲Windows here
  • 導出私鑰:openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • 導出證書:openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • 導入的私鑰和證書到使用keytool Java密鑰庫。
+0

您能否請提供關於這一點的更多信息? – Ola 2010-11-18 16:44:41

+0

你能告訴我如何使用keytool導入key.pem和cert.pem嗎? – 2012-12-30 07:20:38

+0

小增加:當輸出私有ky時,必須添加-nodes – 2016-05-27 15:46:46

20

的jarsigner可以使用您的PFX文件的密鑰庫簽署您的罐子。確保您的pfx文件在導出時擁有私鑰和證書鏈。沒有必要轉換爲其他格式。關鍵是要獲得您PFX文件的別名

keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias 

一旦你有你的別名,簽約容易

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias" 

以上兩個命令會提示你輸入你指定的密碼pfx出口。如果你想擁有你的密碼掛在明文-keystore開關之前使用-storepass開關

一旦簽署,佩服你的工作:

jarsigner.exe -verify -verbose -certs yourjarfile 
+0

簡單,併爲我工作 - 感謝 – CJM 2014-01-29 13:26:07

+1

+ +1無需轉換密鑰庫文件(我已經有足夠的格式了!) – Trejkaz 2014-02-17 05:43:44

15

我發現this頁告訴你如何導入PFX爲JKS(Java密鑰存儲):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME 
+1

這應該是完整的答案! – JustAGuy 2016-03-02 00:17:11

0

如果你有JDK 1.5或以下keytool工具的工作不會有-importkeystore選項(請參閱JDK 1.5 keytool documentation),MikeD的解決方案只有在具有較新JDK(1.6或更高版本)的計算機上傳輸.pfx纔可用。

JDK 1.5或更低版本(如果您有Oracle WebLogic產品)的另一個選擇是遵循此Oracle文檔的說明:Using PFX and PEM Certificate Formats with Keystores。 它描述瞭如何從此文本格式中提取證書信息,並使用java utils.ImportPrivateKey實用程序(這是WebLogic產品附帶的實用程序)將其導入.jks格式,並將其轉換爲.pem格式。

2

賈斯廷(上圖)是準確的。但是,請記住,根據您從哪個人(中級CA,涉及的根CA)獲取證書或者如何創建/導出pfx,有時可能會丟失證書鏈。導入後,您將擁有PrivateKeyEntry類型的證書,但其長度爲1.

要解決此問題,有幾個選項。在我腦海中,更容易的選擇是在IE中導入和導出pfx文件(選擇包含鏈中所有證書的選項)。 IE中證書的導入和導出過程應該很容易,並且在其他地方有很好的文檔記錄。

導出後,導入上面指出的Justin的密鑰庫。 現在,您將擁有一個具有PrivateKeyEntry類型證書和證書鏈長度超過1的密鑰庫。

某些基於.Net的Web服務客戶端出錯(無法建立信任關係),如果您不做到以上。

+0

這似乎不適用於IE11。即使我要告訴它,它也沒有包含證書鏈。但我知道這在過去是有效的。 – 2016-01-15 14:18:58

相關問題