簡體   English   中英

keytool + openssl-將JKS轉換為PKCS12會丟失主題備用名稱

[英]keytool + openssl - convert JKS to PKCS12 loses the Subject Alternate Name

我搜索了其他問題,並找到了非常有幫助的信息,但是我在這里找不到特定問題的答案。

基本的問題/問題是:我有一個.JKS格式的Java密鑰庫,我需要將其(或至少是私鑰)轉換為PKCS12。 JKS密鑰庫包含帶有SAN(主題備用名稱)的證書條目,但是當轉換為.p12時,生成的PKCS12文件在密鑰上不包含SAN。

截至2017年11月9日的Java 8,最新的OpenSSL。

我的最終目標是使用keytool生成CSR,然后使用該CSR通過OpenSSL生成自簽名證書。 (這是供公司內部使用的,因此我們在這里不需要簽名證書。)

我已采取的步驟:

首先,我使用keytool在我的JKS密鑰庫中生成新的密鑰對,如下所示(域名/主機名/ IP已更改):

keytool -genkeypair -keystore my.keystore -dname“ CN =主機名,OU =未知,O =未知,L =未知,ST =未知,C =未知” -keyalg RSA-別名mydomain -ext SAN = dns:host.domain .com,ip:1.2.3.4

我使用“ keystore -v -list -keystore my.keystore進行了驗證:

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: host.domain.com
IPAddress: 1.2.3.4

好的,到目前為止很好。 接下來,我使用相同的-ext命令選項創建證書請求,並驗證它是否有效:

keytool -printcertreq-文件my.csr -v

PKCS #10 Certificate Request (Version 1.0)
Subject: CN=host, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
Public Key: X.509 format RSA key

擴展請求:

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: host.domain.com
IPAddress: 1.2.3.4

再次,到目前為止,一切都很好。 CSR確實包含SAN信息。

接下來,我將使用keytool將密鑰庫更改為.p12密鑰庫:

keytool -importkeystore -srckeystore my.keystore -srcstorepass(密鑰存儲密碼)-srckeypass(密鑰存儲密碼)-destkeystore my.keystore.p12 -deststoretype PKCS12 -srcalias mydomain -deststorepass(密鑰存儲密碼)-destkeypass(密鑰存儲密碼)

這似乎可行,再次,我做了一個列表-v -keystore my.keystore.p12:

擴充功能:

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: my.domain.com
IPAddress: 1.2.3.4

下一步是我懷疑存在問題的地方,但是找不到關於我可能缺少的內容的詳細信息。 我正在使用OpenSSL導出私鑰:

openssl pkcs12 -in wasp.keystore.p12 -passin pass :(密鑰庫密碼)-nocerts -out my.key -passout密碼:(keystore密碼)

最后,我使用OpenSSL生成2048位自簽名證書:

openssl req -x509 -sha256 -days 365 -key wasp.key -in my.csr -out my.cer

當我查看生成的my.cer證書時,它不包含主題備用名稱。 只是不在那里。

我錯過了什么?

除非您嘗試實現與keytool提供的功能不同的其他功能,否則keytool可以創建自簽名證書。 您可以在生成密鑰對時添加擴展名。 無論如何,密鑰工具都必須生成一個自簽名證書,因為這就是密鑰對必須存儲在密鑰庫(與其證書鏈相關聯的私鑰)中的方式。

因此,從技術上講,您已經擁有一個自簽名證書。 您所能做的就是使用-exportcert命令導出該證書。

keytool -exportcert -keystore KEYSTORE -storepass密碼-alias ALIAS> ALIAS.crt

keytool會將擴展名添加到您的自簽名證書中。

首先,您聲稱要創建my.keystore.p12,然后使用wasp.keystore.p12 -顯然這些不匹配,我認為這是一個錯誤。

其次,鑒於此假設,我認為p12不會有任何問題。 您發布的命令實際上並沒有查看p12中的證書。 如果您敢打賭,您會發現它與JKS中的完全一樣,並包含SAN。 這是OpenSSL創建的第二個證書, 完全不在 p12中創建,它“丟失”了SAN。

那是因為req -x509不會將CSR的擴展名放入證書中。 它可以將擴展名放在cert中,但只能從其配置文件中,而不能從CSR中。 x509的兩個創建證書的變體,即x509 -req -signkeyx509 -req -CA [-CAkey]類似地忽略了CSR中的任何擴展名,並將由顯式指定的-extfile提供的僅證書擴展名-extfile 唯一將CSR中的擴展名放入證書中的OpenSSL命令行操作是ca ,然后僅在配置已更改為將copy_extensions設置為copycopyall ,如手冊頁所述。

請注意,如果您只想在PEM中使用密鑰和自簽名證書,則OpenSSL可以比讓Java生成密鑰容易得多。 讓OpenSSL將SAN放入證書中要困難一些,但是如果您查找的話,大約可以找到12個現有Q。 如果要在P12中使用它們,這也很容易。 Java,因為至少j6可以在程序可配置的情況下使用P12作為密鑰存儲而不需要任何JKS,並且從8u60開始就可以使用P12作為密鑰存儲。

暫無
暫無

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

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