最近的项目工作中使用到了比较多的证书,私钥转换命令。用来满足不同场景下对不同格式密钥的需求。现在整理一下,供以后项目参考
场景一,P7B格式证书的转换
p7b
是#PKCS7证书的格式,特点是有一个完整的证书链,从根证书到应用层证书。一般的大厂会有自己的PKI系统,PKI发布出来的证书通常都是这个p7b
格式的。p7b
格式不够直观,Java的keytool也不支持对其导入,因此我们将它转换成常见的cer / pem
格式
openssl pkcs7 -print_certs -in mine.certs.chain.p7b -out mine.certs.chain.cer
openssl pkcs7 -print_certs -in mine.certs.chain.p7b -out mine.certs.chain.pem
目录下会生成一份cer / pem
格式的证书文件。打开就是一份份切分好的证书合集,从根证书到应用层证书,一目了然。在Windows环境下,cer格式证书可以直接导入到系统证书管理器中。方便的成为系统信任的根证书。
场景二,PFX 转换为 PEM
这是一种个人信息交换(#PKCS12)格式,后缀名也可以是p12,是一种包含私钥和证书的合体文件,并且通常有密码进行保护,可以直接导入到操作系统中。
提取私钥:
openssl pkcs12 -in mine.pfx -nocerts -out key.pem -nodes
提取证书:
openssl pkcs12 -in mine.pfx -nokeys -out cert.pem
场景三,Java Keystore / Truststore 转换
搞Java开发免不了使用JDK自己的密钥管理标准。Java自带的keytool工具是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。
在Java中,有Keystore来存储个人信息交换(Keystore / #PKCS12),信任库(Truststore)。尤其是在TLS,签名,加密的场景下,对自签名的证书都需要添加到JDK的信任库中。
JDK/JRE默认的Truststore存放位置为:
$JAVA_HOME/jre/lib/security
以我们从PKI发布给我们的p7b证书为例,我们在转换成cer格式之后,执行如下的命令,就能导入到JDK信任链中,命令会让你输入cacerts信任库密码,默认为changeit
cd $JAVA_HOME/jre/lib/security
keytool -import -alias mine_trust_chain -keystore cacerts -file mine.certs.chain.cer
添加完之后可以查看存在的信任库
cd $JAVA_HOME/jre/lib/security
echo 'changeit' | keytool -list -rfc -keystore cacerts
也可以导出信任库所有信任链信息到文本文件
keytool -list -v -keystore cacerts > jdk-all-certs.txt
如果是要删除一个信任链,那么执行以下命令
cd $JAVA_HOME/jre/lib/security
keytool -delete -alias mine_trust_chain -keystore cacerts