您的位置:首页 > 运维架构 > Tomcat

keytool生成keystore、truststore、证书以及SSL单向认证在服务端tomcat和客户端的配置

2017-09-21 10:51 656 查看

1 SSL单向认证概念

  当客户端(服务请求方)向服务端(服务提供方)发起请求时,服务器端需要向客户端提供认证。服务端需要生成一个keystore和一个服务器密钥对儿(公钥和私钥),客户端需要生成一个truststore,然后导入服务端的公钥证书。

2 keystore以及服务器密钥对儿的生成

keytool -genkeypair -alias certificatekey -keyalg RSA -validity 365 -keystore shfqkeystore.jks

这条命令会在生成keystore后接着生成一个密钥对儿。RSA是非对称密钥算法,也可以改为 keytool支持的其他密钥算法,365代表的是证书的有效期,可以自己指定,shfqkeystore.jks是keystroe的名称,也可以自己指定。打开cmd命令行,输入:

keytool -genkeypair -alias certificatekey -keyalg RSA -validity 365 -keystore shfqkeystore.jks

会提示输入keystore的密码,接着会提示输入名字等信息,如下图:



补充:输入<certificatekey>的主密码,是指生成服务端证书的私钥。服务端私钥如果和keystore的相同的话,直接按回车。建议直接按回车,即服务端私钥和keystore的密码相同。如果两者的密码不相同的话在服务端tomcat server.xml中配置完毕以后启动tomcat会报一个UnrecoverableKeyException: Cannot recover key的异常(后面会介绍服务端 tomcat server.xml 的配置的)。

keytool会把生成的keystore文件默认保存到C:\Users\lenovo路径下(用户目录下的计算机名称下)接下来生成的所有文件也都保存到此处。

3 验证新生成的keystor文件以及证书信息

可以执行下面的命令:

keytool -list -v -keystore shfqkeystore.jks

会显示出以下信息,如图:


 

4 导出公钥证书

下面的命令可以导出自签公钥证书:

keytool -export -alias certificatekey -keystore shfqkeystore.jks -rfc -file shfqcert.cer

其中shfqcert.cer是导出证书的名称,可以随便起个名字,shfqkeystore.jks是2中生成的keystore 文件。

执行上面的命令会要求输入shfqkeystore的密码,会显示以下信息,如下图。

 


5 Truststore的生成以及公钥证书的导入

把4生成的公钥证书shfqcert.cer导入到truststore中

Keytool -import -alias certificatekey -file shfqcert.cer -keystore 

shfqtruststore.jks

shfqcert.cer是4导出的公钥证书,shfqtruststore.jks可以随便起,是生成的truststore的文件名。这条命令首先会生成一个truststore,然后导入4生成的公钥证书shfqcert.cer。

执行keytool -import -alias certificatekey -file shfqcert.cer  -keystore shfqtruststore.jks后,首先会提示输入truststore的密码,如下图:


 

6 验证5生成的truststore文件

keytool -list -v -keystore shfqtruststore.jks

shfqtruststore.jks是5生成的truststore文件名。

 


到此为止,keystore、truststore、公钥证书都已生成完毕。

7 配置服务端的tomcat

找到tomcat安装路径下的conf路径下的server.xml文件

 

打开server.xml,找到

<!--

    <Connector port="8443" protocol="HTTP/1.1"   SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

-->

这样一段注释,在这段注释下面添加如下一段代码:

 

<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"

disableUploadTimeout="true" 

enableLookups="false" maxThreads="25"

    port="8443" keystoreFile="D:\developTools\apache-tomcat-idm\tomcat.keystore"  keystorePass="111111"

    protocol="org.apache.coyote.http11.Http11NioProtocol"  scheme="https"

secure="true" sslProtocol="TLS" />

 

其中clientAuth=”false”表示是SSL单向认证,即服务端认证,port=”8443”是https的访问端口,keystoreFile="D:\developTools\apache-tomcat-idm\tomcat.keystore"是第一步中生成的keystore的保存路径,keystorePass="111111"是第一步生成的keystore的密码。

到此服务器端已经配置完毕,为了验证是否已经配置正确,我们可以在浏览器中进行验证。首先启动tomcat,然后在浏览器地址输入栏中输入:https://localhost:8443

如果看到如下截图的一个页面则表示服务端已经配置成功了。


 

之所以会出现“该网站的安全证书不受信任!”的警告是因为证书是自己签发的而不是一个权威的CA机构签发的。

最后还得在hosts文件中配置自己的IP地址,把IP地址映射为一个common name,这个common name就是您在第2步中生成服务器证书时候的“您的名字与姓氏是什么?”输入的名字。

8 客户端配置

在客户端配置服务端的地址时要注意:比如 https://shifengqiang:8443/syn/Users   

这个地址协议格式是https主机名是shifengqiang,这个shifengqiang就是在第2步中生成服务器端证书时要求输入的“您的名字与姓氏是什么?”名字。8443是https协议默认的端口。

在客户端向服务器端同步代码前面加入这样一段代码:

 

System.setProperty("java.protocol.handler.pkgs",  "com.sun.net.ssl.internal.www.protocol");

    System.setProperty("java.protocol.handler.pkgs",  "com.ibm.net.ssl.internal.www.protocol");

String trustStorePath = 

   “D:\developTools\apache-tomcat-idm\shfqtruststore.jks”;

String trustStorePassword = “client”;

System.setProperty("javax.net.ssl.trustStore",  trustStorePath);

System.setProperty("javax.net.ssl.trustStorePassword",  trustStorePassword);

 

其中trustStorePath 是truststore的路径,trustStorePassword 是truststore的密码。至此单向SSL配置完毕。

参考链接:http://zjumty.iteye.com/blog/1885356

在配置的过程中参考了网上大量的链接,有些链接没有做记录恕不一一列举

转载:http://blog.csdn.net/shfqbluestone/article/details/21242323
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: