簡體   English   中英

如何使用私鑰將 .pfx 文件轉換為密鑰庫?

[英]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 密鑰庫。

編輯

更多信息:

  • 在此處下載適用於 Windows 的 OpenSSL。
  • 導出私鑰: 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 環境的解決方案。

預期結果:

  • PFX(示例中為foo.pfx )將被導入 JKS 密鑰庫(示例中為bar.keystore )。
  • 密鑰庫將使用新密碼(應稱為“簽名密碼”)進行保護。
  • 密鑰庫將包含一個密鑰。
  • 單個密鑰將有一個別名,其名稱與密鑰庫的名稱匹配(示例中為bar )。
  • 單個密鑰將受到簽名密碼的保護。
  • Xamarin 工具將能夠使用密鑰庫輕松簽署應用程序。

請注意,名稱和密碼不必匹配,但這是常見的做法,也是工具所期望的。

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

腳步:

  1. 獲取內部簽名的 PFX。 PFX 將有臨時分配的密碼。
  2. 從 PFX 導入 JKS 密鑰庫; 出現提示時,為目標密鑰庫密碼提供兩次簽名密碼,並為源密鑰庫密碼提供臨時分配的密碼。
     keytool -importkeystore -srckeystore foo.pfx -srcstoretype pkcs12 -destkeystore bar.keystore -deststoretype JKS
    生成的 JKS 密鑰庫將具有單個密鑰別名“1”,其臨時分配的密碼與步驟 1 中的 PFX 相同。
  3. 更改密鑰別名以匹配密鑰庫名稱; 出現提示時,為密鑰庫密碼提供簽名密碼,並為密鑰密碼提供臨時分配的密碼。
     keytool -changealias -alias 1 -destalias bar -keystore bar.keystore
  4. 將密鑰密碼更改為簽名密碼; 出現提示時,為密鑰庫密碼提供簽名密碼,為舊密鑰密碼提供臨時分配的密碼,為新密鑰密碼提供兩次簽名密碼。
     keytool -keypasswd -keystore bar.keystore -alias bar
  5. 確保完成的密鑰庫位於以下路徑,或根據您的安裝類似:
     %LOCALAPPDATA%\Xamarin\Mono for Android\Keystore\bar\bar.keystore

驗證內容:

  1. 查看原始PFX的內容; 出現提示時,為密鑰庫密碼提供臨時分配的密碼。
     keytool -list -v -keystore foo.pfx -storetype pkcs12
  2. 查看生成的密鑰庫的內容; 出現提示時,為密鑰庫密碼提供簽名密碼。
     keytool -list -v -keystore bar.keystore
  3. 比較第 1 步和第 2 步的輸出(例如,保存到文本文件並執行文件比較)。 內容應該相同(即證書鏈、指紋等;頁眉和頁腳文本會有所不同)。

在 Visual Studio 中使用 Ad-Hoc 分發選項時,您現在應該能夠查看和使用導入的密鑰庫。 出現提示時提供簽名密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM