如何以正确的方式将密钥对放入密钥库?(以Java编程方式)

如何以正确的方式将密钥对放入密钥库?(以Java编程方式),java,ssl,ssl-certificate,keystore,encryption-asymmetric,Java,Ssl,Ssl Certificate,Keystore,Encryption Asymmetric,最好显示我的问题并在之后进行解释(我正在使用KeyStore Explorer查看我的.pfx文件): 基本上,我希望结果在右边,但我得到的结果在左边 更准确地说:密钥库应该在一个条目中包含私钥和证书链(密钥对) 我不知何故无法让它在java中工作。这就是我试图在左边得到的结果: 下面代码的问题是,它没有验证证书并将其添加为可信证书 /** *从提供的信息中创建并返回一个新的{@link KeyStore}。 *@param keystoreType{@link KeyStore}的类型。建议

最好显示我的问题并在之后进行解释(我正在使用KeyStore Explorer查看我的.pfx文件):

基本上,我希望结果在右边,但我得到的结果在左边

更准确地说:密钥库应该在一个条目中包含私钥和证书链(密钥对)

我不知何故无法让它在java中工作。这就是我试图在左边得到的结果: 下面代码的问题是,它没有验证证书并将其添加为可信证书

/**
*从提供的信息中创建并返回一个新的{@link KeyStore}。
*@param keystoreType{@link KeyStore}的类型。建议:“pkcs12”。
*有关详细信息,请查看{@link KeyStore#getInstance(String)}。
*@param passwordAsCharArray密码用于加密此{@link KeyStore}及其密钥。
*@param certificateChain证书链只是一个{@link X509Certificate}数组。
*@param privateKey{@link privateKey}。
*@param publicKey{@link publicKey}。
*@KeyStoreException
*/
公共密钥库buildAndGetKeystore(字符串keystoreType,char[]passwordsCharray,
X509Certificate[]certificateChain,PrivateKey PrivateKey,PublicKey PublicKey)
抛出KeyStoreException、CertificateException、IOException、NoSuchAlgorithmException、EmptyStringException、EmptyCharArrayException、EmptycertificateChaineException{
//检查空参数
对象。requirennull(keystoreType);
Objects.requirennull(passwordascharray);
对象。要求不完整(certificateChain);
对象。requirennull(私钥);
对象。requirennull(公钥);
//检查空参数
if(keystoreType.isEmpty())抛出新的EmptyStringException(“参数'keystoreType'不应为空!”);
如果(PasswordAsCharray.length==0)抛出新的EmptyCharrayException(“参数'PasswordAsCharray'不应为空!”);
如果(certificateChain.length==0)抛出新的EmptyCertificateChainException(“参数'certificateChain'不应为空!”);
//初始化新密钥库
KeyStore KeyStore=KeyStore.getInstance(keystoreType);
load(null,passwordascharray);//传递null告诉java这是一个新的密钥库
//插入证书
对于(int i=0;i
一些额外的细节:


右侧的密钥库是这样创建的:首先在sslforfree.com上生成证书,然后使用

将其转换为PKCS12密钥库。我创建了自己的证书链,并将此结构用于certificateChain:

X509Certificate[] certificateChain = new X509Certificate[3];
certificateChain[0] = topCertificate;
certificateChain[1] = middleCertificate;
certificateChain[2] = rootCertificate;
密钥库创建部分如下所示(我省略了“notNull检查”):

请注意,公钥不是存储过程的一部分,因为它可用于

certificateChain[0].getPublicKey()
在keystorexplorer中检查密钥库(我使用的是PKCS12密钥库)会得到以下输出:

以及关键链:


您没有对密钥库进行密码保护有什么原因吗?答案很简单-(我开玩笑!)我为什么要这样做?您的代码假设您想要直接“使用”密钥库而不需要存储。密钥项使用给定的密码(字符数组)进行保护,如果要在设备上保存密钥库,可以使用诸如“keystore.store(new FileOutputStream(keystore),password);”之类的代码,并使用与密钥项相同的密码。因此,您的问题的“正确”答案是:“它受密钥输入密码保护”:-)
certificateChain[0].getPublicKey()