- 浏览: 1495149 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (523)
- JAVA (334)
- J2EE (18)
- JSP (21)
- JavaScript (14)
- it life (2)
- mobile develop (4)
- UBUNTU (14)
- Algorithm (14)
- DataBase (56)
- Browser/Server (1)
- linux (6)
- fedora (2)
- CSS (1)
- AjAX (3)
- HTML5 (1)
- EJB (1)
- osworkflow (2)
- Java face (5)
- spring (4)
- ICE (1)
- webService (2)
- MongoDB (1)
- JavaThread (4)
- JavaCollections (3)
- Hibernate (2)
- JavaMail (1)
- JavaBasic (1)
- Cache (1)
- https (4)
- DOM4J (1)
- JDOM (0)
- Mybatis (1)
- JUNIT (1)
- eclipse (1)
- easyMock (2)
最新评论
-
yadongliang:
...
自己认为的一些技术点 -
yadongliang:
每次看你头像都看的荷尔蒙分泌失调
WebService的两种方式SOAP和REST比较 (转) -
yadongliang:
hollo 写道一直有这种感觉,盲目的跟风,确实有一些人为了潮 ...
WebService的两种方式SOAP和REST比较 (转) -
welss:
博主,JNative怎么调用dll中的这种方法: int ...
JNative调用DLL -
Java_Antelope:
session.setAttribute和session.getAttribute(
https一般来说有单项SSL和双向SSL连接之分。
单项SSL连接,也就是只是客户端验证服务器证书。tomcat中clientAuth="false"的时候,HTTPS单向验证如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ClientSendData {
static Log log = LogFactory.getLog(ClientSendData.class);
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;
private String Url;
//初始化数据
public ClientSendData() {
sslTrustStore = "D:/ssl/clientTrust.jks";
sslTrustStorePassword = "123456";
Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
}
public String sendData(String data) {
String receivedData = null;
try {
//设置系统参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
receivedData = send(Url, data);
} catch (Exception e) {
e.printStackTrace();
}
return receivedData;
}
public static String send(String sendurl, String sendData)
throws Exception {
URL url = new URL(sendurl);
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");
HttpsURLConnection.setDefaultHostnameVerifier(hv);
Date current = new Date(System.currentTimeMillis());
log.info("begint to open connection at " + current);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
Date end = new Date(System.currentTimeMillis());
log.info("open connection ok at " + end + ",cost:"+ (end.getTime() - current.getTime()));
connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setReadTimeout(30000);
byte data[] = sendData.getBytes();
current = new Date(System.currentTimeMillis());
log.info("[SSLIX]notifyEai,begint to write data at " + current);
OutputStream out = connection.getOutputStream();
out.write(data);
end = new Date(System.currentTimeMillis());
log.info("write data ok at " + end + ",cost:"
+ (end.getTime() - current.getTime()));
StringBuffer receivedData = new StringBuffer();
current = new Date(System.currentTimeMillis());
log.info("begint to read data at " + current);
InputStreamReader inReader = new InputStreamReader(connection
.getInputStream(), "UTF-8");
BufferedReader aReader = new BufferedReader(inReader);
String aLine;
while ((aLine = aReader.readLine()) != null) {
receivedData.append(aLine);
}
end = new Date(System.currentTimeMillis());
log.info("read data ok at " + end + ",cost:"
+ (end.getTime() - current.getTime()));
log.info("开始返回状态码");
Integer statusCode = connection.getResponseCode();
log.info("返回状态码:" + statusCode);
aReader.close();
connection.disconnect();
return receivedData.toString();
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData();
t.sendData("测试SSL单项连接,向服务端发送数据!");
}
}
单项认证时,只需要设置客户端信任的证书库就行。但是当是双向认证时,还需要设置客户端密钥库密码。
HTTPS双向验证代码如下:
public class ClientSendData {
static Log log = LogFactory.getLog(EaiChannel.class);
//客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;
private String eaiUrl;
//初始化数据
public ClientSendData() {
sslKeyStorePath = "D:/ssl/clientKeys.jks";
sslKeyStorePassword = "123456";
sslKeyStoreType = "JKS"; //密钥库类型,有JKS PKCS12等
sslTrustStore = "D:/ssl/clientTrust.jks";
sslTrustStorePassword = "123456";
eaiUrl = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
}
public String sendData(String data) {
String receivedData = null;
try {
System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword",sslKeyStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
//设置系统参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
receivedData = send(eaiUrl, data);
} catch (Exception e) {
e.printStackTrace();
}
return receivedData;
}
public static String send(String sendurl, String sendData)
throws Exception {
//和上面一样
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData();
t.sendData("测试SSL双项连接,向服务端发送数据!");
}
}
下面来说说可能会遇到的异常:
1. java.security.NoSuchAlgorithmException
一般来说是密钥库类型不对,如上面的sslKeyStoreType = "JKS" 却写成PKCS12。
也有可能是证书的问题。
2. java.net.UnknownHostException
服务端地址不对。
3.java.net.SocketException: Unexpected end of file from server
这个异常和客户端没有关系,说明已经发送成功。是服务端的问题。有可能是防火墙的原因,也可能是服务端没处理客户端的响应。
另外有人说当URL过长时也会发生此错误,当使用URL发送数据时,可以参考此意见。
4.java.io.IOException:server returned HTTP response code :500
这个异常是服务端代码的问题。服务端相应代码执行时抛出了异常。
最后 如果返回的状态码是200 ,表示成功。
单项SSL连接,也就是只是客户端验证服务器证书。tomcat中clientAuth="false"的时候,HTTPS单向验证如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ClientSendData {
static Log log = LogFactory.getLog(ClientSendData.class);
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;
private String Url;
//初始化数据
public ClientSendData() {
sslTrustStore = "D:/ssl/clientTrust.jks";
sslTrustStorePassword = "123456";
Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
}
public String sendData(String data) {
String receivedData = null;
try {
//设置系统参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
receivedData = send(Url, data);
} catch (Exception e) {
e.printStackTrace();
}
return receivedData;
}
public static String send(String sendurl, String sendData)
throws Exception {
URL url = new URL(sendurl);
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");
HttpsURLConnection.setDefaultHostnameVerifier(hv);
Date current = new Date(System.currentTimeMillis());
log.info("begint to open connection at " + current);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
Date end = new Date(System.currentTimeMillis());
log.info("open connection ok at " + end + ",cost:"+ (end.getTime() - current.getTime()));
connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setReadTimeout(30000);
byte data[] = sendData.getBytes();
current = new Date(System.currentTimeMillis());
log.info("[SSLIX]notifyEai,begint to write data at " + current);
OutputStream out = connection.getOutputStream();
out.write(data);
end = new Date(System.currentTimeMillis());
log.info("write data ok at " + end + ",cost:"
+ (end.getTime() - current.getTime()));
StringBuffer receivedData = new StringBuffer();
current = new Date(System.currentTimeMillis());
log.info("begint to read data at " + current);
InputStreamReader inReader = new InputStreamReader(connection
.getInputStream(), "UTF-8");
BufferedReader aReader = new BufferedReader(inReader);
String aLine;
while ((aLine = aReader.readLine()) != null) {
receivedData.append(aLine);
}
end = new Date(System.currentTimeMillis());
log.info("read data ok at " + end + ",cost:"
+ (end.getTime() - current.getTime()));
log.info("开始返回状态码");
Integer statusCode = connection.getResponseCode();
log.info("返回状态码:" + statusCode);
aReader.close();
connection.disconnect();
return receivedData.toString();
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData();
t.sendData("测试SSL单项连接,向服务端发送数据!");
}
}
单项认证时,只需要设置客户端信任的证书库就行。但是当是双向认证时,还需要设置客户端密钥库密码。
HTTPS双向验证代码如下:
public class ClientSendData {
static Log log = LogFactory.getLog(EaiChannel.class);
//客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;
private String eaiUrl;
//初始化数据
public ClientSendData() {
sslKeyStorePath = "D:/ssl/clientKeys.jks";
sslKeyStorePassword = "123456";
sslKeyStoreType = "JKS"; //密钥库类型,有JKS PKCS12等
sslTrustStore = "D:/ssl/clientTrust.jks";
sslTrustStorePassword = "123456";
eaiUrl = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
}
public String sendData(String data) {
String receivedData = null;
try {
System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword",sslKeyStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
//设置系统参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
receivedData = send(eaiUrl, data);
} catch (Exception e) {
e.printStackTrace();
}
return receivedData;
}
public static String send(String sendurl, String sendData)
throws Exception {
//和上面一样
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData();
t.sendData("测试SSL双项连接,向服务端发送数据!");
}
}
下面来说说可能会遇到的异常:
1. java.security.NoSuchAlgorithmException
一般来说是密钥库类型不对,如上面的sslKeyStoreType = "JKS" 却写成PKCS12。
也有可能是证书的问题。
2. java.net.UnknownHostException
服务端地址不对。
3.java.net.SocketException: Unexpected end of file from server
这个异常和客户端没有关系,说明已经发送成功。是服务端的问题。有可能是防火墙的原因,也可能是服务端没处理客户端的响应。
另外有人说当URL过长时也会发生此错误,当使用URL发送数据时,可以参考此意见。
4.java.io.IOException:server returned HTTP response code :500
这个异常是服务端代码的问题。服务端相应代码执行时抛出了异常。
最后 如果返回的状态码是200 ,表示成功。
发表评论
-
Spring官网改版后下载
2014-04-11 10:39 769Spring官网改版后找了好久都没有找到直接下载Jar包的链接 ... -
Java 系统架构设计
2014-03-31 21:18 1481首先分为网关和引擎等多个部分: 第一部分:网关 1、主要负责转 ... -
Java 提高系统性能
2014-03-03 22:22 2611首先是从三方面来提高的,应用层面,服务器端层面,数据库层面。 ... -
2013年11月份艺龙旅行网面试题
2013-11-22 23:39 12611.给你两个字符串s1="abc",s2= ... -
国猪555555555
2013-11-22 00:16 1095国足第一招:场地太差,不适应。 国足第二招:场地太好,不适应。 ... -
自己认为的一些技术点
2013-08-14 00:12 12391.rest风格的编程。 2.memcached的命中率低的问 ... -
HttpClient
2013-01-14 23:57 1050package org.abin.lee.test.http; ... -
JAVA单例模式读取properties配置文件
2012-12-16 01:12 2665前段时间出差去做一个数据接口的项目,有很多参数需要从工程中的配 ... -
Java 反射调用方法
2012-10-22 23:52 976package lc.abin.lee.reflect; i ... -
Java中的transient,volatile和strictfp关键字
2012-09-12 18:00 833http://www.iteye.com/topic/5295 ... -
Server JBoss v5.0 at localhost was unable to start within 50 seconds.
2012-09-05 11:35 1883[标题]:[转]JBoss was unable to sta ... -
HttpUrlConnection 开发例子
2012-03-25 16:23 3359/*** * * 发送HTTP请求 * @ ... -
Java Enum类型定义的方法
2012-03-12 12:34 2346//枚举接口 package com.abin.info.s ... -
Rational Rose 2003 下载及破解方法
2012-03-06 12:49 1392FROM:http://blog.csdn.net/fengl ... -
使用Spring进行面向切面(AOP)编程
2012-02-22 10:35 23451.aop理论知识 横切性关注点:对哪些方法拦截,拦截后怎么处 ... -
BASE64、MD5、SHA、HMAC几种加密算法
2012-02-21 12:53 8806BASE64编码算法不算是真正的加密算法。 MD5、 ... -
文本文件和二进制文件区别及java中字节流和字符流归纳
2012-02-17 15:48 2992首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的 ... -
Java 字节流转化为文件
2012-02-17 15:46 5751已知:byte[] bytes=new FileToBytes ... -
Java核心之Java内存分配原理
2012-02-17 13:40 952JAVA内存分配与管理是Java的核心技术之一,之前我们曾介绍 ... -
传智播客——JPA
2012-02-17 09:31 1552首先,JPA不是ORM框架,而是SUN官方提出的JAVA持久化 ...
相关推荐
在HTTPS的双向认证中,客户端和服务器都需要互相验证对方的身份。而单向验证则只需服务器向客户端证明其身份,客户端无需向服务器证明。这种模式常用于客户端是不可信的,而服务器端需要保护的情况。 这个“https...
现在,我们将深入探讨Android中实现HTTPS双向验证的过程和相关知识点。 首先,双向验证的基本原理是:客户端不仅需要验证服务器的证书,服务器也需要验证客户端的身份。这通常通过客户端证书来实现,服务器会检查...
通常,SSL/TLS连接采用单向认证,即服务器验证客户端的身份,而客户端不需要验证服务器。但在某些高安全性的场景下,双向认证是必要的,即双方都需要证明自己的身份。这增加了安全性,防止了中间人攻击。 在Java中...
Tomcat作为流行的Java Servlet容器,提供了支持HTTPS协议的能力,这包括了单向认证(也称为服务器认证)和双向认证(也称为客户端认证)。这两种认证机制都是基于SSL(Secure Sockets Layer)和TLS(Transport Layer...
有两个解决思路:1、确认是单向认证还是双向认证,Server端是否校验Client端;2、可以忽略服务器证书校验(将hostname校验和CA证书校验同时关闭)。网上最常用的,就是利用jdk生成keyStore文件,该方法忽略服务器...
总结起来,双向HTTPS解决方案提供了更高级别的安全保护,通过客户端和服务器的双向身份验证,确保了网络通信的安全性,但同时也增加了实施和管理的复杂度。在选择使用双向认证时,应综合考虑安全需求和资源投入。
SSL(Secure Sockets Layer)双向认证,也称为mutual SSL,是一种网络安全协议,它要求客户端和服务器双方在建立连接时都提供身份证明。...SSL双向认证虽然比单向认证复杂,但带来的安全保障是值得的。
标题中的“Tomcat SSL 单向/双向”指的是在Apache Tomcat服务器中配置SSL(Secure Sockets Layer)安全协议以实现网络通信的安全性。SSL能够为传输的数据提供加密,确保数据在互联网上的传输过程中不被窃取或篡改。...
Java实现HTTPS双向认证详解 HTTPS双向认证是指客户端和服务端都需要拥有证书,并且双方都需要互换证书,客户端安装服务端证书,服务端安装客户端证书。这种情况下,并不是所有用户都可以访问服务端的。只有服务端...
本项目的目标是在`Android WebView`上成功访问`Tomcat SSL`双向验证服务。文中详细介绍了整个流程,并针对实际操作过程中遇到的问题提供了相应的解决方案。 **环境准备**: - 操作系统:Windows 2003 EE - 开发...
本篇主要探讨的是CXF中的安全访问机制,特别是单向SSL和双向SSL的实现。这两种SSL模式在保护通信数据的机密性和完整性方面发挥着关键作用。 首先,让我们理解什么是SSL(Secure Socket Layer)。SSL是一种网络安全...
单向认证是指客户端只验证服务器的身份,而双向认证则要求服务器和客户端都需要验证对方的身份。 在Android中,当我们遇到自签CA的情况,系统默认会拒绝连接,因为这些证书不在系统的受信任根证书颁发机构列表中。...
标题 "keytool+tomcat 单向/双向认证的配置" 涉及的是在Java安全领域中的证书管理和服务器身份验证。keytool是Java提供的一个命令行工具,用于管理Java密钥库(keystore),而Tomcat是广泛使用的Java应用服务器。当...
本教程将详细讲解如何在Tomcat中利用Java自带的keytool工具来生成并配置数字证书,实现双向验证操作。 首先,我们要理解什么是双向认证。在单向认证中,服务器会向客户端展示其数字证书,证明自己的身份,而客户端...
双向链表相比单向链表的优点在于其灵活性,但也有额外的存储开销,因为每个节点都需要存储两个指针。在某些需要频繁进行插入和删除操作的场景下,如实现高效的栈或队列,双向链表是理想的选择。 在实际开发中,Java...
在UDP通信中,双向通信意味着客户端和服务器可以互相发送数据,而不仅仅是单向的数据流。 描述中提到的源码来源于《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》这篇文章,这表明源码实例是为了解释和...
在传统的SSL单向认证中,客户端只需要验证服务器的身份,而服务器无需验证客户端。而在双向认证中,双方都需要提供有效的证书来证明自己的身份,这为通信提供了更高的安全性,特别是在金融、医疗等对数据安全要求极...
本教程将引导您了解如何为API设置安全性,特别关注单向认证(也称为服务器身份验证)以及如何在Java Web服务器和Spring Boot客户端之间使用TLS(Transport Layer Security)和SSL(Secure Sockets Layer)。...
这个过程确保了服务器和客户端之间的通信不仅需要服务器认证(单向认证),还要求客户端进行认证(双向认证)。这种方式提高了安全性,因为服务器可以验证连接的客户端,防止未经授权的设备接入。在银行、企业内部...