美文网首页
OKHTTP里HTTPS的使用

OKHTTP里HTTPS的使用

作者: anliner | 来源:发表于2019-06-06 17:42 被阅读0次

    一、相关资料

    1.1、下载openssl

    下载安装openssl,并配置环境变量:http://slproweb.com/products/Win32OpenSSL.html

    1.2、生成pfx证书

    生成私钥文件:openssl genrsa -des3 -out 私钥文件 密钥长度
    并设置私钥文件密码

    openssl genrsa -des3 -out *private.key 2048*
    

    使用私钥生成公钥证书:openssl req -new -x509 -key 私钥文件 -days 有效期 -out 公钥证书文件
    验证私钥文件密码,输入国家、城市、组织、姓名等信息后生成公钥证书

    openssl  req -new -x509 -key privateKey_RSA .key -days 3650 -out public.cer
    

    使用私钥文件、公钥证书生成pfx证书:openssl pkcs12 -export -name 别名 -in 公钥证书文件 -inkey 私钥文件 -out 证书文件

    openssl pkcs12 -export -name client -in public.cer -inkey private.key -out client.pfx
    

    1.3、pfx证书 => cer证书

    在Windows电脑里双击安装pfx证书,然后在IE浏览器的设置里导出X.509格式的公钥证书server.cer


    image
    image

    1.4、cer证书 => jks证书库

    keytool -import -v -alias 别名 -file 公约证书文件 -keystore jks证书库文件 -storepass 密码

     keytool -import -v -alias server -file server.cer -keystore server.jks -storepass 123456
    

    1.5、jks证书库 => bks证书库

    下载Portecle工具:https://sourceforge.net/projects/portecle/
    解压运行protecle.jar > File > open Keystore File > 选择server.jks > 输入密码123456 > Tools > change keystore type > BKS > save keystore as

    1.6、jks证书库 => cer证书

    keytool -export -alias 别名 -file 公约证书文件 -keystore jks证书库文件 -storepass 密码

    keytool -export -alias server -file server.cer -keystore server.jks -storepass 123456
    

    二、相关代码

    3.1、SSLHelper

    class SSLHelper {
    
        static SSLSocketFactory getSSLSocketFactory(Context context) {
            SSLSocketFactory factory = null;
            InputStream keyStoreIS = null;
            InputStream trustStoreIS = null;
            try {
                // 初始化服务器端需要验证的客户端证书
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                keyStoreIS = context.getResources().getAssets().open("client.pfx");
                String password = "123456";
                keyStore.load(keyStoreIS, password.toCharArray());
                //密钥管理器
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
                keyManagerFactory.init(keyStore, password.toCharArray());
    
                // 初始化客户端信任的服务器端证书
                KeyStore trustStore = KeyStore.getInstance("BKS");
                trustStoreIS = context.getResources().getAssets().open("server.bks");
                trustStore.load(trustStoreIS, "123456".toCharArray());
                //信任管理器
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
                trustManagerFactory.init(trustStore);
    
                //初始化SSLContext
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
                factory = sslContext.getSocketFactory();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭客户端证书流
                if (keyStoreIS != null) {
                    try {
                        keyStoreIS.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                //关闭服务端证书流
                if (trustStoreIS != null) {
                    try {
                        trustStoreIS.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            return factory;
        }
    }
    

    3.2、SSLHostnameVerifier

    public class SSLHostnameVerifier implements HostnameVerifier {
    
        private static final String HOSTNAME = "192.168.0.1";
    
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return HOSTNAME.equals(hostname) && HOSTNAME.equals(session.getPeerHost());
        }
    }
    

    3.3、OkHttpClient

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .sslSocketFactory(SSLHelper.getSSLSocketFactory(App.getInstance()))
                .hostnameVerifier(new SSLHostnameVerifier())
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .connectTimeout(6, TimeUnit.SECONDS)
                .build();
    

    相关文章

      网友评论

          本文标题:OKHTTP里HTTPS的使用

          本文链接:https://www.haomeiwen.com/subject/mqpuxctx.html