如何生成Java PKCS12存储以连接到常规SSL网站



我们使用常规购买的SSL证书通过https运行标准web API。我们的客户端只需通过https访问,证书通过默认系统RootCA进行信任。

一个新客户端正在使用Java通信服务器,该服务器需要PKCS12密钥库中的证书。我们如何从密钥/csr/crt/pem文件生成PKS12密钥库?

我做了一些研究,大多数例子都需要私钥。当然,我不想与客户共享我们的私钥。

PKCS12密钥库是否可以在没有私钥的情况下创建,类似于浏览器中的标准RootCA?

谢谢,蓝美洲狮

YES ish

尽管PFX-now-PKCS12主要用于将私钥证书以及链证书存储或传输为一个簇,并且最常用于此,但它能够存储一个或多个与任何私钥都不匹配的"单独"证书。你是正确的,想要连接到你的客户端应该在他们的信任库中有服务器证书链的根证书,或者服务器证书本身,但绝对不是你的私钥。

openssl实际上可以创建这样一个PKCS12:

openssl pkcs12 -export -in certfile.pem [-name $name] -nokeys -out blah.p12 
# if you don't specify -name it defaults to 1 (the digit one) which can be mildly confusing
# instead of being prompted for the password you can use -passout with several forms
# described on the openssl man page, but consider the warning below

但是,如果他们使用标准的(Sun/Oracle/OpenJDK(加密提供程序,则结果在Java中不起作用。标准的加密提供程序(在8+中(支持PKCS12中的单个证书作为Java中的"trustedCert"条目,前提是(每个(证书包都有一个特殊的Sun定义的属性,Java提供程序在创建这样的文件时会写入该属性,但OpenSSL没有。

相反在8:中使用Java的密钥工具

jre8/bin/keytool -importcert -keystore blah.p12 -storetype pkcs12 -file $certfile [-alias $name]

或者在9+中,pkcs12现在是默认值:

jre9+/bin/keytool -importcert -keystore blah.p12 -file $certfile [-alias $name]

如果不指定别名,则默认为mykey。在这两种情况下,您都可以添加-storepass $pw以避免出现提示,但因此密码将在屏幕上可见,在您的shell或其他命令处理器的命令历史记录中,它是一个密码,在大多数情况下,同时运行在系统上的其他进程(任何进程(都可以看到密码,这可能是安全问题,也可能不是安全问题。您也可以添加-noprompt以避免出现确认提示。

但user207421(大致(正确地认为,使用这样的信任库可能会破坏从其系统(至少从同一JVM(建立的其他SSL/TLS连接,除非单独的调用指定了单独的、独立的信任库,并且如果他们已经编码,他们将知道如何处理(并要求(更简单的证书格式,如PEM。

最新更新