android volley连接https

tcwi4767 9年前

来自: http://my.oschina.net/zengliubao/blog/616666


Android中使用volley进行Https 通讯的时候,如果没有申请正式会报错:( 我们的服务器用nginx作为容器 )

VolleyEror: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

最好的办法是按照规则来办事:加证书。然而调试服务器说不加...

那么要怎么才不会报错呢?

1.查看接口 X509TrustManger.java ( 在包javax.net.ssl )

X509TrustManager.Java  //------------------------------------    package javax.net.ssl;    import java.security.cert.CertificateException;  import java.security.cert.X509Certificate;    /**   * The trust manager for X509 certificates to be used to perform authentication   * for secure sockets.   */  public interface X509TrustManager extends TrustManager {        /**       * Checks whether the specified certificate chain (partial or complete) can       * be validated and is trusted for client authentication for the specified       * authentication type.       *       * @param chain       *            the certificate chain to validate.       * @param authType       *            the authentication type used.       * @throws CertificateException       *             if the certificate chain can't be validated or isn't trusted.       * @throws IllegalArgumentException       *             if the specified certificate chain is empty or {@code null},       *             or if the specified authentication type is {@code null} or an       *             empty string.       */      public void checkClientTrusted(X509Certificate[] chain, String authType)              throws CertificateException;          /**       * Checks whether the specified certificate chain (partial or complete) can       * be validated and is trusted for server authentication for the specified       * key exchange algorithm.       *       * @param chain       *            the certificate chain to validate.       * @param authType       *            the key exchange algorithm name.       * @throws CertificateException       *             if the certificate chain can't be validated or isn't trusted.       * @throws IllegalArgumentException       *             if the specified certificate chain is empty or {@code null},       *             or if the specified authentication type is {@code null} or an       *             empty string.       */      public void checkServerTrusted(X509Certificate[] chain, String authType)              throws CertificateException;        /**       * Returns the list of certificate issuer authorities which are trusted for       * authentication of peers.       *       * @return the list of certificate issuer authorities which are trusted for       *         authentication of peers.       */      public X509Certificate[] getAcceptedIssuers();  }      //-------------------------------------------------------------------------------

 

2.FakeX509TrustManger  implements X509TrustManager

package com.http.utils;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;/** * * * Created by Administrator on 2016/2/17. */public class FakeX509TrustManager implements X509TrustManager {    private static TrustManager[] trustManagers;    private static final X509Certificate[] _AcceptedIssuers = new            X509Certificate[] {};    @Override    public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {        //To change body of implemented methods use File | Settings | File Templates.    }    @Override    public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {        //To change body of implemented methods use File | Settings | File Templates.    }    public boolean isClientTrusted(X509Certificate[] chain) {        return true;    }    public boolean isServerTrusted(X509Certificate[] chain) {        return true;    }    @Override    public X509Certificate[] getAcceptedIssuers() {        return _AcceptedIssuers;    }    public static void allowAllSSL() {        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {            @Override            public boolean verify(String arg0, SSLSession arg1) {                // TODO Auto-generated method stub                return true;            }        });        SSLContext context = null;        if (trustManagers == null) {            trustManagers = new TrustManager[] { new FakeX509TrustManager() };        }        try {            context = SSLContext.getInstance("TLS");            context.init(null, trustManagers, new SecureRandom());        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (KeyManagementException e) {            e.printStackTrace();        }        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());    }}

 

3.在请求前设置忽略所有的验证,允许所有的SSL

 

(.equals(requestUrl.getMethod())){           requestMethod=Request.Method.;        }{           url=url++params.toString();         }          FakeX509TrustManager.();StringRequest httpRequest = StringRequest(requestMethod, url, Response.Listener<String>() {              onResponse(String response) {  .dismissDialog();