HttpClient3.x 如何访问https的网址
访问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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
http://stackoverflow.com/questions/7684654/how-to-make-apache-commons-httpclient-3-1-ignore-https-certificate-invalidity
可以考虑信任所有证书
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);
引用来自“懒虫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