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
- Okhttp访问https 12306
- 使用OkHttp访问ssl(https)网络
- OKHTTP的拦截器以及https访问
- Android Https访问(HttpClient,Httpurlconnect,Okhttp)
- OkHttp使用Https访问服务器时信任所有证书
- Android使用OkHttp访问自签名证书的Https接口
- okhttp实现https访问,支持Android 4.X系统https访问
- okHttp 使用HTTPS证书
- Https-OKHttp 配置
- 使用okhttp设置https
- OKHttp进行Https认证
- Android 4.x 在 https 协议下无法利用 okhttp 进行网络访问的临时解决办法
- https 证书验证 okhttp https设置
- Android 网络--Volley+OkHttp+Https
- Android 网络: Volley+OkHttp+Https
- Okhttp的https的设置
- Android开发okhttp接入https
- okhttp的https的使用
- (第三季)107-正则表达式介绍;108-定位元字符 ^ $ 109-基本语法元字符110-反义字符
- Exception处理
- Liunx下解决动态链接库符号未定义问题
- 匿名函数的变量
- 缅怀雷神
- Okhttp访问https 12306
- 我写过的脚本
- 根据url获取文件名,获取文件大小
- 数据库三级模式(1)
- 基于swoole搭建聊天室程序
- 数据清洗工具OpenRefine
- UE4蓝图笔记
- 下拉列表获取选中值
- 用编程解决生活中的问题