keytool + openssl - 将JKS转换为PKCS12会丢失主题备用名称

时间:2017-11-09 19:09:53

标签: java ssl keytool

我已经搜索了其他问题并找到了非常有用的信息,但我无法找到我在这里遇到的具体问题的答案。

基本问题是:我有一个.JKS格式的Java密钥库,我需要将它(或至少是私钥)转换为PKCS12。 JKS密钥库包含带有SAN(主题备用名称)的证书条目,但在转换为.p12时,生成的PKCS12文件不包含密钥上的SAN。

Java 8,截至11/9/2017的最新OpenSSL。

我的最终目标是使用keytool生成CSR,然后使用该CSR使用OpenSSL生成自签名证书。 (这是供内部公司使用,因此我们不需要签名证书。)

我采取的步骤:

首先,我使用keytool在我的JKS密钥库中生成一个新密钥对,如下所示(域名/主机名/ IP已更改):

keytool -genkeypair -keystore my.keystore -dname" CN =主机名,OU =未知,O =未知,L =未知,ST =未知,C =未知" -keyalg RSA -alias 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 -file 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(keystore password)-srckeypass(keystore password)-destkeystore my.keystore.p12 -deststoretype PKCS12 -ssccalias mydomain -deststorepass(keystore password)-destkeypass(keystore password)

这似乎有效,再一次,我做了一个列表-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 pass :(密钥库密码)

最后我使用OpenSSL生成一个2048位的自签名证书:

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

当我查看生成的my.cer证书时,它不包含主题备用名称。它不存在。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

除非您尝试实现与keytool提供的内容不同的内容,否则keytool可以创建自签名证书。您可以在生成密钥对时添加扩展名。无论如何,keytool必须生成自签名证书,因为密钥对必须存储在密钥库(与其证书链相关联的私钥)中。

从技术上讲,您已经拥有自签名证书。您所能做的就是使用-exportcert命令导出该证书。

  

keytool -exportcert -keystore KEYSTORE -storepass PASSWORD -alias ALIAS> ALIAS.crt

keytool会在自签名证书中添加您的扩展程序。

答案 1 :(得分:1)

首先,你声称要创建my.keystore.p12,然后使用wasp.keystore.p12 - 那些显然不匹配,我认为这是一个错误。

其次,考虑到这一假设,我不相信p12有任何问题。您发布的命令实际上并没有在p12中查看证书;如果你这样做,我打赌你会发现它与JKS完全一样,包括SAN。它是由OpenSSL创建的第二个证书,而p12中的不是,它们将失去' SAN。

这是因为 req -x509并未在证书中提供CSR 的扩展名。它可以在证书中添加扩展,但仅限于其配置文件,而不是来自CSR。 x509的两个证书创建变体x509 -req -signkeyx509 -req -CA [-CAkey]同样忽略CSR中的任何扩展,并放入由明确指定的-extfile提供的仅限证书扩展。将扩展名放在CSR 中的证书中的唯一OpenSSL命令行操作是ca - 然后仅当配置更改为将copy_extensions设置为copy时或手册页中描述的copyall

请注意,如果您只想在PEM中使用密钥和自签名证书,那么OpenSSL可以比Java生成密钥更容易做到这一点;让OpenSSL把SAN放入证书有点困难,但是如果你看的话,你可以找到大约十几个现有的Q.如果你想在P12中使用它们,那也很容易。至少j6可以使用P12作为密钥库,如果程序是可配置的,则不需要任何JKS,即使不是8u60也是如此。