Keytool是JDK自带的证书管理工具,在jdk/bin目录下,可以用来生成自签名证书、导入导出证书、打印证书信息等。
回顾下前一章的一些概念:
创建一个名为myjks的证书,存放在teststore.jks的密钥库中。
keytool -genkeypair -alias myjks -keysize 2048 -keyalg RSA -validity 3650 -keystore teststore.jks -storetype JKS
keytool -export -alias myjks -keystore teststore.jks -file myjks.crt
这个证书就可以分发给客户端使用。
keytool -list -v -keystore teststore.jks
keytool -list -rfc -keystore teststore.jks -storepass 12345678
keytool -alias myjks -exportcert -keystore teststore.jks -file teststore.cer
双击证书,可以查看cer内容,点安装证书就可以导入根证书。
keytool -list -rfc --keystore teststore.jks | openssl x509 -inform pem -pubkey
keytool -certreq -alias myjks -keystore teststore.jks -file teststore.csr
keytool -genkeypair -alias rootca -keysize 2048 -keyalg RSA -validity 3650 -keystore rootstore.jks -storetype JKS
keytool -gencert -alias rootca -keystore rootstore.jks -infile teststore.csr -outfile teststore_new.crt
可以看到teststore_new.crt的签发人已经变了:
keytool -import -v -alias rootca -file teststore_new.crt -keystore teststore.jks
这时证书链会发生变化 :
keytool -list -v -keystore teststore.jks
这时可以把root证书导出给客户端内置,服务端绑定二级证书,这样客户端验证时可以用根证书验证二级证书。大部分程序直接使用一级的自签名证书即可,但若需要双向验证,服务端验证客户端时不同客户端最好使用服务端的rootca私钥来签发,这样服务端可以直接用一个rootca的证书验证。实现了动态扩展且客户端的证书不同。
keytool -export -alias rootca -keystore teststore.jks -file rootca.crt
// 以rfc模式打印,即base64可见字符,与pem编码格式一样。 -v为详细输出
keytool -printcert -rfc -file rootca.crt
// 删除密钥库中的条目
keytool -delete -alias rootca -keystore teststore.keystore
// 修改证书库密码,输入旧密码或加参数 -storepass 111111
keytool -storepasswd -new 123456 -keystore truststore
// 修改某条目密码
keytool -keypasswd -alias myCA -keypass 654321 -new newpass -storepass 123456 -keystore myCALib