项目中需要切换到HTTPS上,且网上搜到的资料不甚清晰(可以称之为乱七八糟),特此记录处理步骤。
老规矩,测试环境为macOS High Sierra 10.13.1/JDK1.8.0_51/Android Studio2.3.3,且增加jar包bcprov-ext-jdk15on-158.jar到JDK_HOMEjrelibext下。
将服务器的crt文件获取到(xx.crt),然后开启Terminal,cd到crt文件目录下,执行下面的指令:
keytool -importcert -trustcacerts -keystore ./xx.bks -file ./xx.crt
-storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
输入密码(后面需要用到,这里假设是:123123),得到xx.bks文件,复制到项目的assets目录
Gradle引用
compile 'com.loopj.android:android-async-http:1.4.9'
实现一个基础的网络请求
AsyncHttpClient httpClient = new AsyncHttpClient();
httpClient.post(this, url, params, textHttpResponseHandler);
实现SSL的支持,改造代码如下:
AsyncHttpClient httpClient = new AsyncHttpClient(); KeyStore
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream inputStream = this.getAssets().open("xx.bks");
trustStore.load(inputStream, "123123".toCharArray());
MySSLSocketFactory mSSL = new MySSLSocketFactory(trustStore);
httpClient.setSSLSocketFactory(mSSL); httpClient.post(this, url,
params, textHttpResponseHandler);
运行项目,执行HTTPS网络请求就可以发现能正常请求了。
附:
其他的证书转换指令:
生成p12
openssl pkcs12 -export -in xx.crt -inkey xx.key -out xx.p12 -name "xx"
p12->keystore
keytool -importkeystore -v -srckeystore xx.p12 -srcstoretype pkcs12
-srcstorepass 123123 -destkeystore xx.keystore -deststoretype jks -deststorepass 123123
keystore->cer
keytool -export -keystore xx.keystore -alias lx -file xx.cer
cer+key->pfx
openssl pkcs12 -export -inkey xx.key -in xx.cer -out xx.pfx
pfx->pem
openssl pkcs12 -in xx.pfx -nodes -out xx.pem
pem->key
openssl rsa -in xx.pem -out xxx.key
pem->crt
openssl x509 -in xx.pem -out xx.crt
注:
1.以上实现基础建立在服务器HTTPS已经配置好,且项目有网络权限,有CRT文件的基础条件;
2.jar包是必须添加的,否则无法生成bks文件。
漂亮 解决了我的问题 ths