SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
Jboss服务器本身是支持SSL的下面是Jboss下的SSL的配置方法:
一、1.生成keystore
开始->运行->cmd
打开控制台,输入
keytool -genkey -alias tomcat -keyalg RSA
根据提示输入对应内容,效果如下:
E:\>keytool -genkey -alias tomcat -keyalg RSA
输入keystore密码: 820709
您的名字与姓氏是什么?
[Unknown]: 域名*.trustauth.cn
您的组织单位名称是什么?
[Unknown]: test
您的组织名称是什么?
[Unknown]: test
您所在的城市或区域名称是什么?
[Unknown]: china
您所在的州或省份名称是什么?
[Unknown]: beijing
该单位的两字母国家代码是什么
[Unknown]: cn
CN=test, OU=test, O=test, L=china, ST=beijing, C=cn 正确吗?
[否]: y
输入的主密码
(如果和 keystore 密码相同,按回车):
说明:输入的密码不要带特殊字符,否则在运行JBoss时可能会出错。
二、.将产生的.keystore(默认路径在“C:\Documents and Settings\用户名”下面)放到JbossHOME\server\default\conf下,重命名为你自己想要的名称例如Raymend. Keystore
三、打开%JbossHOME%\server\default\deploy\jbossweb-tomcat55.sar\server.xml,修改如下配置:xml 代码
<</SPAN>Connector port=”8443″ address=”${jboss.bind.address}” maxThreads=”100″ strategy=”ms”maxHttpHeaderSize=”8192″ emptySessionPath=”true” scheme=”https” secure=”true” clientAuth=”false”keystoreFile=”${jboss.server.home.dir}/conf/Raymend.keystore” keystorePass=”820709″ sslProtocol =”TLS” />
这样我们可以通过访问https://trustauth.cn:8443/进行测试。
(1)打开C:\jboss-5.1.0.GA\server\default\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml文件,将所有的8080都改为80,所有的8443改为443;
(2)打开C:\jboss-5.1.0.GA\server\default\deployers\jbossweb.deployer\web.xml文件,加上:
<security-constraint> <web-resource-collection> <web-resource-name>SSLHtmlAdaptor</web-resource-name> <description> An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application </description> <url-pattern>/</url-pattern> </web-resource-collection> <user-data-constraint> <description>Protection should be CONFIDENTIAL</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
注:加在此处是对jboss下所有的项目生效,若想只对每个项目生效,则只对指定项目的web.xml文件中加入上述配置信息即可;
(3)修改C:\jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\server.xml文件,
配置443端口的connector,80端口的connector的redirectPort设置为443,
8009端口的connector的redirectPort设置为443;
(4)当有些页面仍需要使用http访问时:假如希望/notice.html仍可通过http访问,其它页面只能通过
https访问
在(2)步骤c配置了之后,在此web.xml中加上:
<security-constraint>
<web-resource-collection>
<web-resource-name>SSLHtmlAdaptor</web-resource-name>
<description> An example security config that only allows users with the role
JBossAdmin to access the HTML JMX console web application
</description>
<url-pattern>/notice.html</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description>Protection should be CONFIDENTIAL</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
(5)通过https访问的页面,如果出现标签的src为http开头,则浏览器会提示警告信息。因此当访问这些页
面时,希望仍自动跳转http,从此页面跳转到其它页面时,希望又能自动跳转https。而步骤(3)、
(4)只能保证访问http能自动跳转到https,不能保证https自动切换到http。为了达到此种效果,我
省略了(3)和(4),在项目中加入了一个过滤器。此过滤器保证,当访问需要https访问的页面时,
若访问协议为http,则重定向为https访问,反之亦然。
(6)https与http的session共享问题:https与http相互切换时,相当于打开新的浏览器访问,session是
不会共享的。但现在的浏览器,当在一个窗口中访问某个主机的页面,然后访问另外一个主机的页面,
再返回第一个主机的页面,登录状态仍不会改变。因此,容易给开发者造成误会,http与https的切换
sessionId不会改变,即不需要考虑session不共享的情况。在多数情况下是这样,但也会经常出现不
共享的情况,因此我们需要进行改变:
通过本人自己写的代码测试发现,https与http进行切换时,若保证它们的sessionId一致,则
能达到共享session的目的。(开始时我以为http与https切换,就相当于从一台主机跳到另外一台主机
,即使它们的sessionId一致,也不能达到共享的目的,因为它们的session各在不同的session池中,
测试结果证明这种想法是错误的)
在步骤(5)中,http与https切换会重定向访问,此时给重定向的response添加一个Cookie,
Cookie名字为JSESSIONID,值为当前的sessionId即可。当重定向访问时有JSESSIONID值的Cookie
就会被传到服务器端,因此sessionId就和重定向之前的sessionId一致,达到session共享的目的。次
处只贴https重定向http时的部分代码,反向同理:
String uri = request.getRequestURI().toString();
if(request.getScheme().equals(“https”)){
for(String str : unSSLUrlList){ //unSSLUrlList为需要通过http进行访问的页面地址集合
if(uri .endsWith(str)){
Cookie[] cookies = req.getCookies();
if(cookies != null){
for(Cookie c : cookies){
if(c.getName().equalsIgnoreCase(“JSESSIONID”)){
response.addCookie(c);
}
}
}
response.sendRedirect(“http://” + req.getServerName() + uri);
return;
}
}
}
此种方式只能使用在访问同一台主机的情况下,若访问不同的主机,重定向是不会把添加的Cookie传
过去的,此时基本上达到session共享的目的,但偶尔还是会出现不共享的情况,但比没有这一步骤强
很多。
此外还有一种方式,就是重定向时,把sessionId以参数的形式传递过去,即:
response.sendRedirect(“http://” + req.getServerName() + uri + “?sessionId=” + JSESSIONID);
再在过滤器的最前面加入以下代码:
String sessionId = request.getParameter(“sessionId”);
if(sessionId != null && sessionId.length()>0){
Cookie cookie = new Cookie(“JSESSIONID”, sessionId);
cookie.setMaxAge(-1);
response.addCookie(cookie);
response.sendRedirect(request.getScheme() + “://” + req.getServerName() + uri);
return;
}
相关搜索
上一篇:PPTP,L2TP和SSL VPN的区别
下一篇:简述SSO,CAS,SSl的基本部署