在前天晚上处理一个tomcat配置证书的问题的时候,发现了一些新东西。在这里记录下来和大家分享一下。
这次处理的问题是,一个运维在更新他的tomcat证书的时候,发现更新的证书有问题,无法正常使用。然后我登到这个服务器上的时候发现,他给的证书目录下创建的默认证书是apikeystore.keystore
这样一个文件。还有从证书供应商那里下载的证书文件xxx.com.crt
,而web浏览器配置SSL正常情况下,需要有证书文件和私钥文件。但是他那里怎么都找不到私钥文件,经过仔细询问才知道。他用的是上一次购买的csr文件,直接发送到证书供应商那里购买的新证书,而旧的私钥文件找不到了。
正常的证书申请流程是:
- 生成一对公私钥
- 使用私钥创建证书申请请求,即certificate signing request,会生成一个.csr后缀的文件,这个过程中会在申请请求里输入自己的组织信息以及需要申请的域名。
- 将csr文件发送给证书供应商,由证书供应商签发你的证书。
- 签发完毕后,就可以在证书供应商的网站上下载各种格式的证书的。
在这个过程中,私钥一直是由你自己保存的,一定不能泄露。最后在你手上会有:
- 公私钥
- 证书签发请求文件
- 证书文件。
而tomcat它使用的证书支持两种格式:
-
.pfx
后缀的证书 -
.keystore
格式的证书
第一种证书是最常见的,很多网站都会使用这种包含证书和私钥文件的二合一证书。第二种是tomcat使用java的jdk自带的keytool
工具生成的证书,根据查询的信息可以知道,它实际上也是一个证书和私钥二合一的文件。也就是说,可以从它里面导出所需要的私钥,思路有了,就开始操作。
- 转换.keystore格式证书到.p12格式证书
.keystore
格式的证书,使用openssl
工具无法直接导出证书,需要先把它转换为.p12
这个openssl
工具支持的证书。至于.keystore
格式的证书能不能直接使用keytool工具直接导出证书,得留到后面再研究。.keystore
转.p12
的命令是:
keytool -importkeystore \
-srckeystore keystore.keystore \
-destkeystore keystore.p12 \
-deststoretype PKCS12 \
-deststorepass <password> \
-destkeypass <password>
参数解释:
-
-srckeystore
,后面跟上的是keystore文件 -
-destkeystore
,即要生成的p12格式证书文件名 -
-deststoretype
,要生成的p12格式证书文件格式,即PKCS12 -
-deststorepass
,要生成的p12格式证书文件密码,设置一个密码。需要用引号引起来,例如'yourpassword'
-
-destkeypass
,要生成的p12格式证书内私钥的密码。
执行这个命令后就会生成一个keystore.p12文件,在执行这个命令的过程中,会要求你们输入keystore.keystore这个文件的密码,然后我们就可以从这个文件里导出纯证书(不包含私钥)和私钥了。
导出证书的命令:
openssl pkcs12 -in keystore.p12 -nokeys -out cert.pem
导出私钥的命令
openssl pkcs12 -in keystore.p12 -nodes -nocerts -out key.pem
在执行上述两个命令的过程中,需要你输入上面设置的deststorepass
和destkeypass
密码。
最后我们就可以得到想要的私钥key.pem,如果想把它转成一个.key格式的私钥文件,也可以使用openssl工具来转换,命令是:
openssl rsa -in key.pem -out key.key
这样就可以得到最原始的私钥文件了。
获取到私钥文件后,使用私钥文件、自己网站域名的证书文件和根证书(CACert.crt,证书供应商提供)文件,生成一个.pfx格式的证书(里面包含私钥、网站域名证书文件和根证书):
openssl pkcs12 -export -out certificate.pfx -inkey key.key \
-in cer.pem -certfile CACert.crt
获取到pfx格式的证书后,在tomcat里配置使用:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" clientAuth="false"
sslProtocol="TLS" keystoreFile=”/path/to/mycert.pfx” keystoreType=”PKCS12″
keystorePass="your_PKCS12_password" />
keystore格式证书
最后说一下tomcat使用的另外一种证书的格式,这个证书的文件名后缀是.keystore
,之前没有见过这种证书,后面查询才知道是使用jdk工具包里的keytool
工具生成的一个证书格式。这个证书生成的流程是:
- 使用
keytool
工具生成一个mydomain.jks
文件,这里会给这个文件设置一个密码; - 使用
keytool
和mydomain.jks
文件来生成证书申请请求文件(.csr文件) - 将.csr文件发送到证书供应商那里申请证书
- 在证书供应商那里获取到
.p7b
后缀的证书文件 - 将获取到的
.p7b
后缀的证书文件放到mydomain.jks
文件一个目录下 - 在tomcat里的
server.xml
文件中配置使用mydomain.jks
文件
配置项如下:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS"/>
普通证书和私钥的配置模式
除了上面两种只使用一个文件的配置方式,tomcat还支持同时配置证书和私钥文件的模式:
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11AprProtocol"
secure="true" scheme="https"
SSLEnabled="true" SSLCertificateFile="/path/to/ocsp-cert.crt"
SSLCertificateKeyFile="/path/to/ocsp-cert.key"
SSLCACertificateFile="/path/to/ca.pem"
SSLVerifyClient="require"
SSLVerifyDepth="10"
clientAuth="true"/>
即不需要再转换证书格式,直接使用下载到的证书和自己保存的私钥路径。
网友评论