天天看點

Spring Security 學習之X.509認證

一、基本概念

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--&gt;Advanced--&gt;Certificate--&gt;View Certificate--&gt;Import 導入證書。

三、單向SSL認證

1. Spring 配置:

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;</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"&gt;</code>

<code>    </code><code>&lt;</code><code>security:http</code> <code>auto-config</code><code>=</code><code>'true'</code> <code>use-expressions</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>        </code><code>&lt;</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>/&gt;</code>

<code>        </code><code>&lt;</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>/&gt;</code>

<code>        </code><code>&lt;</code><code>security:intercept-url</code> <code>pattern</code><code>=</code><code>"/**"</code> <code>requires-channel</code><code>=</code><code>"https"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>security:http</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>security:authentication-manager</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>security:authentication-provider</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>security:user-service</code> <code>id</code><code>=</code><code>"userService"</code><code>&gt;</code>

<code>                </code><code>&lt;</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>/&gt;</code>

<code>                </code><code>&lt;</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>/&gt;</code>

<code>            </code><code>&lt;/</code><code>security:user-service</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>security:authentication-provider</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>security:authentication-manager</code><code>&gt;</code>

<code>&lt;/</code><code>beans</code><code>&gt;</code>

注:每個intercept-url element的requires-channel="https"都需要設定

2. Tomcat配置(server.xml):

在server.xml中增加一個Connector配置

<code>&lt;</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>/&gt;</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>&lt;</code><code>security:x509</code><code>/&gt;</code>

<code>                    </code><code>password</code><code>=</code><code>""</code> <code>/&gt;</code>

<code>                    </code><code>name</code><code>=</code><code>"admin"</code> <code>password</code><code>=</code><code>""</code> <code>/&gt;</code>

注: 增加&lt;x509/&gt;,密碼也不需要了,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>/&gt;</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,如需轉載請自行聯系原作者