jboss(或jetty)配置成ssl,通過spring security控制http/https切換

春運搶票鬧的心慌慌,還好客戶體諒,沒多大任務,就是實現一個ssl。功能實現,趁下班還有一個小時之際,邊打醬油,邊嘔心瀝血完成此篇。歡迎灌水,給意見。

 

 

 

背景:項目發佈環境是jboss服務,開發環境是jetty服務。因此小結一下jboss 和jetty如何配置成ssl,以及如何通過spring security來控制http/https的切換。本篇不針對所涉及的知識做介紹,

只跟大家分享一下如何使用。

 

一、準備好keystore

    對keystore不瞭解的同學可以參考一下《Java_keytool_安全證書學習筆記》。

    以下是我在cmd中的操作:

 

     第一步:爲服務器生成證書

keytool -genkey -alias jboss -keyalg RSA -keystore D:\jboss.keystore -dname "CN=10.108.110.88, OU=cn, O=cn, L=cn, ST=cn, C=cn" -keypass 888888 -storepass 888888

     第二步:爲客戶端生成證書

keytool -genkey -v -alias myKey -keyalg RSA -storetype PKCS12 -keystore D:\my.p12 -dname "CN=MyKey, OU=cn, O=cn, L=cn, ST=cn, C=cn" -keypass 888888 -storepass 888888

     第三步:讓服務器信任客戶端證書

keytool -export -alias myKey -keystore D:\my.p12 -storetype PKCS12 -storepass 888888 -rfc -file D:\my.cer

 

keytool -import -v -file F:\my.cer -keystore D:\jboss.keystore -storepass 888888

 

      以上操作是爲了雙向認證時準備了兩個證書,但是項目只用了單向認證。

 

二、將服務配成ssl

       2.1 將jboss服務配置成ssl

       2.1.1、打開%JbossHOME%\server\default\deploy\jboss-web.deployer\server.xml。找到

 

    <!--

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

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

               clientAuth="false" sslProtocol="TLS" />

    -->

去掉註釋,修改爲

 

 

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

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

               clientAuth="false" sslProtocol="TLS" 

               keystoreFile="F:/jboss.keystore" keystorePass="999999" 

               truststoreFile="F:/jboss.keystore" truststorePass="999999" 

/>         

 

       2.1.2、測試jboss配置ssl是否成功

重啓jboss服務,使用"http://localhost:8080"能訪問jboos首頁;

使用"https://localhost:8443"訪問時,瀏覽器會出現下圖提示: 


 

由於是首次訪問,只需要點擊「繼續調用次網站」即可,則會跳轉至下圖<!--[endif]-->



 

點擊證書錯誤

 

查看證書


 

安裝證書


 

將證書安裝到「受信任的證書頒發機構」

 

重啓瀏覽器,再次訪問「https://localhost:8443」能直接進入jboss首頁,則說明jboss已經成功配置成ssl。

 

 

      2.2 將jetty配置成ssl

          如果你的開發環境是使用jetty爲服務,則需要將jetty配置成ssl。項目中使用的是maven jetty plugin,因此本篇只介紹如何將maven jetty 配置成ssl。

     

     2.2.1 準備好keystore,操作參考前面。

 

     2.2.2 在pom文件裏面配置maven jetty plugin,並開通ssl功能。

<plugins>

 

<plugin>

 

<groupId>org.mortbay.jetty</groupId>

 

<artifactId>jetty-maven-plugin</artifactId>

 

<version>7.0.1.v20091125</version>

 

<configuration>

 

<webAppConfig>

 

<defaultsDescriptor>src/test/resources/webdefault.xml</defaultsDescriptor>

 

<contextPath>/</contextPath>

 

</webAppConfig>

 

<!-- add by alvin 2013-1-21-->

 

<connectors>

 

<!--在maven庫裏../org/eclipse/jetty/server路徑下找到SelectChannelConnector-->

 

<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">

 

<port>8080</port>

 

<maxIdleTime>60000</maxIdleTime>

 

</connector>

 

<!--在maven庫裏../org/eclipse/jetty/server路徑下找到 SslSocketConnector -->

 

<connector implementation="org.eclipse.jetty.server.ssl.SslSocketConnector">

 

<port>8443</port>

 

<maxIdleTime>60000</maxIdleTime>

 

<Acceptors>2</Acceptors>

 

<AcceptQueueSize>100</AcceptQueueSize>

 

<!--keystore的路徑和密碼-->

 

<keystore>${ keystore .path}/jboss.keystore</keystore>

 

<password>999999</password>

 

<keyPassword>999999</keyPassword>

 

<!-- truststore 的路徑和密碼-->

 

<truststore> ${ keystore .path} /jboss.keystore</truststore>

 

<trustPassword>999999</trustPassword>

 

<!--是否雙向驗證-->

 

<wantClientAuth>false</wantClientAuth>

 

<needClientAuth>false</needClientAuth>

 

</connector>

 

</connectors>

 

<!-- end-->

 

</configuration>

 

</plugin>

 

</plugins>

 

    2.2.3 驗證jetty是否配置成功,步驟和驗證jboss一樣。

 

三、spring security 控制http/https切換

 

    3.1 在../webapp/WEB-INF/web.xml 中,增加springSecurity的過濾器

 

<filter>  

  <filter-name>springSecurityFilterChain</filter-name>  

  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  

</filter>

 

 

<filter-mapping>  

 <filter-name>springSecurityFilterChain</filter-name>  

 <url-pattern>/*</url-pattern>  

</filter-mapping>

     3.2 配置springsecurity.xml

    <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:security="http://www.springframework.org/schema/security"

xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security-3.0.xsd

">     

<security:http auto-config="true" >  

<!-- 未指定的url一致用http通道 -->

  <security:intercept-url pattern="/*"   

                 requires-channel="http"/>

  <security:intercept-url pattern="/main.action"   

                 requires-channel="http"/>                 

<!-- 指定url使用https通道 -->                                 

  <security:intercept-url pattern="/main/UserManager-login.action"   

                 requires-channel="https"/>  

  <security:intercept-url pattern="/main/UserManager-innerlogin.action"   

                 requires-channel="https"/>

  <security:intercept-url pattern="/infoRepIndex.action"   

                 requires-channel="https"/>       

</security:http>  

  <security:authentication-manager></security:authentication-manager>

</beans>

3.3 在web.xml中加載springsecurity.xml

 

 <context-param>

<param-name>contextConfigLocation</param-name>

<param-value>../springsecurity.xml</param-value><!--此處爲springsecurity.xml在項目中的路徑-->

</context-param>

       

至此,簡單的spring security應用配置結束。以上配置僅供參考。完成以上配置,就可以實現ssl安全訪問web,並能配置哪些應用需要https訪問,其餘的用http訪問。