JDK自带工具keytool生成ssl证书

最近因为工作需要,所以略微了解了下CA认证,简单做了个demo。

对于基础知识可以参考

http://blog.csdn.net/guzicheng/article/details/38610621

http://blog.csdn.net/guzicheng/article/details/38610689?ABstrategy=codes_snippets_optimize_v3

http://www.cnblogs.com/sdjnzqr/p/4277092.html

个人觉得这几篇文章介绍的挺全面的。

下面是本人在做demo时顺手记下的。

 

一、为服务器生成证书

1、  cmd进入命令行

2、  cd进入c盘根目录 或 jdk的bin目录下

3、  使用keytool命令生成证书

keytool -genkey -alias tomcat -keypass 111111 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/keys/tomcat.keystore -storepass 111111 

注释:

-alias tomcat(别名) 

-keypass 123456(别名密码) 

-keyalg RSA(算法) 

-keysize 1024(密钥长度) 

-validity 365(有效期,天单位) 

-keystore D:/keys/tomcat.keystore(指定生成证书的位置和证书名称) 

-storepass 123456(获取keystore信息的密码)

 

注:1)D:/keys/ 目录需要提前手动创建好,否则会生成失败

2)“您的名字与姓氏是什么” 输入域名,不要输入IP地址

二、为客户端生成证书

为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,

keytool -genkey -alias client -keypass 111111 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore D:/keys/client.p12 -storepass 111111

 

三、让服务器信任客户端证书

1、  由于不能直接将PKCS12格式的证书库导入,所以必须先把客户端证书导出为一个单独的CER文件

keytool -export -alias client -keystore D:/keys/client.p12 -storetype PKCS12 -keypass 111111 -file D:/keys/client.cer

 

2、  将该文件导入到服务器的证书库,添加一个信任证书

keytool -import -v -file D:/keys/client.cer -keystore D:/keys/tomcat.keystore -storepass 111111

 

完成之后通过list命令可以查看服务端的证书库

keytool -list -v -keystore D:/keys/tomcat.keystore

四、让客户端信任服务器证书

1、  由于双向SSL认证,客户端也要验证服务端证书,因此,必须把服务端证书添加到浏览器的“受信任的根证书颁发机构”。

由于不能直接将keystore格式的证书库导入,必须先报服务器证书导出为一个单独的CER文件

keytool -keystore D:/keys/tomcat.keystore -export -alias tomcat -file D:/keys/server.cer

 

2、  双击server.cer文件,安装提示安装证书,将证书填入到“受信任的根证书颁发机构”。打开浏览器   - 工具  -  internet选项-内容- 证书-把中级证书颁发机构里的www.localhost.com(该名称即时你前面生成证书时填写的名字与姓氏)证书导出来-再把导出来的证书导入  受信任的根颁发机构  就OK了。

 

五、配置tomcat服务器

1、  Tomcat \conf下的server.xml

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

maxHttpHeaderSize = "8192" <!--属性值需要设置的大一点,否则会出现further occurrences of HTTP header parsing errors will be logged at DEBUG level.这个错误 -->

redirectPort="8443" />

 

<Connector port="8443"

protocol="org.apache.coyote.http11.Http11Protocol" <!--如果是jdk1.6属性值设置为HTTP/1.1,1.7则设置为org.apache.coyote.http11.Http11Protocol -->

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

clientAuth="false" sslProtocol="TLS"

keystoreFile="D:/keys/tomcat.keystore" keystorePass="111111"

truststoreFile="D:/keys/tomcat.keystore" truststorePass="111111"/>

        

2、  Tomcat \conf下的web.xml

<login-config>   

<!-- Authorization setting for SSL -->   

<auth-method>CLIENT-CERT</auth-method>   

<realm-name>Client Cert Users-only Area</realm-name>   

</login-config>   

<security-constraint>   

<!-- Authorization setting for SSL -->   

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

3、  属性说明:

clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证

keystoreFile:服务器证书文件路径

keystorePass:服务器证书密码

truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书

truststorePass:根证书密码

 

4、  注意:

① 设置clientAuth属性为True时,需要手动导入客户端证书才能访问。

② 要访问https请求 需要访问8443端口,访问http请求则访问Tomcat默认端口(你自己设置的端口,默认8080)即可。

 

六、配置web-info/web.xml

<!-- 强制SSL,即http请求自动跳转成https -->

<security-constraint>

<web-resource-collection>

  <web-resource-name>SSL</web-resource-name>

  <url-pattern>/*</url-pattern><!-- 全站使用SSL -->

</web-resource-collection>

<user-data-constraint>

<description>SSL required</description>

        <!-- CONFIDENTIAL: 确保传输数据不被修改,不能被查看-->

        <!-- INTEGRAL: 确保传输数据不被修改 -->

        <!-- NONE: 不做特殊限制-->                                                                                                                       

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

 

七、将服务导入jdk的cacerts中

keytool -import -alias tomcatsso -file "D:\keys\server.cer" -keystore "C:\Program Files\Java\jdk1.7.0_09\jre\lib\security\cacerts" -storepass changeit  

写在最后,运用了证书认证后,系统会出现跨域问题,要注意!

posted on 2017-03-20 13:57  晓怂样  阅读(224)  评论(0编辑  收藏  举报

导航