春运抢票闹的心慌慌,还好客户体谅,没多大任务,就是实现一个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访问。