https双向认证,这种一般不会在android遇到,因为这种正常是服务器和服务器之间通信采用,而且是银行金融类用的比较多。用在android端的话,不仅起不到安全作用,反而会让https不安全,因为加密对称秘钥的公私钥需要存放在客户端。具体为什么不安全,这是很基础的知识,这里不讲。

正常需要用到双向认证时,会给我们2个证书:Ca证书   和   .p12结尾的证书,  这种做法比较简单,网上到处都有,不赘述。

这里我们要讨论的是,有的情况,给我们的证书是4个文件:

  1. ca证书(单向认证时使用),
  2. 公钥证书
  3. 私钥(这个是一对)
  4. 服务器认证客户端的证书

 

 

解决方法:

SSLContext sslContext = SSLContext.getInstance("TLS");CertificateFactory cf = CertificateFactory.getInstance("X.509");// 客户端认证服务端InputStream in = BaseUtils.getApp().getAssets().open("puk.crt");   // 这个puk.crt文件可以是16进制的也可以是Base64后的Certificate ca = cf.generateCertificate(in);KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());trustStore.load(null, null);trustStore.setCertificateEntry("ca", ca);TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());            trustManagerFactory.init(trustStore);// 服务端认证客户端KeyStore keyStore = KeyStore.getInstance("PKCS12");keyStore.load(null, null);Certificate secondPuk = cf.generateCertificate(new ByteArrayInputStream(Base64.decode(cert1)));Certificate secondCert = cf.generateCertificate(new ByteArrayInputStream(Base64.decode(cert2)));PrivateKey privateKey = Utils.getPrivatekey(pem);if(privateKey == null){      return null;}KeyStore.PrivateKeyEntry secondPri = new KeyStore.PrivateKeyEntry(privateKey, new Certificate[]{secondPuk});// 加载证书keyStore.setCertificateEntry("cert", secondCert);keyStore.setEntry("pri", secondPri, null);// 初始化KeyManagerFactoryKeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");//(KeyManagerFactory.getDefaultAlgorithm());keyManagerFactory.init(keyStore, null);            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);SSLSocketFactory socketFactory = sslContext.getSocketFactory();OkHttpClient okHttpClient = new OkHttpClient.Builder()   // 构建OKHttp客户端                    .sslSocketFactory(socketFactory)                    .build();

 

更多相关文章

  1. Android(客户端)与Linux(服务器端)进行TCP数据通信
  2. Android进阶高手(五)之Android聊天室(4)---完结篇
  3. Android(安卓)—— KeyStore密钥库
  4. 对新浪微博android客户端中ListView的实现
  5. Android中即时通讯协议选择
  6. 2020字节跳动客户端实习春招三轮面试
  7. android_项目_知识积累_mina通信(android手机登录功能)
  8. android基于XMPP的消息推送机制
  9. 基于Mqtt协议Paho项目实现Android消息推送

随机推荐

  1. Sensor系列之aDSP端Sensor Driver流程
  2. OSG 坑爹的Android(安卓)example
  3. Android(安卓)studio+SQLCipher加密SQLit
  4. 十大免费移动程序测试框架(Android/iOS)
  5. Android(安卓)ellipsize的小问题
  6. Android(安卓)IPC数据在内核空间中的发送
  7. 支付宝客户端架构解析:Android(安卓)容器
  8. 报告显示Q2 Android平板电脑全球市场份额
  9. Android解决用户多次点击按钮问题
  10. 关于android:listview getChildAt 为空的