一、生成根证书颁发机构的密钥库
keytool -genkeypair -v -keystore root.p12 -storetype pkcs12 -storepass 123456 -alias 我是根证书 -keyalg RSA -keysize 2048 -validity 36500
![](https://i-blog.csdnimg.cn/blog_migrate/eae824432538cc11d3e9c98bf08f0d83.png)
二、生成服务器密钥库
keytool -genkeypair -v -keystore server.p12 -storetype pkcs12 -storepass 123456 -alias key -keyalg RSA -keysize 2048 -validity 36500
![](https://i-blog.csdnimg.cn/blog_migrate/783ff70483ee1f2845e5e0246e3802c9.png)
三、使用服务端密钥库生成证书请求
keytool -certreq -keystore server.p12 -storepass 123456 -alias key -file server.csr
四、使用CA密钥库认证此证书,并导出认证后的新证书
keytool -gencert -v -infile server.csr -outfile server.cer -keystore root.p12 -storepass 123456 -alias 我是根证书
五、将认证后的证书重新导入服务端密钥库
进行这一步前,需要将CA根证书导入服务器密钥库信任列表
1. CA密钥库导出CA根证书:
keytool -exportcert -file root.cer -keystore root.p12 -storepass 123456 -alias 我是根证书
如果不导入则会报:keytool 错误: java.lang.Exception: 无法从回复中建立链
似乎以前的版本可以直接导入,但是我用的这个JDK8版本似乎不行啊
2. 服务器密钥库信任CA根证书
keytool -importcert -file root.cer -keystore server.p12 -storepass 123456 -alias root
![](https://i-blog.csdnimg.cn/blog_migrate/ee434df512ee27cde9c3d3de06dbed32.png)
3.导入回复后的证书(证书请求在回复后是一个证书链)
keytool -importcert -file server.cer -keystore server.p12 -storepass 123456 -alias key
![](https://i-blog.csdnimg.cn/blog_migrate/feb8c61d52e424b15107966cdb2bbb0f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c900212917fafeb615d5d5ab488fa52c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fc1b346a1ed7c6357469d51db486338e.png)
Tomcat 9验证单向认证和双向认证
一、单向认证
1. Tomcat安装目录下conf\server.xml修改注释更改为以下内容,或者直接更改:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\CodeProjects\IdeaWebProjects\TomcatHttpsConfigure\单向认证\server.p12" keystorePass="123456"
clientAuth="false" sslProtocol="TLS"/>
port="8443":https访问端口为8443(Tomcat已使用8080作为http的访问端口)
keystoreFile:存储加密证书的密钥库
keystorePass:密钥库访问密码(JKS格式的话,需要在生成密钥库时storepass和keypass相同)
clientAuth:是否验证客户端,false为单向认证,true为双向认证。双向认证时需要提供信任证书列表(需配置truststoreFile,truststorePass属性)
除了这三个属性,其他都尽量不要变。Tomcat在注释里面都写了一些Https配置的例子,只是没有添加上述的三个属性。
想更了解的话可以去看看官方文档:http://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html#Configuration
2. 安装CA根证书root.cer(CA密钥库公钥)到可信任的根证书颁发机构(不然https上会有叉叉,这样是我们为什么多此一举,自己生成根证书签名的原因)
打开https://www.sy.com:8443即可验证
注:
Tomcat安装目录下conf\web.xml文件里添加如下内容即可将http的访问全部定向为https:
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
打开http://www.sy.com:8080会直接跳转到https://www.sy.com:8443
二、双向认证
1. 生成客户端密钥库client.p12
keytool -genkeypair -v -keystore client.p12 -storetype pkcs12 -storepass 123456 -alias client -keyalg RSA -keysize 2048 -validity 36500
2. 导出客户端证书client.cer
Keytool -exportcert -v -file client.cer -keystore client.p12 -storepass 123456 -alias client
3. 将客户端证书client.cer导入服务端密钥库信任证书列表
Keytool -importcert -v -file client.cer -keystore server.p12 -storepass 123456 -alias client
3.1网上有的将服务器证书添加进了客户端的证书信任列表,但是经测试,客户端不需要添加对服务端证书的信任也能正常访问
3.2
抱着验证是不是只要能找到信任证书路径,就可以了正常访问了的想法,我没将客户端的证书添加进服务端密钥库信任列表,而是直接保存在了一个新的密钥库里面
Keytool -importcert -v -file client.cer -alias client -keystore trustore.p12 -storepass 123456 -storetype pkcs12
配置文件如下:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\CodeProjects\IdeaWebProjects\TomcatHttpsConfigure\双向认证\server.p12" keystorePass="123456"
truststoreFile="C:\CodeProjects\IdeaWebProjects\TomcatHttpsConfigure\双向认证\trustore.p12" truststorePass="123456"
clientAuth="true" sslProtocol="TLS"/>
打开https://www.sy.com:8443,访问成功!
4. 配置server.xml
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\CodeProjects\IdeaWebProjects\TomcatHttpsConfigure\双向认证\server.p12" keystorePass="123456"
truststoreFile="C:\CodeProjects\IdeaWebProjects\TomcatHttpsConfigure\双向认证\server.p12" truststorePass="123456"
clientAuth="true" sslProtocol="TLS"/>
port="8443":https访问端口为8443(Tomcat已使用8080作为http的访问端口)
keystoreFile:存储加密证书的密钥库
keystorePass:密钥库访问密码(JKS格式的话,需要在生成密钥库时storepass和keypass相同)
truststoreFile:保存信任证书的密钥库。这里只需要证书(公钥)即可,而我们服务端密钥库将客户端证书添加信任的同时也保存了他,所以这里可以直接设置服务端密钥库地址。假如有客户端的密钥库的话,或者新建了一个密钥库用以专门保存信任证书的话,也可以写它的地址,虽然我们只用它的公钥
truststorePass:保存信任证书密钥库的访问密码
clientAuth:是否验证客户端,false为单向认证,true为双向认证。双向认证时需要提供信任证书列表(需配置truststoreFile,truststorePass属性)
5. 安装CA根证书root.cer(CA密钥库公钥)到可信任的根证书颁发机构
6. 安装客户端密钥库到个人(注意,是密钥库而不是证书,因为在通信的时候需要用到私钥)
打开https://www.sy.com:8443验证、
其他说明
X.509证书(*.cer、*.crt)
个人信息交换-PKCS#12(*.pfx、*.p12)//一个文件中可存储多个证书
证书信任列表(*.stl)
证书吊销列表(*.crl)
Microsoft系列证书存储(*.cer、*.cer)//一个文件中可存储多个证书
加密消息语法标准-PKCS#7证书(*.spc、*.p7b)//一个文件中可存储多个证书
在只安装证书(公钥)的情况下,如.cer格式,在打开已安装证书列表中会找不到(安装到受信任的根证书颁发机构可以找到,其他的没测试)。可以通过以下方法找到:
1. Win+R->输入命令:mmc
2. 文件->添加/删除管理单元
3. 在左面列表中选择证书项,点击中间的添加按钮,在弹出界面中选择完成,回到原来界面选确定
4. 之后就可以在最开始界面的左面列表发现证书->当前用户了,进去后可以看到隐藏的已安装的公钥证书,可以右键删除也可以在这里导入新的证书