Android AsyncHttpClient设置HTTPS支持

@hanq  2017年11月22日 09:57

项目中需要切换到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文件。


添加新评论

  1. docker

    漂亮 解决了我的问题 ths

    Reply