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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Tomcat是一种开源的Java Web服务器,Tomcat 9.0.62是其较新的版本之一。双向认证是指在建立通信连接时,双方彼此验证对方的身份,确保安全性和可靠性。 在Tomcat 9.0.62中实现双向认证,需要进行以下步骤: 1. 生成服务器端证书:首先,需要在服务器上生成一个自签名的服务器端证书。这可以使用Java的“keytool”命令来完成。该证书包含服务器的公钥和私钥。 2. 安装服务器端证书:生成证书后,需要将其安装在Tomcat的“conf”目录下,例如“server.crt”和“server.key”文件。 3. 配置Tomcat Connector:在Tomcat的“conf”目录中的“server.xml”文件中,找到“Connector”元素并配置其属性。添加“sslProtocol”属性,设置为“TLS”,以便启用SSL/TLS协议。另外,添加“keystoreFile”属性和“keystorePass”属性,分别指定服务器证书的路径和密码。确保设置“clientAuth”属性为“true”,以启用双向认证。 4. 生成客户端证书和密钥:在生成服务器端证书时,还可以生成用于客户端的证书和密钥。这可以通过Java的“keytool”命令和类似的步骤来完成。 5. 安装客户端证书:生成证书后,需要将其安装在客户端的信任库中。这可以通过将证书导入到客户端的“cacerts”文件中来完成,该文件位于JDK的“lib/security”目录下。 6. 配置客户端连接:在客户端的代码中,需要配置SSL/TLS连接以使用客户端证书。这可以通过设置Java系统属性来完成,例如“javax.net.ssl.keyStore”和“javax.net.ssl.keyStorePassword”的值分别为客户端证书和密码。 完成上述步骤后,双向认证就已经配置好了。当客户端向服务器发出请求时,服务器将验证客户端的身份,并使用客户端证书进行其验证。在通信过程中,双方都可以相互验证对方的身份,确保通信的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值