文档章节

HttpClient请求https url时 ssl exception

Cundong
 Cundong
发布于 2013/10/31 14:01
字数 329
阅读 1581
收藏 4

最近在使用HttpClient请求https url 时,遇到以下问题:

javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

搜索分析之后,得到原因如下:

Android证书库里带着startssl ca证书,而服务器的Web容器中没有带startssl ca证书,这样Android客户端访问该Web容器发布出来的https url时,
校验就会失败。

解决方式:
1.客户端相信所有证书;
2.为服务器端Web容器添加startssl ca证书;

我的解决方式采取第1种。

实现代码:

public static class TrustAllSSLSocketFactory extends SSLSocketFactory {

		SSLContext sslContext = SSLContext.getInstance("TLS");

		public TrustAllSSLSocketFactory(KeyStore truststore)
				throws NoSuchAlgorithmException, KeyManagementException,
				KeyStoreException, UnrecoverableKeyException {
			super(truststore);

			TrustManager tm = new X509TrustManager() {
				public java.security.cert.X509Certificate[] getAcceptedIssuers() {
					return null;
				}

				@Override
				public void checkClientTrusted(
						java.security.cert.X509Certificate[] chain,
						String authType)
						throws java.security.cert.CertificateException {
				}

				@Override
				public void checkServerTrusted(
						java.security.cert.X509Certificate[] chain,
						String authType)
						throws java.security.cert.CertificateException {
				}
			};

			sslContext.init(null, new TrustManager[] { tm }, null);
		}

		@Override
		public Socket createSocket(Socket socket, String host, int port,
				boolean autoClose) throws IOException, UnknownHostException {
			return sslContext.getSocketFactory().createSocket(socket, host,
					port, autoClose);
		}

		@Override
		public Socket createSocket() throws IOException {
			return sslContext.getSocketFactory().createSocket();
		}
	}
private static SSLSocketFactory getSSLSocketFactory() {
		try {
			KeyStore trustStore = KeyStore.getInstance(KeyStore
					.getDefaultType());

			trustStore.load(null, null);

			SSLSocketFactory sslSocketFactory = new TrustAllSSLSocketFactory(
					trustStore);
			sslSocketFactory
					.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

			return sslSocketFactory;
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
// 支持http和https两种模式
			SchemeRegistry schReg = new SchemeRegistry();
			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			schReg.register(new Scheme("https", getSSLSocketFactory(), 443));

			// 使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
					params, schReg);
PS:如果请求网络使用HttpURLConnection,实现方式也是一样,让客户端信任所有证书。

© 著作权归作者所有

Cundong
粉丝 186
博文 28
码字总数 30973
作品 0
海淀
私信 提问
加载中

评论(3)

XanderWang
XanderWang
能不能只信任某特定证书
Cundong
Cundong 博主

引用来自“lovexy02”的评论

相信所有证书好吗?如果有的证书是恶意证书呢?

这不是最好的做法,但是,在服务器不做任何修改的前提下,这是唯一的办法了。
XanderWang
XanderWang
相信所有证书好吗?如果有的证书是恶意证书呢?
java 网络爬虫 使用httpclient4 https连接认证问题,求各位大神帮帮忙,急!!!

详细代码: ---1、入口login1 传入一个url,获取验证身份,第一个url为http://****.com public static void login1(String url,int ***){ HttpClient httpClient = new DefaultHttpClient(ne......

漠、
2013/05/14
5.7K
2
java 的 代码访问https JDk环境的问题

不知道为什么同样的代码,环境用jdk 1.6.0_43 的时候就一直报错,但是用jdk1.7的就没有错,不论32位还是64位的都不会错, public static void main(String[] args) { HttpClient HttpClient...

DoreenWang
2016/06/06
286
0
Android下的网络编程 & 代理的使用

1. 使用 标准Java接口: 设计的类: java.net.* 基本步骤: 1) 创建 URL 以及 URLConnection / HttpURLConnection 对象 2) 设置连接参数 3) 连接到服务器 4) 向服务器写数据 5)从服务器读取数据...

小编辑
2010/08/12
5.5K
2
调用微信公众https接口出现KeyException异常

各位大牛好: 我在用程序调用微信公众平台https的时候,本地测试调用方法是可以获取到信息的,但是将程序放在服务器上,就出现以下问题: javax.net.ssl.SSLException: java.security.Provid...

雨佳
2015/09/26
5.8K
9
Java用HttpClient3发送http/https协议get/post请求,发送map,jso

使用的是httpclient 3.1, 使用"httpclient"4的写法相对简单点,百度:httpclient https post 当不需要使用任何证书访问https网页时,只需配置信任任何证书 其中信任任何证书的类MySSLProtoc...

架构之路
2018/10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PO BO VO DTO POJO DAO概念及其作用(附转换图)

J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋友...

Airship
5分钟前
0
0
curses 管理插件

http://bbs.nga.cn/read.php?tid=9603776&rand=851

MtrS
今天
3
0
网站运营类指标

1 网站流量类指标 1.1 到达率 1.2 UV   UV即Unique Visitor,又称独立访客。UV是衡量用户“人数”的重要指标,反映了来到网站的用户“数量”。UV定义只跟时间有关。 1.3 Vist   Vist又称...

qwfys
今天
4
0
Commons-lang3提供的StopWatch执行时间监视器

Commons-lang3提供的StopWatch执行时间监视器, spring也提供了同样功能的工具 前言 我们如果要统计一段代码的执行时间:我们的办法是 public static void main(String[] args) {      ...

独钓渔
今天
2
0
Kernel 块设备驱动框架

1,总体架构: 块设备驱动框架是Linux设备最重要的框架之一,涉及内核的vfs,设备驱动模型等模块,是内核中异常复杂的一个框架。我们先看一下块设备设计的主要框架结构,先从总体上对块设备有...

yepanl
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部