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
写在最后,运用了证书认证后,系统会出现跨域问题,要注意!