如何从 Java 密钥库中的证书链中仅删除一个证书

How to remove just one certificate from a certificate chain in a Java keystore

我有一个 Tomcat 服务器,其证书链存储在 Java 密钥库中。该链包括自签名根 CA 证书。尽管 the TLS spec, some validation services warn about it, and it's probably better to leave it off.

这显然没问题

如何编辑密钥库以仅删除自签名根 CA 证书,而保留链的其余部分和私钥不变?

首先,将密钥库从 JKS 转换为 PKCS12(此命令和其他命令需要输入密码):

keytool -importkeystore -srckeystore old.jks -destkeystore old.p12 -deststoretype pkcs12

接下来,从 PKCS12 文件中导出包含密钥和证书的 PEM 文件:

openssl pkcs12 -in old.p12 -out pemfile.pem -nodes

现在只需使用文本编辑器编辑 pemfile.pem 并删除有问题的证书(及其前面的 "Bag Attributes")。

接下来,将编辑后的 ​​PEM 文件加载到新的 PKCS12 文件中。您需要为 cert/key 提供适当的密钥库别名,例如"tomcat",至此

openssl pkcs12 -export -in pemfile.pem -name tomcat -out new.p12

最后,从 PKCS12 转换回 JKS:

keytool -importkeystore -srckeystore new.p12 -destkeystore new.jks -srcstoretype pkcs12

文件new.jks就是你想要的

keytool -delete -alias -keystore lib/security/cacerts -storepass changeit