使用openssl创建证书并导入进java keystore
Java有自己的数字证书存储机制,叫做keystore,而keystore里面存储的数字证书,可以通过Java提供的keytool
工具来进行导入导出。导出的证书可以通过openssl进行操作,比如第三方数字签名,等等。本文介绍把openssl生成的数字证书导入keystore的过程。
生成keystore
首先是生成keystore。使用下面的keytool
命令生成keystore:
$ keytool -genkey -keystore as.ks -storepass dummy123 -keypass dummy123 -keyalg RSA -validity 365 -alias dummy -dname "cn=as,o=Personal,c=CN,ST=Beijing,L=Beijing"
通过以上的命令,我们生成了一个keystore的文件,叫做dummy.ks
,然后里面有一张默认生成的自签名证书,对应的CN
名为dummy.io
,然后证书在keystore里面保存的别名(alias)叫做dummy
。
注意如果你的这张证书要是用来作为你的https网站的服务器证书,要保证你的CN
名跟你的网站域名一致。
查看keystore里面的证书
使用下面的命令查看keystore里面默认保存的证书:
$ keytool -list -v -keystore dummy.ks -storepass dummy123 -alias dummy
通过上面的命令,我们查看alias名为dummy
的证书。从上面的截图可以看到这张证书的「所有者」和「发布者」都是dummy.io
,所以说它是一张「自签名」的证书。
使用openssl生成数字证书
openssl
有自己生成数字证书的机制,下面是命令:
$ openssl req -new -newkey rsa -days 365 -x509 -subj "/C=CN/ST=Beijing/L=Beijing/O=Personal/CN=foo.io" -keyout foo.key -out foo.crt
在上面,我们使用openssl
命令生成了数字证书,其中CN
为foo.io
。
注意上面openssl
生成的数字证书包含两个文件:
分别是foo.crt
和foo.key
。一个是证书文件,一个是签名证书的私钥文件,分开的。
以上是使用openssl
命令生成数字证书的过程。接下来讲解把openssl生成的证书导入进java这边的keystore。
导入openssl生成的数字证书至java的keystore
$ keytool -import -v -alias foo -file foo.crt -keystore dummy.ks -storepass dummy123
可以看到我们把这个foo.crt
的证书导入进了keystore文件dummy.ks
。
注意我们并没有把foo.key
,也就是签名证书的「私钥」导入进keystore,只是把自己签过名的证书导入进了keystore。
这个应该很好理解:我们如果把这张证书交给第三方机构去进行数字签名,我们并不能得到第三方签名机构的「私钥」。
接下来可以查看导入的证书。
在keystore里面查看导入的证书
$ keytool -list -v -keystore dummy.ks -storepass dummy123 -alias foo
从上面的命令执行结果,可以看到foo
这个证书已经在dummy.ks
这个keystore里面了。
接下来讲一下删除证书。
从keystore里面删除一个证书
我们可以从keystore里面删除一个证书,下面是命令:
$ keytool -delete -alias dummy -keystore dummy.ks -storepass dummy123
删除后再查看这个证书:
$ keytool -list -v -keystore dummy.ks -storepass dummy123 -alias foo
此时会发现报错这个证书已经不存在了:
以上就是从keystore里面删除证书的方法。
总结
这篇文章里面讲了一些openssl和keystore的基础交互操作。后续有机会再写一写更深入的话题,比如证书签名什么的。