最近需要对SSL证书这块进行部署和各类型证书转换,记录一些中间使用到的命令。
先说下怎么获取证书。
首先是生成私钥:
openssl genrsa -out private.key 2048
openssl genrsa -aes256 -passout pass:123456 -out private.key 2048
上面是生成2048bit不带密码的私钥和带密码的私钥
然后是生成证书请求文件(CSR):
openssl req -new -key private.key -out example.csr
会提示你输入国家、省份、城市等信息
输入完成会得到一个csr文件。
我们拿这个csr就可以直接去CA机构申请证书。
CA机构给我们的一般都是PEM格式的证书
大概的文件会有:网站的SSL证书文件、如果是双向验证的话可能会提供客户端Email证书文件(拿来访问网站使用)、证书链文件。
这时候我们会有:私钥文件、csr文件、SSL证书文件、证书链文件、Email证书文件(可能存在)。
Tomcat使用https需要用到keystore文件,在tomcat官网文档其实都有说明的。
http://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html
先生成一个jks(java key store)
openssl pkcs12 -export -in certificate.crt -inkey private.key -nodes -password pass:123456 -out example.p12
keytool -v -importkeystore -srckeystore example.p12 -srcstoretype PKCS12 -destkeystore example.jks -deststoretype JKS
上面的命令意思是:先把证书certificate.crt和私钥private.key转成一个带密码的p12文件(有些也叫pfx)。密码是123456。使用keytool工具将pkcs12格式的文件转成jks里面包含了证书和密钥对。
在这个过程当中p12文件的密码最好和jks的密码保持一致,在这里踩过一次坑。
如果不一致,部署tomcat的时候会导致:
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
我们可以修改里面密钥对的密码,修改和jks的密码一致:
keytool -keypasswd -keystore example.jks -alias 1
-alias后面跟着的“1”是别名,不指定的情况下一般默认都是1。
在部署双向SSL的时候需要一个信任列表,就是说那些ca签发的客户端证书可以访问到我们的网站。
使用keytool命令导入签发客户端证书的ca证书:
keytool -import -file trustca.cer -keystore trustca.jks
如果没有jks会自动创建的,tomcat需要的两个jks已经有了example.jks、trustca.jks。
Tomcat8.5以下和8.5以上的部署方式不太一样的,但使用的文件都是一样的,部署以TOMCAT8.0.53为例,来看看server.xml里面的配置:
把下面这个配置放开并且配置SSL证书(这个是单向的SSL,不需要客户端选择证书的)
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="/home/testservice/key/example/example.jks" keystorePass="123456" />
双向的只要添加两个参数就行,把clientAuth改为true(clientAuth有几个值,看自己的需要选择):
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" keystoreFile="/home/testservice/key/example/example1.jks" keystorePass="123456"
truststoreFile="/home/testservice/key/example/trustca.jks" truststorePasss="123456" />
以上是生成到部署的全部过程。
Tomcat8.5的双向SSL配置如下(单向的把SSLHostConfig其他参数去掉就行):
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig certificateVerification="require" truststoreFile="/home/testservice/key/example/trustca.jks" truststorePassword="123456">
<Certificate certificateKeystoreFile="/home/testservice/key/example/example.jks" type="RSA" certificateKeystorePassword="123456"/>
</SSLHostConfig>
</Connector>
具体配置参数在这里有:
http://tomcat.apache.org/tomcat-8.5-doc/config/http.html
最后来个图吧:
以下是在解惑的过程中在网上找到的有关命令:
提取密钥对:
openssl pkcs12 -in example.pfx -nocerts -nodes -out keypair.key
密钥对提取私钥:
openssl rsa -in keypair.key -out example_private.key
密钥对提取公钥:
openssl rsa -in keypair.key -pubout -out example_pub.key
pfx提取证书
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
查看jks
keytool -list -v -keystore example.jks
创建JKS
keytool -genkey -alias eyestrip -keystore example.jks