Okhttp访问https 12306

来源:互联网 发布:淘宝网店怎么开大概要多少钱 编辑:程序博客网 时间:2024/05/16 12:30


下面写的类调用其getInstance方法即可获得可以访问https的HttpClient对象,使用如下:

HTTPUtils utils = new HTTPUtils(getApplicationContext);

OkHttpClient client = utils.getInstance();

在需要操作的界面获取client对象后,我们就可以访问12306了。

关于HTTPS参考如下文章:

OKHTTP通信使用(三)HTTPS

Android Https相关完全解析 当OkHttp遇到Https

package utils;import android.content.Context;import java.io.IOException;import java.io.InputStream;import java.security.GeneralSecurityException;import java.security.KeyStore;import java.security.cert.Certificate;import java.security.cert.CertificateFactory;import java.util.Arrays;import java.util.Collection;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import javax.net.ssl.X509TrustManager;import okhttp3.OkHttpClient;/** * 用于访问https网络 */public final class HTTPSUtils {    public OkHttpClient client = null;    public Context mContext;    public static HTTPSUtils httpsUtils = null;    X509TrustManager trustManager;    SSLSocketFactory sslSocketFactory;    /**     * 初始化HTTPS,添加信任证书     *     * @param context     */    public HTTPSUtils(Context context) {        mContext = context;        final InputStream inputStream;        try {            //获取放在assets下面的12306的证书            inputStream = mContext.getAssets().open("srca.cer"); // 得到证书的输入流            try {                trustManager = trustManagerForCertificates(inputStream);//以流的方式读入证书                SSLContext sslContext = SSLContext.getInstance("TLS");                sslContext.init(null, new TrustManager[]{trustManager}, null);                sslSocketFactory = sslContext.getSocketFactory();            } catch (GeneralSecurityException e) {                throw new RuntimeException(e);            }            client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory).build();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 返回获取ssl后的okhttpclient,用于请求访问https     *     * @param context     * @return okhttpclient     */    public OkHttpClient getInstance(Context context) {        if (client == null) {            httpsUtils = new HTTPSUtils(context);            if (httpsUtils.client != null) {                return httpsUtils.client;            }        }        return client;    }    /**     * 以流的方式添加信任证书     */    /**     * Returns a trust manager that trusts {@code certificates} and none other. HTTPS services whose     * certificates have not been signed by these certificates will fail with a {@code     * SSLHandshakeException}.     * <p/>     * <p>This can be used to replace the host platform's built-in trusted certificates with a custom     * set. This is useful in development where certificate authority-trusted certificates aren't     * available. Or in production, to avoid reliance on third-party certificate authorities.     * <p/>     * <p/>     * <h3>Warning: Customizing Trusted Certificates is Dangerous!</h3>     * <p/>     * <p>Relying on your own trusted certificates limits your server team's ability to update their     * TLS certificates. By installing a specific set of trusted certificates, you take on additional     * operational complexity and limit your ability to migrate between certificate authorities. Do     * not use custom trusted certificates in production without the blessing of your server's TLS     * administrator.     */    private X509TrustManager trustManagerForCertificates(InputStream in)            throws GeneralSecurityException {        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");        Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(in);        if (certificates.isEmpty()) {            throw new IllegalArgumentException("expected non-empty set of trusted certificates");        }        // Put the certificates a key store.        char[] password = "password".toCharArray(); // Any password will work.        KeyStore keyStore = newEmptyKeyStore(password);        int index = 0;        for (Certificate certificate : certificates) {            String certificateAlias = Integer.toString(index++);            keyStore.setCertificateEntry(certificateAlias, certificate);        }        // Use it to build an X509 trust manager.        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(                KeyManagerFactory.getDefaultAlgorithm());        keyManagerFactory.init(keyStore, password);        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(                TrustManagerFactory.getDefaultAlgorithm());        trustManagerFactory.init(keyStore);        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();        if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {            throw new IllegalStateException("Unexpected default trust managers:"                    + Arrays.toString(trustManagers));        }        return (X509TrustManager) trustManagers[0];    }    /**     * 添加password     *     * @param password     * @return     * @throws GeneralSecurityException     */    private KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityException {        try {            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); // 这里添加自定义的密码,默认            InputStream in = null; // By convention, 'null' creates an empty key store.            keyStore.load(in, password);            return keyStore;        } catch (IOException e) {            throw new AssertionError(e);        }    }}

0 0