萌萌の初音
萌萌の初音
发布于 2023-03-15 / 1054 阅读
0

Android客户端网络加入ssl证书

公司项目需要客户端证书验证,这里记录下客户端验证。

1.首先需要将crt、pem证书转换为BKS

需要jdk、keytool和openssl,没有请下载好并配置环境。

先转换为p12证书
openssl pkcs12 -export -in certificate.pem -inkey certificate.key -out certificate.p12 -name test

certificate.pem为你的证书路径,certificate.key为你的证书key路径,certificate.p12为你的p12证书生成路径。以上命令就可以生成一个p12证书;注意:转换提示你需要输入密码请记住你输入的密码。

p12转换为BKS证书
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore certificate.bks -deststoretype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk18on-172.jar

certificate.p12为你的p12证书路径,certificate.bks 是bks证书生成路径,bcprov-jdk18on-172.jar是转换为bks证书所需要的jar包路径。注意:转换提示你需要输入密码请记住你输入的密码。

bcprov-jdk下载

下载链接http://www.bouncycastle.org/latest_releases.html

bks证书在android中的使用

我们将生成好的bks证书放入assets目录中。
然后重写x509进行应用:

        TrustManager[] tm = {x509mgr}; //服务端的证书验证重写x509实现
        SSLContext sslContext = SSLContext.getInstance("TLS");
        
        // 这里是客户端证书的处理流程 start
        KeyManagerFactory keyManager = KeyManagerFactory.getInstance("X509");
        KeyStore kks = KeyStore.getInstance("BKS");
        kks.load(MyApplication.getInstance2().getAssets().open("certificate.bks"), "123456".toCharArray());
        keyManager.init(kks, "123456".toCharArray());
        // 这里是客户端证书的处理流程 end
        
        sslContext.init(keyManager.getKeyManagers(), tm, new java.security.SecureRandom());
        SSLSocketFactory ssf  = sslContext.getSocketFactory();

“123456”.toCharArray()是你shell操作中输入的密码;
certificate.bks是你放入assets目录中的bks证书;

最后将生成的SSLSocketFactory放入okhttp3或者HttpsURLConnection里客户端证书的操作就完成了。