一、基本概念
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,如需轉載請自行聯系原作者