文档章节

HttpClient请求https url时 ssl exception

Cundong
 Cundong
发布于 2013/10/31 14:01
字数 329
阅读 1588
收藏 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
粉丝 185
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

一文让你轻松了解JAVA开发中的四种加密方法

文章目录 一、工具类 md5加密工具类 base64加密工具类 Bcrypt工具类 二、加密测试 MD5加密测试 base64加密测试 SHA加密测试 BCrypt加密测试 一、工具类 1. md5加密工具类 package 加密Teste...

爱编程的浪子
8分钟前
2
0
注解Annotation实现原理与自定义注解例子

什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metad...

Java面经
9分钟前
2
0
并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能...

阿里云云栖社区
18分钟前
1
0
Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要...

阿里云官方博客
20分钟前
2
0
金融壹账通与菲律宾联合银行合作 共推科技平台赋能中小企业融资

中小微企业融资是世界性的难题,在破解这一难题上,中国平安集团一直在用科技手段贡献来自中国的解决方案,而区块链技术的引入更为这一问题的解决带来了新的方向,同时平安对外赋能的脚步也借...

IFTNews
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部