您的位置:首页 > 理论基础 > 计算机网络

添加对https协议的支持

2013-05-30 19:29 295 查看
对https协议的网站,httpclient需要添加一个合法的SSL Certificate,否则会报异常:javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated,在被访问方实际不需要证书为访问前提的情况下,可以重写一个trustManager,忽略证书的问题,就可以解决

例子:

import java.io.IOException;

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.List;

 

import javax.net.ssl.SSLContext;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

 

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.ClientConnectionManager;

import org.apache.http.conn.scheme.Scheme;

import org.apache.http.conn.scheme.SchemeRegistry;

import org.apache.http.conn.ssl.SSLSocketFactory;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

 

//重写X509TrustManager:

private static X509TrustManager trustManager= new X509TrustManager() {

public void checkClientTrusted(X509Certificate[] xcs, String string)

throws CertificateException {

}

public void checkServerTrusted(X509Certificate[] xcs, String string)

throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {

return null;

}

};

 

//然后再基于这个trustmanager ,声明一个httpclient:

public static HttpClient getInstance() throws KeyManagementException,

NoSuchAlgorithmException {

HttpClient client = new DefaultHttpClient();
SSLContext ctx = SSLContext.getInstance("SSL");
//SSLContext ctx = SSLContext.getInstance("TLS");

ctx.init(null, new TrustManager[] { trustManager }, null);

SSLSocketFactory ssf = new SSLSocketFactory(ctx);

// 忽略掉HostName的比较,否则访问部分地址可能会报异常

ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

ClientConnectionManager ccm = client.getConnectionManager();

SchemeRegistry sr = ccm.getSchemeRegistry();

sr.register(new Scheme("https", 443, ssf));

client = new DefaultHttpClient(ccm, client.getParams());

return client;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息