一、基本概念
X.509认证:国际证书格式标准,比较常用的一种认证方式,如日常使用的网银和支付宝等都在使用。
SSL:是一种安全协议,目的是为网络通信提供安全及数据完整性保障,SSL在传输层中对网络通信进行加密。
二、X.509证书制作
可以使用JDK自带的keytool工具制作证书,命令参考一下说明,参数值可以修改。
服务器证书生成:
1
<code>keytool -genkey -keyalg RSA -dname </code><code>"cn=localhost,OU=java, O=spring, L=landon, ST=YY, C=CN"</code> <code>-</code><code>alias</code> <code>server1 -keypass stevex -keystore d:\server1.jks -storepass stevex -validity 3650</code>
注:cn=localhost,这里localhost不能随便写,否则客户端认证时会出错。
客户端证书生成(双向认证才需要):
<code>keytool -genkey -keyalg RSA -dname </code><code>"CN=stevex, OU=gookle, O=goo, L=landon, ST=RR, C=CN"</code> <code>-</code><code>alias</code> <code>client1 -storetype PKCS12 -keypass stevex -keystore d:\client1.p12 -storepass stevex -validity 3650</code>
添加信任证书(双向认证才需要):
2
3
4
<code>##1.导出客户端证书为cer文件</code>
<code>keytool -</code><code>export</code> <code>-</code><code>alias</code> <code>client1 -</code><code>file</code> <code>d:\client1.cer -keystore d:\client1.p12 -storepass stevex -storetype PKCS12 -rfc</code>
<code>##2.将导出的文件导入服务器证书</code>
<code>keytool -</code><code>import</code> <code>-</code><code>v</code> <code>-</code><code>alias</code> <code>client1 -</code><code>file</code> <code>d:\client1.cer -keystore d:\server1.jks -storepass stevex</code>
客户端导入证书(双向认证才需要):
双击client1.p12然后根据提示操作可以将证书导入到IE;对于Firefox, 可以通过Options-->Advanced-->Certificate-->View Certificate-->Import 导入证书。
三、单向SSL认证
1. Spring 配置:
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?></code>
<code><</code><code>beans</code> <code>xmlns</code><code>=</code><code>"http://www.springframework.org/schema/beans"</code>
<code> </code><code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code> <code>xmlns:security</code><code>=</code><code>"http://www.springframework.org/schema/security"</code>
<code> </code><code>xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd</code>
<code> </code><code>http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"></code>
<code> </code><code><</code><code>security:http</code> <code>auto-config</code><code>=</code><code>'true'</code> <code>use-expressions</code><code>=</code><code>"true"</code><code>></code>
<code> </code><code><</code><code>security:intercept-url</code> <code>pattern</code><code>=</code><code>"/admin"</code> <code>access</code><code>=</code><code>"hasRole('ROLE_ADMIN')"</code> <code>requires-channel</code><code>=</code><code>"https"</code><code>/></code>
<code> </code><code><</code><code>security:intercept-url</code> <code>pattern</code><code>=</code><code>"/list"</code> <code>access</code><code>=</code><code>"hasRole('ROLE_USER')"</code> <code>requires-channel</code><code>=</code><code>"https"</code> <code>/></code>
<code> </code><code><</code><code>security:intercept-url</code> <code>pattern</code><code>=</code><code>"/**"</code> <code>requires-channel</code><code>=</code><code>"https"</code> <code>/></code>
<code> </code><code></</code><code>security:http</code><code>></code>
<code> </code><code><</code><code>security:authentication-manager</code><code>></code>
<code> </code><code><</code><code>security:authentication-provider</code><code>></code>
<code> </code><code><</code><code>security:user-service</code> <code>id</code><code>=</code><code>"userService"</code><code>></code>
<code> </code><code><</code><code>security:user</code> <code>authorities</code><code>=</code><code>"ROLE_USER"</code> <code>name</code><code>=</code><code>"stevex"</code>
<code> </code><code>password</code><code>=</code><code>"stevex"</code> <code>/></code>
<code> </code><code><</code><code>security:user</code> <code>authorities</code><code>=</code><code>"ROLE_USER, ROLE_ADMIN"</code>
<code> </code><code>name</code><code>=</code><code>"admin"</code> <code>password</code><code>=</code><code>"admin"</code> <code>/></code>
<code> </code><code></</code><code>security:user-service</code><code>></code>
<code> </code><code></</code><code>security:authentication-provider</code><code>></code>
<code> </code><code></</code><code>security:authentication-manager</code><code>></code>
<code></</code><code>beans</code><code>></code>
注:每个intercept-url element的requires-channel="https"都需要设置
2. Tomcat配置(server.xml):
在server.xml中增加一个Connector配置
<code><</code><code>Connector</code> <code>port</code><code>=</code><code>"8443"</code>
<code> </code><code>protocol</code><code>=</code><code>"HTTP/1.1"</code>
<code> </code><code>SSLEnabled</code><code>=</code><code>"true"</code> <code>scheme</code><code>=</code><code>"https"</code> <code>secure</code><code>=</code><code>"true"</code> <code>clientAuth</code><code>=</code><code>"false"</code>
<code> </code><code>sslProtocol</code><code>=</code><code>"TLS"</code> <code>keystoreType</code><code>=</code><code>"JKS"</code> <code>keystoreFile</code><code>=</code><code>"D:/server.jks"</code> <code>keystorePass</code><code>=</code><code>"stevex"</code> <code>/></code>
注:原来的HTTP 8080端口的Connector不能注释掉,否则无法启动服务器。这个Connector是新增而不是修改HTTP的,即同时配置两个Connector.
四、双向SSL认证
1. Spring配置:
22
23
<code> </code><code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code>
<code> </code><code>xmlns:security</code><code>=</code><code>"http://www.springframework.org/schema/security"</code>
<code> </code><code><</code><code>security:x509</code><code>/></code>
<code> </code><code>password</code><code>=</code><code>""</code> <code>/></code>
<code> </code><code>name</code><code>=</code><code>"admin"</code> <code>password</code><code>=</code><code>""</code> <code>/></code>
注: 增加<x509/>,密码也不需要了,Spring支持x509已经做得很到位了。
2. Tomcat配置:
在server.xml文件中增加一个Connector配置
<code> </code><code>SSLEnabled</code><code>=</code><code>"true"</code> <code>scheme</code><code>=</code><code>"https"</code> <code>secure</code><code>=</code><code>"true"</code> <code>clientAuth</code><code>=</code><code>"true"</code>
<code> </code><code>sslProtocol</code><code>=</code><code>"TLS"</code> <code>keystoreType</code><code>=</code><code>"JKS"</code> <code>keystoreFile</code><code>=</code><code>"D:/server1.jks"</code> <code>keystorePass</code><code>=</code><code>"stevex"</code>
<code> </code><code>truststoreFile</code><code>=</code><code>"D:/server1.jks"</code> <code>truststorePass</code><code>=</code><code>"stevex"</code><code>/></code>
注:增加truststoreFile和truststorePass两个属性,同时clientAuth属性的值更改为true。
3. 运行结果:
<a href="http://s3.51cto.com/wyfs02/M00/12/20/wKiom1L6HGezgZMCAACr1Oxmdx0754.jpg" target="_blank"></a>
<a href="http://down.51cto.com/data/2364055" target="_blank">附件:http://down.51cto.com/data/2364055</a>
本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1358215,如需转载请自行联系原作者