[英]How to convert .pfx file to keystore with private key?
我需要簽署 Android 應用程序 ( .apk
)。
我有.pfx
文件。 我通過 Internet Explorer 將其轉換為.cer
文件,然后使用 keytool 將.cer
轉換為.keystore
。 然后我嘗試用 jarsigner 對.apk
進行簽名,但它說 .keystore 不包含私鑰。
我做錯了什么?
使用 JDK 1.6 或更高版本
Justin 在下面的評論中指出,僅 keytool 就能夠使用以下命令執行此操作(盡管僅在 JDK 1.6 及更高版本中):
keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12
-destkeystore clientcert.jks -deststoretype JKS
使用 JDK 1.5 或更低版本
OpenSSL 可以做到這一切。 這個關於 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
我找到了這個頁面,它告訴您如何將 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
jarsigner 可以使用您的 pfx 文件作為簽名 jar 的密鑰庫。 確保您的 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
賈斯汀(上圖)是准確的。 但是,請記住,根據您從誰獲得證書(中間 CA、是否涉及根 CA)或 pfx 的創建/導出方式,有時他們可能會丟失證書鏈。 導入后,您將擁有 PrivateKeyEntry 類型的證書,但鏈的長度為 1。
要解決此問題,有多種選擇。 在我看來,更簡單的選擇是在 IE 中導入和導出 pfx 文件(選擇包括鏈中的所有證書的選項)。 IE 中證書的導入和導出過程應該非常簡單,並且在其他地方有據可查。
導出后,按照 Justin 的說明導入密鑰庫。 現在,您將擁有一個證書類型為 PrivateKeyEntry 且證書鏈長度大於 1 的密鑰庫。
如果您不執行上述操作,某些基於 .Net 的 Web 服務客戶端會出錯(無法建立信任關系)。
您的 PFX 文件中應包含私鑰。 直接從您的 PFX 文件中導出私鑰和證書(例如使用 OpenSSL)並將它們導入您的 Java 密鑰庫。
編輯
更多信息:
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
keytool
將私鑰和證書導入 Java 密鑰庫。如果您使用 JDK 1.5 或更低版本,則 keytool 實用程序將沒有-importkeystore
選項(請參閱JDK 1.5 keytool 文檔),並且 MikeD 的解決方案只能通過在具有較新 JDK(1.6 或更高版本)的機器上傳輸.pfx
來提供)。
JDK 1.5 或更低版本(如果您有 Oracle WebLogic 產品)中的另一個選項是遵循此 Oracle 文檔中的說明: Using PFX and PEM Certificate Formats with Keystores 。 它描述了轉換為.pem
格式,如何從該文本格式中提取證書信息,並使用java utils.ImportPrivateKey
實用程序(這是 WebLogic 產品中包含的實用程序)將其導入為.jks
格式。
這是我針對 Visual Studio/Xamarin 環境的解決方案。
預期結果:
foo.pfx
)將被導入 JKS 密鑰庫(示例中為bar.keystore
)。bar
)。請注意,名稱和密碼不必匹配,但這是常見的做法,也是工具所期望的。
keytool
位置: %JAVA_HOME%\bin
,例如:
C:\Program Files\Android\jdk\microsoft_dist_openjdk_1.8.0.25\bin
C:\Program Files (x86)\Java\jre1.8.0_331\bin
腳步:
keytool -importkeystore -srckeystore foo.pfx -srcstoretype pkcs12 -destkeystore bar.keystore -deststoretype JKS
生成的 JKS 密鑰庫將具有單個密鑰別名“1”,其臨時分配的密碼與步驟 1 中的 PFX 相同。
keytool -changealias -alias 1 -destalias bar -keystore bar.keystore
keytool -keypasswd -keystore bar.keystore -alias bar
%LOCALAPPDATA%\Xamarin\Mono for Android\Keystore\bar\bar.keystore
驗證內容:
keytool -list -v -keystore foo.pfx -storetype pkcs12
keytool -list -v -keystore bar.keystore
在 Visual Studio 中使用 Ad-Hoc 分發選項時,您現在應該能夠查看和使用導入的密鑰庫。 出現提示時提供簽名密碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.