因最近项目需要,将http转化为https,因此做个记录。
1、首先去网站把证书下下来
最终得到一个.cer文件
2、将 .cer 文件转换为 .bks文件,将生成的 .bks 文件放入 raw 目录下
我用的是 bcprov-jdk15on-159.jar
输入命令
keytool -importcert -v -trustcacerts
-alias (别名,随便取个名字)
-file xx.cer(下载证书的全路径)
-keystore xxx.bks (生成文件的全路径)
-storetype BKS
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider
-providerpath xxx.jar (你下载转换工具的全路径)
-storepass xxxxxx(密码,自定义)
注意:上述命令没有换行,路径最好用英文
3、代码中,增加以下代码即可。
okHttpClient.sslSocketFactory(SSLSocketFactory sslSocketFactory)
/**
* 获取bks文件的sslsocketfactory
* @param context
* @return
*/
public static SSLSocketFactory getSSLSocketFactory(Context context) {
final String CLIENT_TRUST_PASSWORD = "123456";//信任证书密码,该证书默认密码是123456
final String CLIENT_AGREEMENT = "TLS";//使用协议
final String CLIENT_TRUST_KEYSTORE = "BKS";
SSLContext sslContext = null;
try {
//取得SSL的SSLContext实例
sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);
//取得TrustManagerFactory的X509密钥管理器实例
TrustManagerFactory trustManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//取得BKS密库实例
KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);
InputStream is = context.getResources().openRawResource(R.raw.service);
try {
tks.load(is, CLIENT_TRUST_PASSWORD.toCharArray());
} finally {
is.close();
}
//初始化密钥管理器
trustManager.init(tks);
//初始化SSLContext
sslContext.init(null, trustManager.getTrustManagers(), null);
} catch (Exception e) {
e.printStackTrace();
}
return sslContext.getSocketFactory();
}
最后,如果运行中报错:
javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified
那么,还需增加一行代码
okHttpClient.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
再次访问,就应该没问题了。