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


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



java https 实现双向认证_Https单向认证



二、生成服务器密钥库


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



java https 实现双向认证_Https单向认证_02



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


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版本似乎不行啊

服务器密钥库信任CA根证书

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



java https 实现双向认证_Tomcat_03



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

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



java https 实现双向认证_Tomcat 9_04



java https 实现双向认证_Https单向认证_05


java https 实现双向认证_Https单向认证_06


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


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


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


一、单向认证


安装目录下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"

单向认证\server.p12" keystorePass="123456"

false" sslProtocol="TLS"/>

 

:https访问端口为8443(Tomcat已使用8080作为http的访问端口)

:存储加密证书的密钥库

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

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

 

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

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

安装CA根证书root.cer(CA密钥库公钥)到可信任的根证书颁发机构(不然https上会有叉叉,这样是我们为什么多此一举,自己生成根证书签名的原因)

 

打开https://www.sy.com:8443即可验证

注:

安装目录下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

二、双向认证


生成客户端密钥库client.p12

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

导出客户端证书client.cer

Keytool -exportcert -v -file client.cer -keystore client.p12 -storepass 123456 -alias client

将客户端证书client.cer导入服务端密钥库信任证书列表

Keytool -importcert -v -file client.cer -keystore server.p12 -storepass 123456 -alias client

网上有的将服务器证书添加进了客户端的证书信任列表,但是经测试,客户端不需要添加对服务端证书的信任也能正常访问


抱着验证是不是只要能找到信任证书路径,就可以了正常访问了的想法,我没将客户端的证书添加进服务端密钥库信任列表,而是直接保存在了一个新的密钥库里面

trustore.p12

配置文件如下:

<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"

双向认证\server.p12" keystorePass="123456"

双向认证\trustore.p12" truststorePass="123456"

true" sslProtocol="TLS"/>

打开https://www.sy.com:8443,访问成功!

配置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"

双向认证\server.p12" keystorePass="123456"

双向认证\server.p12" truststorePass="123456"

true" sslProtocol="TLS"/>

 

:https访问端口为8443(Tomcat已使用8080作为http的访问端口)

:存储加密证书的密钥库

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

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

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

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

 

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

6. 安装客户端密钥库到个人(注意,是密钥库而不是证书,因为在通信的时候需要用到私钥)

打开https://www.sy.com:8443验证、

其他说明


证书(*.cer、*.crt)

个人信息交换-PKCS#12(*.pfx、*.p12)//一个文件中可存储多个证书

证书信任列表(*.stl)

证书吊销列表(*.crl)

系列证书存储(*.cer、*.cer)//一个文件中可存储多个证书

加密消息语法标准-PKCS#7证书(*.spc、*.p7b)//一个文件中可存储多个证书

 

在只安装证书(公钥)的情况下,如.cer格式,在打开已安装证书列表中会找不到(安装到受信任的根证书颁发机构可以找到,其他的没测试)。可以通过以下方法找到:

输入命令:mmc

文件->添加/删除管理单元

3. 在左面列表中选择证书项,点击中间的添加按钮,在弹出界面中选择完成,回到原来界面选确定

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