Https请求异常:javax.net.ssl.SSLHandshakeException

通过HttpClient对https协议的url发出请求,产生异常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: basic constraints check failed: pathLenConstraint violated - this cert must be the last cert in the certification path 
是由于Java安全性策略导致,解决方法有导入cert证书和改变安全策略,选择第二种通过代码改变安全性,无条件接受所有证书,加两个类、两行代码:
类一:
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
public class MySecureProtocolSocketFactory implements
  SecureProtocolSocketFactory {
 private SSLContext sslContext = null;
 /**
  * Constructor for MySecureProtocolSocketFactory.
  */
 public MySecureProtocolSocketFactory() {
 }
 /**
  * 
  * @return
  */
 private static SSLContext createEasySSLContext() {
  try {
   SSLContext context = SSLContext.getInstance("SSL");
   context.init(null, new TrustManager[] { new MyX509TrustManager() },
     null);
   return context;
  } catch (Exception e) {
   throw new HttpClientError(e.toString());
  }
 }
 /**
  * 
  * @return
  */
 private SSLContext getSSLContext() {
  if (this.sslContext == null) {
   this.sslContext = createEasySSLContext();
  }
  return this.sslContext;
 }
 /*
  * (non-Javadoc)
  * 
  * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
  *      int, java.net.InetAddress, int)
  */
 public Socket createSocket(String host, int port, InetAddress clientHost,
   int clientPort) throws IOException, UnknownHostException {
  return getSSLContext().getSocketFactory().createSocket(host, port,
    clientHost, clientPort);
 }
 /*
  * (non-Javadoc)
  * 
  * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
  *      int, java.net.InetAddress, int,
  *      org.apache.commons.httpclient.params.HttpConnectionParams)
  */
 public Socket createSocket(final String host, final int port,
   final InetAddress localAddress, final int localPort,
   final HttpConnectionParams params) throws IOException,
   UnknownHostException, ConnectTimeoutException {
  if (params == null) {
   throw new IllegalArgumentException("Parameters may not be null");
  }
  int timeout = params.getConnectionTimeout();
  if (timeout == 0) {
   return createSocket(host, port, localAddress, localPort);
  } else {
   return ControllerThreadSocketFactory.createSocket(this, host, port,
     localAddress, localPort, timeout);
  }
 }
 /*
  * (non-Javadoc)
  * 
  * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
  */
 public Socket createSocket(String host, int port) throws IOException,
   UnknownHostException {
  return getSSLContext().getSocketFactory().createSocket(host, port);
 }
 /*
  * (non-Javadoc)
  * 
  * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
  */
 public Socket createSocket(Socket socket, String host, int port,
   boolean autoClose) throws IOException, UnknownHostException {
  return getSSLContext().getSocketFactory().createSocket(socket, host,
    port, autoClose);
 }
}
类二:


import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class MyX509TrustManager implements X509TrustManager {
 /*
  * (non-Javadoc)
  * 
  * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[],
  *      java.lang.String)
  */
 public void checkClientTrusted(X509Certificate[] arg0, String arg1)
   throws CertificateException {
 }
 /*
  * (non-Javadoc)
  * 
  * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[],
  *      java.lang.String)
  */
 public void checkServerTrusted(X509Certificate[] arg0, String arg1)
   throws CertificateException {
 }
 /*
  * (non-Javadoc)
  * 
  * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
  */
 public X509Certificate[] getAcceptedIssuers() {
  return null;
 }

 两行代码:
HttpClient请求之前,加
//接受所有的安全证书
  ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();
  Protocol.registerProtocol("https", new Protocol("https", fcty, 443)); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值