HttpClient3.x 如何访问https的网址

发布于 2021-11-30 13:21:55 字数 2212 浏览 913 评论 3

访问https的时候,一般需要指定一个受信任的证书库(就是说,要先准备一个证书)

我再网上找了2个方法,代码如下:

package com.lala.xfire;

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;

import com.lala.xfire.py.SimpleProtocolSocketFactory;

public class HttpContent
{
	static String certFile = "E:/tmp/my/client.jks";
	static String certPass = "123456";
	static String url = "http://147.54.71.124:9925/api/v1/credit.do";
	/**
	 *方法一: 
	 */
	public static void method1()throws Exception
	{
		System.setProperty("javax.net.ssl.trustStore", certFile);
		System.setProperty("javax.net.ssl.trustStorePassword", certPass);
		run();
	}
	/**
	 *方法二: 
	 */
	public static void method2()throws Exception
	{
		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());  
        InputStream input = new FileInputStream(certFile);  
        ks.load(input, certPass.toCharArray());  
        input.close();
        
		TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);
		
		SSLContext context = SSLContext.getInstance("TLS");
		context.init(null, tmf.getTrustManagers(), null);
    	
    	final ProtocolSocketFactory factory = new SimpleProtocolSocketFactory(context);

    	Protocol.registerProtocol("https", new Protocol("https", factory, 443));

    	run();
	}
	public static void run()throws Exception
	{
		HttpClient httpclient = new HttpClient();
		GetMethod httpget = new GetMethod(url); 
		httpclient.executeMethod(httpget);
		byte[] str = httpget.getResponseBody();
		System.out.println(new String(str, "UTF-8"));
		httpget.releaseConnection();
	}
}



但是,这2个方法都有一个致命的问题,就是

设置的证书,会影响其他的程序。

也就是说,我的应用里面要访问多个厂商的api接口,每个厂商都有自己各自的证书

如何像httpclient4.x一样,每个httpclient都可以指定一个SSLContext,这样就可以,每个接口都使用自己的httpclient

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小瓶盖 2021-12-01 12:23:32

http://stackoverflow.com/questions/7684654/how-to-make-apache-commons-httpclient-3-1-ignore-https-certificate-invalidity

兮颜 2021-12-01 11:55:44

可以考虑信任所有证书

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyhttps);

HttpClient client = new HttpClient();
GetMethod httpget = new GetMethod("https://localhost/");
client.executeMethod(httpget);

蓝颜夕 2021-12-01 11:02:06

引用来自“懒虫2014”的评论

用jfinal中的HttpKit试试。

http://git.oschina.net/jfinal/jfinal/blob/master/src/com/jfinal/kit/HttpKit.java/?dir=0&filepath=src/com/jfinal/kit/HttpKit.java&oid=89d1591e1104f598db8264b29d342cd5532cdcf8&sha=b78af2b8b72a23405b75e15173d4e485d81340b0

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文