一、相关资料
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();
网友评论