- 浏览: 148907 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
august_000:
很有道理,我已经亲自测试过了:
public class ...
单例模式之线程安全解析 -
Chris_bing:
一个单例有这么多名堂,最后那个内部类的解决方案很有创意啊,受教 ...
单例模式之线程安全解析
注1:以下内容SSL链路加密(对来往数据进行加密)或单向验证(只验证服务端)的步骤,也是tomcat配置https双向验证的一部分。双向验证需要使用两对证书,客户端与服务端互相交换公钥,发送消息时A使用自己的私钥加密数据,B使用A的公钥解密。
注2:分析IE实现实现SSL连接的中的证书双向认证过程:
在地址栏中输入https://localhost:8443
客户端向服务器发送hello消息,tomcat服务器侦听8443端口,收到SSL连接的hello消息,服务器发送server certificate,并且发送client certificate request.客户端IE收到server certificate后取出issuer项,和IE受信任的根证书库中证书的subject比对,找到合适的根证书认证server certificate。并且同时向服务器发送client certificate,服务器收到client certificate后,tomcat服务器查找根证书库cacerts中的根证书的suject,找到合适的根证书认证client certificate.在认证的同时完成密钥协商。客户端认证结束后,IE会弹出"安全警报"对话框,用户可以查看服务器证书,以及服务器证书是否受信任,可以选择是否继续SSL连接。
参考链接:
1. Java+Https+Tomcat双向验证实例:http://blog.csdn.net/zhongming_software/article/details/8592331
2. Tomcat+Axis2 WebService配置SSL单向验证:http://blog.csdn.net/honglei915/article/details/6073290
3. Tomcat配置HTTPS方式(单向):http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html
1. 服务端创建KeyStore命令:
在C:\Users\Administrator\目录下生成server_jks_testws.jks文件,此文件包含服务端的公钥、私钥和证书。
2. 发布http非加密服务,查看soap包数据
2.1 在服务端发布webservice接口,接口代码如下:
2.2 客户端访问代码
其中HeaderOMElement.createHeaderOMElement()指的是将用户信息添加到soap header中,用于服务端验证。
代码如下:
上图中用户信息和接口参数的双向传递都是明文。
3. 设置tomcat https访问
服务端
3.1 修改%TOMCAT_HOME%/conf/server.xml文件 将原server.xml文件中对应部分代码去掉注释,并添加相应代码,如下:
3.2 修改%TOMCAT_HOME%/conf/web.xml文件
屏蔽http链接,所有http访问都重定向为https访问,在文件结尾添加代码:
客户端
3.3 将服务端证书*.jks文件复制到客户端特定目录下,并在客户端添加灰色背景代码
3.4 抓包显示,通过TcpTrace抓包显示截图如下:
4. 配置特定资源访问使用https某些情况下,某些特定资源需要走https协议,如登录请求。这时,我们可以在web.xml中配置约束。
这样当使用如下请求访问登录页面时,则服务器将该请求建立在https连接上。
http://localhost:8080/TestWS/index.jsp
备注:
TcpTrace设置:监听8888,目的地地址:localhost,转发8443
客户端访问:http://localhost:8888/TestWS/,则是指将数据包发往8888,TcpTrace接收到数据包转发给8443
问题1:org.apache.axis2.AxisFault: Transport error: 302 Error: Moved Temporarily
若在tomcat中配置http(端口8080)访问自动转到https(端口8443),使用TcpTrace进行端口转发抓包时会报错:
org.apache.axis2.AxisFault: Transport error: 302 Error: Moved Temporarily
at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:296)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:190)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:371)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:209)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:448)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
at com.*.webservice.WSStub.sum(WSStub.java:210)
at com.*.testws.TestClient.main(TestClient.java:28)
验证失败:Transport error: 302 Error: Moved Temporarily
问题2:java.security.UnrecoverableKeyException: Password verification failed
由于keytool设置证书的默认密码是changeit,若改为其他密码,则会导致在客户端调用时出现错误:
java.security.UnrecoverableKeyException: Password verification failed
暂时解决方法是将证书的密码设置为changeit,参考链接:http://www.wirelust.com/
其他解决方法还需要继续研究。
问题3:
如果AC主机不能通过域名查找,必须使用IP,但是这个IP只有在配置后才能确定,这样证书就必须在AC确定IP地址后才能生成。
问题4:
证书文件只能绑定一个IP地址,假设有10.1.25.250 和 192.168.1.250 两个IP地址,在证书生成文件时,如使用了10.1.25.250,通过IE就只能使用10.1.25.250 来访问AC-WEB,192.168.1.250是无法访问AC-WEB的。
注2:分析IE实现实现SSL连接的中的证书双向认证过程:
在地址栏中输入https://localhost:8443
客户端向服务器发送hello消息,tomcat服务器侦听8443端口,收到SSL连接的hello消息,服务器发送server certificate,并且发送client certificate request.客户端IE收到server certificate后取出issuer项,和IE受信任的根证书库中证书的subject比对,找到合适的根证书认证server certificate。并且同时向服务器发送client certificate,服务器收到client certificate后,tomcat服务器查找根证书库cacerts中的根证书的suject,找到合适的根证书认证client certificate.在认证的同时完成密钥协商。客户端认证结束后,IE会弹出"安全警报"对话框,用户可以查看服务器证书,以及服务器证书是否受信任,可以选择是否继续SSL连接。
参考链接:
1. Java+Https+Tomcat双向验证实例:http://blog.csdn.net/zhongming_software/article/details/8592331
2. Tomcat+Axis2 WebService配置SSL单向验证:http://blog.csdn.net/honglei915/article/details/6073290
3. Tomcat配置HTTPS方式(单向):http://www.blogjava.net/stevenjohn/archive/2012/09/26/388600.html
1. 服务端创建KeyStore命令:
keytool -genkey -alias server_jks_testws -keyalg RSA -keypass changeit -storepass changeit -keystore server_jks_testws.jks -validity 3650.
引用
keytool命令如下:
-genkey 在用户主目录中创建一个默认文件".jks",还会产生一个server_jks_cennavi的别名,server_jks_cennavi中包含用户的公钥、私钥和证书
-alias 产生别名server_jks_testws
-keystore 指定密钥库的名称(产生的各类信息将不在.jks文件中
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-dname 指定证书拥有者信息
-genkey 在用户主目录中创建一个默认文件".jks",还会产生一个server_jks_cennavi的别名,server_jks_cennavi中包含用户的公钥、私钥和证书
-alias 产生别名server_jks_testws
-keystore 指定密钥库的名称(产生的各类信息将不在.jks文件中
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-dname 指定证书拥有者信息
引用
注:上图中的名字和姓氏代表客户端访问的域名或ip地址(即服务端的对外地址,比如www.sina.com.cn或127.0.0.1),上图设置localhost代表服务端运行在本机,客户端访问本机服务。这个地方名字若和服务端实际运行地址不一样,则浏览器访问https链接会出现证书不匹配错误!
在C:\Users\Administrator\目录下生成server_jks_testws.jks文件,此文件包含服务端的公钥、私钥和证书。
2. 发布http非加密服务,查看soap包数据
2.1 在服务端发布webservice接口,接口代码如下:
public int sum(int num1, int num2) throws AxisFault { LoginCheck.checkUserPwd(); // 当客户端调用getPrice方法是,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。 return num1 + num2; } LoginCheck进行用户验证,代码如下: public class LoginCheck { public static void checkUserPwd() throws AxisFault { MessageContext msgContext = MessageContext.getCurrentMessageContext(); Iterator list = (Iterator) msgContext.getEnvelope().getHeader().getFirstElement().getChildren(); String Username = ""; String Password = ""; while (list.hasNext()) { OMElement element = (OMElement) list.next(); if (element.getLocalName().equals("Username")) { Username = element.getText(); } if (element.getLocalName().equals("Password")) { Password = element.getText(); } } if (!Username.equals("toone") || !Password.equals("111")) { throw new AxisFault(" Authentication Fail! Check username/password "); }else{ System.out.println("use:"+Username+"验证通过"); } } }
2.2 客户端访问代码
public class TestClient { public static void main(String[] args) { try { // WSStub stub = new WSStub("https://localhost:8553/TestWS/services/WS"); WSStub stub = new WSStub("http://localhost:8080/TestWS/services/WS"); ServiceClient sc = stub._getServiceClient(); sc.addHeader(HeaderOMElement.createHeaderOMElement()); stub._setServiceClient(sc); WSStub.Sum sums = new WSStub.Sum(); sums.setNum1(2); sums.setNum2(3); WSStub.SumResponse sr = stub.sum(sums); System.out.println(sr.get_return()); // WSStub.GetPrice gp = new WSStub.GetPrice(); // gp.setSymbol("sino"); // WSStub.GetPriceResponse gpr = stub.getPrice(gp); // System.out.println(gp.getSymbol()+" : "+gpr.get_return()); } catch (AxisFault e) { System.out.println("验证失败:"+e.getMessage()); e.printStackTrace(); }catch (RemoteException e) { System.out.println("远程连接失败:"+e.getMessage()); e.printStackTrace(); } } }
其中HeaderOMElement.createHeaderOMElement()指的是将用户信息添加到soap header中,用于服务端验证。
代码如下:
public class HeaderOMElement { public static OMElement createHeaderOMElement() { OMFactory factory = OMAbstractFactory.getOMFactory(); OMNamespace SecurityElementNamespace = factory.createOMNamespace("http://handler.com", "wsse"); OMElement authenticationOM = factory.createOMElement("Authentication",SecurityElementNamespace); OMElement usernameOM = factory.createOMElement("Username",SecurityElementNamespace); OMElement passwordOM = factory.createOMElement("Password",SecurityElementNamespace); usernameOM.setText("toone"); passwordOM.setText("111"); authenticationOM.addChild(usernameOM); authenticationOM.addChild(passwordOM); return authenticationOM; } }2.3 抓包显示,通过TcpTrace抓包显示截图如下:
上图中用户信息和接口参数的双向传递都是明文。
3. 设置tomcat https访问
服务端
3.1 修改%TOMCAT_HOME%/conf/server.xml文件 将原server.xml文件中对应部分代码去掉注释,并添加相应代码,如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:\Users\Administrator\server_jks_testws.jks" keystorePass="changeit"/> <!-- clientAuth="false" 代表ssl单向验证,即只验证服务端-->注:keystorePass="changeit",对应第一部分申请证书时的密码设置。
3.2 修改%TOMCAT_HOME%/conf/web.xml文件
屏蔽http链接,所有http访问都重定向为https访问,在文件结尾添加代码:
<login-config> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <web-resource-collection > <web-resource-name >SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
客户端
3.3 将服务端证书*.jks文件复制到客户端特定目录下,并在客户端添加灰色背景代码
public class TestClient { private static String trustKeyStore = "D:/Workspace/TestWSClient/jks/server_jks_testws.jks"; public static void main(String[] args) { //添加服务器信任证书 System.setProperty("javax.net.ssl.trustStore", trustKeyStore); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); try { WSStub stub = new WSStub("https://localhost:8443/TestWS/services/WS"); // WSStub stub = new WSStub("http://localhost:8080/TestWS/services/WS"); ServiceClient sc = stub._getServiceClient(); sc.addHeader(HeaderOMElement.createHeaderOMElement()); stub._setServiceClient(sc); WSStub.Sum sums = new WSStub.Sum(); sums.setNum1(2); sums.setNum2(3); WSStub.SumResponse sr = stub.sum(sums); System.out.println(sr.get_return()); // WSStub.GetPrice gp = new WSStub.GetPrice(); // gp.setSymbol("sino"); // WSStub.GetPriceResponse gpr = stub.getPrice(gp); // System.out.println(gp.getSymbol()+" : "+gpr.get_return()); } catch (AxisFault e) { System.out.println("验证失败:"+e.getMessage()); e.printStackTrace(); }catch (RemoteException e) { System.out.println("远程连接失败:"+e.getMessage()); e.printStackTrace(); } } }
3.4 抓包显示,通过TcpTrace抓包显示截图如下:
4. 配置特定资源访问使用https某些情况下,某些特定资源需要走https协议,如登录请求。这时,我们可以在web.xml中配置约束。
<security-constraint> <web-resource-collection> <web-resource-name>SSL Resource</web-resource-name> <url-pattern>/index.jsp</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
这样当使用如下请求访问登录页面时,则服务器将该请求建立在https连接上。
http://localhost:8080/TestWS/index.jsp
备注:
TcpTrace设置:监听8888,目的地地址:localhost,转发8443
客户端访问:http://localhost:8888/TestWS/,则是指将数据包发往8888,TcpTrace接收到数据包转发给8443
问题1:org.apache.axis2.AxisFault: Transport error: 302 Error: Moved Temporarily
若在tomcat中配置http(端口8080)访问自动转到https(端口8443),使用TcpTrace进行端口转发抓包时会报错:
org.apache.axis2.AxisFault: Transport error: 302 Error: Moved Temporarily
at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:296)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:190)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:371)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:209)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:448)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
at com.*.webservice.WSStub.sum(WSStub.java:210)
at com.*.testws.TestClient.main(TestClient.java:28)
验证失败:Transport error: 302 Error: Moved Temporarily
问题2:java.security.UnrecoverableKeyException: Password verification failed
由于keytool设置证书的默认密码是changeit,若改为其他密码,则会导致在客户端调用时出现错误:
java.security.UnrecoverableKeyException: Password verification failed
暂时解决方法是将证书的密码设置为changeit,参考链接:http://www.wirelust.com/
其他解决方法还需要继续研究。
问题3:
如果AC主机不能通过域名查找,必须使用IP,但是这个IP只有在配置后才能确定,这样证书就必须在AC确定IP地址后才能生成。
问题4:
证书文件只能绑定一个IP地址,假设有10.1.25.250 和 192.168.1.250 两个IP地址,在证书生成文件时,如使用了10.1.25.250,通过IE就只能使用10.1.25.250 来访问AC-WEB,192.168.1.250是无法访问AC-WEB的。
发表评论
-
(转)Spring声明式事务配置详解
2013-11-11 16:45 1836Spring声明式事务功能应该是大家应用Spring中使用的最 ... -
(转)Java几款性能分析工具的对比
2013-11-01 14:26 1047来源:http://www.javaweb.cc/langua ... -
HashMap的遍历
2013-11-01 14:15 9121、新建一个HashMap Map<Integer , ... -
java将汉子转换成汉语拼音
2013-11-01 13:51 935import net.sourceforge.pinyin4j ... -
Spring加载properties文件的两种方式
2013-10-31 10:05 0在spring中可以通过下面的方式将配置文件中的项注入到配置中 ... -
动态加载spring .xml中的bean对象
2013-10-30 15:27 0在java中如何取得spring.xml中加载的bean对象? ... -
(转)Spring mvc+hibernate+freemarker(实战)
2013-10-28 19:40 1014http://zz563143188.iteye.com/bl ... -
(转)Java之美[从菜鸟到高手演变]系列之博文阅读导航
2013-10-28 17:00 1746Java之美[从菜鸟到高手演变]系列之博文阅读导航 http: ... -
(转)openssl 制作证书和签名java方法
2013-10-28 15:03 0Win32OpenSSL_Light-0_9_8k.exe ... -
(转)面向接口编程详解
2013-10-25 12:34 5老文章,自己学习。 面向接口编程详解(一) http://w ... -
(转)Java架构师之路:JAVA程序员必看的15本书
2013-10-08 18:24 0作为Java程序员来说,最 ... -
Java获取CPU ID和磁盘ID
2013-09-25 20:18 0原文链接:http://www.rgagnon.com/jav ... -
Java编程之备用程序段
2013-09-25 14:57 0记录一些程序段,供日常备用,持续增加中…… 1. Java中 ... -
(转)Java编程之AOP
2013-09-25 14:45 0链接: http://hw19886200.iteye.com ... -
Java编程之性能优化
2013-09-25 14:28 767最近的机器内存又爆满 ... -
使用axis2传输附件
2013-09-25 10:40 1078服务端Service文件: import java.io. ... -
Java应用程序项目打包成exe文件
2013-09-23 09:16 01.程序打包 首先将程序打成Jar包,打包命 ... -
(转)Java事务处理类型及差异总结
2013-09-18 13:54 1621一、什么是Java事务 ... -
JAVA文件_加密
2013-09-13 16:09 0import java.awt.*; import java ... -
(转)Java 实现Rsa 加密
2013-09-13 16:08 0import java.io.*; public class ...
相关推荐
总的来说,理解并正确配置Tomcat的HTTPS设置是确保Web应用安全的关键环节。这涉及到SSL/TLS协议的理解,证书的获取和管理,以及Tomcat服务器的配置。同时,选择合适的JDK版本也很重要,以确保所有安全功能的正常运作...
标题中的“Tomcat配置HTTPS单项认证”涉及到的是在Apache Tomcat服务器上设置安全套接层(SSL)以实现HTTPS通信的过程,尤其是关于单向认证(也称为客户端认证)的配置。在互联网上,HTTPS是HTTP协议的安全版本,...
- 如果只需要单向验证,则将`clientAuth`属性设置为`false`。 #### 客户端验证 1. **Android SSL验证程序**: - 编写`Android`端的SSL验证程序。该程序最初只能实现单向验证,即验证服务器的证书有效性。 - ...
4. **修改Tomcat配置** 需要修改Tomcat的`server.xml`配置文件,开启SSL支持并指定KeyStore文件和密码。找到`<Connector>`标签,取消注释并修改相关属性,例如: ```xml maxThreads="150" scheme=...
客户端认证可以设置为 true、false 或 want,分别表示强制双向认证、单向认证和可选认证。 四、客户端证书的配置 客户端证书的配置需要将客户端证书导入到浏览器中。可以使用 keytool 工具生成客户端证书,并将其...
重新启动Tomcat服务器,如果配置正确,可以通过 `https://127.0.0.1:8443` 访问应用,页面能正常打开,表示HTTPS配置成功。 5. **实现HTTP到HTTPS自动跳转:** 若要让HTTP请求自动重定向到HTTPS,可以在应用程序...
7. **Tomcat配置**:在Java应用服务器Tomcat上配置SSL,通常会用到keytool工具。keytool是JDK自带的证书管理工具,可以用来生成和管理密钥对,以及导入和导出证书。 8. **Apache和Nginx配置**:Apache和Nginx都是...
在Tomcat的`server.xml`配置文件中,`<Connector>`元素用于定义HTTPS连接器,其中`SSLEnabled="true"`启用SSL,`clientAuth`属性控制客户端证书验证的行为。`clientAuth="false"`表示单向SSL验证,服务器验证客户端...
对于单向验证,仅需服务器证书;对于双向验证(也称为mutual SSL),还需要配置客户端信任的服务器证书。 ### 5. Android客户端实现 #### (1) 添加网络权限 在AndroidManifest.xml中,添加`INTERNET`和`ACCESS_...
通过以上步骤,我们可以实现CAS在Tomcat环境下的基本配置,并实现单点登录功能。这对于提高系统的安全性和用户体验、降低管理成本具有重要意义。未来还可以进一步扩展到其他应用服务器,比如WebLogic等,实现更广泛...
4. **测试HTTPS连接**:启动Tomcat服务器并通过浏览器访问HTTPS站点,验证HTTPS配置是否正确。 综上所述,通过对加密算法、数字摘要、数字签名、数字证书的理解以及OpenSSL的实际操作,我们可以有效地保护数据的...
- **步骤三**: 启动JBoss,访问默认首页验证是否成功。 - **配置端口**: 如果出现端口冲突问题,需要修改`%DEPLOY_DIR%\jboss-web.deployer\server.xml`中的端口号设置。 - **开发HSF服务**: - **工具**: 使用带...
SpringBoot的配置文件(application.properties或application.yml)是系统的重要组成部分,它包含了各种环境配置,如数据库连接信息、服务器端口、日志设置等。开发者需要根据实际环境调整这些配置。 在安全方面,...
4. **内嵌Web服务器**:如Tomcat或Jetty,使得开发和部署更便捷,无需额外配置外部服务器。 5. **Actuator**:提供健康检查、指标收集、审计跟踪等功能,有助于监控和管理应用。 【Vue.js】: 1. **MVVM模式**:Vue...
SpringBoot是Spring框架的一个扩展,它简化了Spring应用程序的初始设置和配置。主要特点包括: - 自动配置:SpringBoot会根据项目中的依赖自动配置相应的bean。 - 内嵌Web服务器:如Tomcat或Jetty,方便快速启动和...
6. **启动和测试**:启动Tomcat服务器,访问网页进行WebSocket连接测试,可以通过发送和接收消息验证WebSocket功能是否正常工作。 在开发WebSocket应用时,可能遇到的问题包括但不限于: - **跨域限制**:WebSocket...
SpringBoot的核心特性包括内置Tomcat服务器、自动配置、起步依赖和健康检查等,这些都极大地提高了开发效率。 Vue.js作为前端框架,以其轻量级、高性能和易学易用的特点,在前端开发中备受青睐。Vue.js采用组件化...
在这个例子中,我们设置了两个消息接收器,一个用于单向(In-Only)操作,另一个用于请求-响应(In-Out)操作。`ServiceClass`参数指定了服务实现的Java类。 完成`services.xml`后,将`.arr`文件复制到Tomcat服务器...