有证书的https的问题 本帖最后由 liangtu33 于 2015-02-27 15:38:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 还没到登录,在下载验证码的时候已经报异常了,代码如下:import java.security.KeyManagementException;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import org.apache.http.HttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.SSLContextBuilder;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;public class XiaMen_IS{ public static void main(String[] args) { crawler(); } // 信息抓取 public static void crawler() { try { CloseableHttpClient cbHttpClient = createSSLInsecureClient(); getVerficationCode(cbHttpClient); } catch (Exception e) { System.out.println("---厦门社保抓取失败---"); } } // 获取验证码 private static String getVerficationCode(CloseableHttpClient cbHttpClient) throws Exception { try { String url = "https://app.xmhrss.gov.cn/wcm/servlet/VCodeServlet";// 验证码地址 HttpGet get = new HttpGet(url); HttpResponse response = cbHttpClient.execute(get);// 报异常 // 获取验证码字节数组 byte data[] = EntityUtils.toByteArray(response.getEntity()); } catch (Exception e) { System.out.println("厦门社保下载验证码异常:"); e.printStackTrace(); throw e; } return null; } // client工具函数,信任对方(https)所有证书 public static CloseableHttpClient createSSLInsecureClient() { try { // 创建安全套接字对象 SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { // 信任所有 public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); // 获取分层tls/ssl连接 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } return HttpClients.createDefault(); }} 将SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);改为SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());亲测已经可以把验证码下载下来了。 报语法错误httpclient用的什么版本?我用4.4运行的,org.apache.http.conn.ssl.SSLConnectionSocketFactory。 我又下了个httpclient-4.3.4.jar改成SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, null);就可以了啊 [100分求助]如何从外部读取jar包中的资源文件 求大虾,一个小问题 熟悉java和delphi的高手请进 xml数据转入到mysql中 (java) 请教达人c3p0连接池的问题 为什么我的jsp页面登陆非常慢???急! 求思路webservice管理多个配置文件 vcvcx 用ant,以前都没事,现在却不行 ... 连接oracle的问题 DecimalFormat格式化double类型的数字有误差 Java连接SQL Server出现错误,求指教
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class XiaMen_IS
{ public static void main(String[] args)
{
crawler();
} // 信息抓取
public static void crawler()
{
try
{ CloseableHttpClient cbHttpClient = createSSLInsecureClient();
getVerficationCode(cbHttpClient);
} catch (Exception e)
{
System.out.println("---厦门社保抓取失败---");
}
} // 获取验证码
private static String getVerficationCode(CloseableHttpClient cbHttpClient) throws Exception
{
try
{
String url = "https://app.xmhrss.gov.cn/wcm/servlet/VCodeServlet";// 验证码地址
HttpGet get = new HttpGet(url);
HttpResponse response = cbHttpClient.execute(get);// 报异常
// 获取验证码字节数组
byte data[] = EntityUtils.toByteArray(response.getEntity()); } catch (Exception e)
{
System.out.println("厦门社保下载验证码异常:");
e.printStackTrace();
throw e;
} return null;
} // client工具函数,信任对方(https)所有证书
public static CloseableHttpClient createSSLInsecureClient()
{
try
{
// 创建安全套接字对象
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy()
{
// 信任所有
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
return true;
}
}).build();
// 获取分层tls/ssl连接
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException e)
{
e.printStackTrace();
} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
} catch (KeyStoreException e)
{
e.printStackTrace();
}
return HttpClients.createDefault();
}}
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
改为
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());亲测已经可以把验证码下载下来了。
我用4.4运行的,org.apache.http.conn.ssl.SSLConnectionSocketFactory。
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, null);
就可以了啊