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访问。