论坛首页 Java企业应用论坛

在https环境下,用httpClient获取html源码的问题

浏览 3266 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-04-02  
首先说明一下:在测试的https环境下,以及本地也搞了一个https环境,可以测试通过(证书是有keytool生成的)。
但是在生产环境上,用这种方法,就报javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。
很怪异。

源码:

	public String getHtml(String url, String endcoding) throws Exception {
		String htmlCode=null;
		HttpClient httpClient = new DefaultHttpClient(); // 创建默认的httpClient实例
		X509TrustManager xtm = new X509TrustManager() { // 创建TrustManager
			public void checkClientTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
			}

			public void checkServerTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
			}

			public X509Certificate[] getAcceptedIssuers() {
				return null;
			}
		};
		try {
			// TLS1.0与SSL3.0基本上没有太大的差别,可粗略理解为TLS是SSL的继承者,但它们使用的是相同的SSLContext
			SSLContext ctx = SSLContext.getInstance("TLS");
			// 使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用
			ctx.init(null, new TrustManager[] { xtm }, null);
			// 创建SSLSocketFactory
			//ALLOW_ALL_HOSTNAME_VERIFIER(可以有IP、域名、机器名,其中之一符合就可以)
			SSLSocketFactory socketFactory = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
			// 通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上
			httpClient.getConnectionManager().getSchemeRegistry() 
					.register(new Scheme("https", 443, socketFactory));
			httpClient.getParams().setParameter(
					HttpMethodParams.HTTP_CONTENT_CHARSET, endcoding);

			// 创建HttpGet方法的实例
			HttpGet httpGet = new HttpGet(url); // 创建HttpPost
			HttpResponse response = httpClient.execute(httpGet);

			// 执行
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) {
				// 读取内容
				HttpEntity entity = response.getEntity(); // 获取响应实体
				if (null != entity) {
					htmlCode = EntityUtils.toString(entity, "UTF-8");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("认证失败,原因:[认证系统异常].");
		} finally {
			// 释放连接
			releaseSource(httpGet,null,httpClient); // 关闭连接,释放资源
		}
		return htmlCode;
	}


   发表时间:2015-04-08  
我参考网上部分文档写了一个无需生成证书即可直接通过https请求的工具jar包,依赖于httpClient
0 请登录后投票
   发表时间:2015-05-20  
小鱼不爱水 写道
我参考网上部分文档写了一个无需生成证书即可直接通过https请求的工具jar包,依赖于httpClient

贴部分主要代码我看看可否
0 请登录后投票
   发表时间:2015-05-26  
y812300477 写道
小鱼不爱水 写道
我参考网上部分文档写了一个无需生成证书即可直接通过https请求的工具jar包,依赖于httpClient

贴部分主要代码我看看可否

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics