使用Tomcat 9验证Https单向认证和双向认证

一、生成根证书颁发机构的密钥库

keytool -genkeypair -v -keystore root.p12 -storetype pkcs12 -storepass 123456 -alias 我是根证书 -keyalg RSA -keysize 2048 -validity 36500


二、生成服务器密钥库

keytool -genkeypair -v -keystore server.p12 -storetype pkcs12 -storepass 123456 -alias key -keyalg RSA -keysize 2048 -validity 36500


三、使用服务端密钥库生成证书请求

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


3.导入回复后的证书(证书请求在回复后是一个证书链)

keytool -importcert -file server.cer -keystore server.p12 -storepass 123456 -alias key




至此,后面使用Tomcat完整验证单向认证和双向认证的证书就已经准备完毕了

Tomcat 9验证单向认证和双向认证

注:因为上面的服务端证书设置名称为www.sy.com,为了能访问他,我们修改hosts文件:127.0.0.1   www.sy.com

一、单向认证

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访问端口为8443Tomcat已使用8080作为http的访问端口)

keystoreFile:存储加密证书的密钥库

keystorePass:密钥库访问密码(JKS格式的话,需要在生成密钥库时storepasskeypass相同)

clientAuth:是否验证客户端,false为单向认证,true为双向认证。双向认证时需要提供信任证书列表(需配置truststoreFiletruststorePass属性)

 

除了这三个属性,其他都尽量不要变。Tomcat在注释里面都写了一些Https配置的例子,只是没有添加上述的三个属性。

想更了解的话可以去看看官方文档:http://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html#Configuration

2. 安装CA根证书root.cerCA密钥库公钥)到可信任的根证书颁发机构(不然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访问端口为8443Tomcat已使用8080作为http的访问端口)

keystoreFile:存储加密证书的密钥库

keystorePass:密钥库访问密码(JKS格式的话,需要在生成密钥库时storepasskeypass相同)

truststoreFile保存信任证书的密钥库。这里只需要证书(公钥)即可,而我们服务端密钥库将客户端证书添加信任的同时也保存了他,所以这里可以直接设置服务端密钥库地址。假如有客户端的密钥库的话,或者新建了一个密钥库用以专门保存信任证书的话,也可以写它的地址,虽然我们只用它的公钥

truststorePass:保存信任证书密钥库的访问密码

clientAuth:是否验证客户端,false为单向认证,true为双向认证。双向认证时需要提供信任证书列表(需配置truststoreFiletruststorePass属性)

 

5. 安装CA根证书root.cerCA密钥库公钥)到可信任的根证书颁发机构

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. 之后就可以在最开始界面的左面列表发现证书->当前用户了,进去后可以看到隐藏的已安装的公钥证书,可以右键删除也可以在这里导入新的证书

猜你喜欢

转载自blog.csdn.net/edmond999/article/details/80179764
今日推荐