OKHTTP里HTTPS的使用

2019-06-06  本文已影响0人  anliner

一、相关资料

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();
上一篇下一篇

猜你喜欢

热点阅读