使用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命令生成了数字证书,其中CNfoo.io

注意上面openssl生成的数字证书包含两个文件:

分别是foo.crtfoo.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的基础交互操作。后续有机会再写一写更深入的话题,比如证书签名什么的。

Powered by Jekyll and Theme by solid