用JAVA创建PKCS12证书

用JAVA创建PKCS12证书,java,certificate,pkcs#12,Java,Certificate,Pkcs#12,下面是我想做的: 我连接到我的SSL服务器 它向我发送了两个证书,其中一个是自签名的 在这个阶段,没有问题,我: X509Certificate[] myTwoCerts; // with 2 certificates in there, and I'm sure it's there because, I print them in my console. 现在我想创建包含2个证书的.p12文件 到目前为止,我已经尝试过这样的方法: KeyStore pkcs12Store = K

下面是我想做的:

  • 我连接到我的SSL服务器

  • 它向我发送了两个证书,其中一个是自签名的

在这个阶段,没有问题,我:

X509Certificate[] myTwoCerts; 
// with 2 certificates in there, and I'm sure it's there because, I print them in my console.
  • 现在我想创建包含2个证书的.p12文件
到目前为止,我已经尝试过这样的方法:

KeyStore pkcs12Store = KeyStore.getInstance("PKCS12");
pkcs12Store.load(null, null);
X509Certificate cert1 = myTwoCerts[0];
X509Certificate cert2 = myTwoCerts[1]
String alias1 = "FIRST";
String alias2 = "SECOND";
pkcs12Store.setCertificateEntry(alias1, cert2);
pkcs12Store.setCertificateEntry(alias2, cert2);
但我得到了以下例外:

Exception in thread "main" java.security.KeyStoreException: TrustedCertEntry not supported

谁能帮我一下吗???

Java中的
PKCS12
密钥库不能用于存储没有私钥的证书或证书链

请参见以下文档中的注释:

“pkcs12”是另一个选项。这是一个基于RSA PKCS12个人信息交换语法标准的跨平台密钥库。本标准主要用于存储或传输用户的私钥、证书和其他机密。从JDK 6开始,在“pkcs12”中存储可信证书的标准尚未建立,因此“jks”或“jceks”应该用于可信证书

(尽管提到了JDK 6,但这仍然在JDK 7文档中。)

如果您想在Java的PKCS#12存储中存储私钥+证书(链),则需要私钥,并且需要使用
setKeyEntry
方法。

尽管Java 8(2014年3月发布)及以上版本确实支持trustedcert,但不一定可以与其他软件互操作。在Java 9(2017年)及以上版本中,默认的存储类型现在是PKCS12;jks和jceks仍然有效,但keytool警告它们是“专有的”。这将创建一个(新的)privatekey条目,而不是此问题所需的trustedcert条目。另外,将密钥库放在/tmp中可能是个坏主意。
keytool -trustcacerts -keystore keystore.p12 -storetype pkcs12   -alias root -genkeypair


KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
String filename = "/tmp/keystore.p12";
keyStore.load(
                    new FileInputStream(/*"myKeyStore.jks"*/filename),
                    password);