【第六篇】Volley之https相關

來源:互聯網
上載者:User

標籤:

Volley之https信任所有認證實現:

public class HttpsTrustManager 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 {    }    @Override    public void checkServerTrusted(            java.security.cert.X509Certificate[] x509Certificates, String s)            throws java.security.cert.CertificateException {    }    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) {                return true;            }        });        SSLContext context = null;        if (trustManagers == null) {            trustManagers = new TrustManager[]{new HttpsTrustManager()};        }        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());    }}

代碼中調用方法如下:

HttpsTrustManager.allowAllSSL();//主要是這行實現信任所有認證的操作String  tag_string_req = "string_req";StringRequest strReq = new StringRequest(Request.Method.POST,        your_https_url, new Response.Listener<String>() {    @Override    public void onResponse(String response) {        Log.d(TAG, "response :"+response);    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {        VolleyLog.d(TAG, "Error: " + error.getMessage());    }}){    @Override    protected Map<String, String> getParams() {        Map<String, String> params = new HashMap<String, String>();        params.put("username", "max");        params.put("password", "123456");        return params;    }};AppController.getInstance().addToRequestQueue(strReq, tag_string_req);

 

信任指定的認證檔案

HurlStack代碼裡面有如下方法:

 /**     * @param urlRewriter Rewriter to use for request URLs     * @param sslSocketFactory SSL factory to use for HTTPS connections     * HurlStack這個類的構造大家就會發現其實volley可以支援https了,同樣位於toolbox包下     */    public HurlStack(UrlRewriter urlRewriter, SSLSocketFactory sslSocketFactory) {        mUrlRewriter = urlRewriter;        mSslSocketFactory = sslSocketFactory;    }
  /**     * Opens an {@link HttpURLConnection} with parameters.     * @param url     * @return an open connection     * @throws IOException     */    private HttpURLConnection openConnection(URL url, Request<?> request) throws IOException {        HttpURLConnection connection = createConnection(url);        int timeoutMs = request.getTimeoutMs();        connection.setConnectTimeout(timeoutMs);        connection.setReadTimeout(timeoutMs);        connection.setUseCaches(false);        connection.setDoInput(true);        // use caller-provided custom SslSocketFactory, if any, for HTTPS        if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) {            ((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory);        }        return connection;    }

 

在https協議的情況下,保證mSslSocketFactory 不為null,因此主要的問題是傳進去sslSocketFactory這個參數。

stackoverflow上面有個產生這個內容的工具類:

private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {        final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];        return new TrustManager[]{                new X509TrustManager() {                    public X509Certificate[] getAcceptedIssuers() {                        return originalTrustManager.getAcceptedIssuers();                    }                    public void checkClientTrusted(X509Certificate[] certs, String authType) {                        try {                            originalTrustManager.checkClientTrusted(certs, authType);                        } catch (CertificateException e) {                            e.printStackTrace();                        }                    }                    public void checkServerTrusted(X509Certificate[] certs, String authType) {                        try {                            originalTrustManager.checkServerTrusted(certs, authType);                        } catch (CertificateException e) {                            e.printStackTrace();                        }                    }                }        };    }private SSLSocketFactory getSSLSocketFactory_Certificate(String keyStoreType, int keystoreResId)        throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {    CertificateFactory cf = CertificateFactory.getInstance("X.509");    InputStream caInput = getResources().openRawResource(keystoreResId);    Certificate ca = cf.generateCertificate(caInput);    caInput.close();    if (keyStoreType == null || keyStoreType.length() == 0) {        keyStoreType = KeyStore.getDefaultType();    }    KeyStore keyStore = KeyStore.getInstance(keyStoreType);    keyStore.load(null, null);    keyStore.setCertificateEntry("ca", ca);    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);    tmf.init(keyStore);    TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());    SSLContext sslContext = SSLContext.getInstance("TLS");    sslContext.init(null, wrappedTrustManagers, null);    return sslContext.getSocketFactory();}private SSLSocketFactory getSSLSocketFactory_KeyStore(String keyStoreType, int keystoreResId, String keyPassword)            throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {        InputStream caInput = getResources().openRawResource(keystoreResId);        // creating a KeyStore containing trusted CAs        if (keyStoreType == null || keyStoreType.length() == 0) {            keyStoreType = KeyStore.getDefaultType();        }        KeyStore keyStore = KeyStore.getInstance(keyStoreType);        keyStore.load(caInput, keyPassword.toCharArray());        // creating a TrustManager that trusts the CAs in the KeyStore        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);        tmf.init(keyStore);        TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());        SSLContext sslContext = SSLContext.getInstance("TLS");        sslContext.init(null, wrappedTrustManagers, null);        return sslContext.getSocketFactory();    }

調用後面兩個,就能擷取SSLSocketFactory 內容,使用如下:

SSLSocketFactory sslSocketFactory = getSSLSocketFactory_KeyStore("BKS", R.raw.androidbksv1, "123456789");SSLSocketFactory sslSocketFactory = getSSLSocketFactory_Certificate("BKS", R.raw.androidbksv1_cert);

 

http://stackoverflow.com/questions/32154115/android-volley-self-signed-https-trust-anchor-for-certification-path-not-found

 

【第六篇】Volley之https相關

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.