
一、写在前面,客户端的证书,一般是由服务端提供的,我们来认识一下:
ca.crt :服务端证书
clIEnt.crt :客户端证书
clIEnt.key :客户端证书秘钥
ca.crt就是我们客户端单向验证时使用的证书, 那么clIEnt.crt和clIEnt.key就应该是双向验证用到的bks了,于是重点就是他们间的转换了
准备工作,我们用到两个工具:
openssl:证书格式转换及秘钥获取
下载地址:https://download.csdn.net/download/hhbbeijing/13454495
keytool:
介绍:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
二、正文
先看一段okhttps创建的代码:
OkhttpClIEnt.Builder builder = new OkhttpClIEnt().newBuilder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15,TimeUnit.SECONDS) .addNetworkInterceptor(logInterceptor) .hostnameVerifIEr(new MYHostnameVerifIEr(HOSTname));if(trustManager != null){ //SSLSocketFactory x509trustmanager builder.sslSocketFactory(getSSLSocketFactory(trustManager),trustManager);}mOkhttpClIEnt = builder.build();需要两个参数:
SSLSocketFactory:(2): BKS_PWD JKSnametrustManager:(1) 其中CERTname是信任的服务端证书,但格式为cer,由ca.crt格式转换而来。(可以直接修改后缀)
(1):
private x509trustmanager getTrustManager(){ inputStream certificate = null; x509trustmanager trustManager = null; try { certificate = mContext.getAssets().open(CERTname); trustManager = trustManagerForCertificates(certificate); } catch (Exception e) { //e.printstacktrace(); } return trustManager;}(2):
private SSLSocketFactory getSSLSocketFactory(x509trustmanager trustManager) throws NoSuchAlgorithmException, KeyManagementException { SSLContext context = SSLContext.getInstance("TLS"); TrustManager[] trustManagers = {trustManager}; KeyManager[] keyManagers = getKeyManager(); context.init(keyManagers, trustManagers, new SecureRandom()); return context.getSocketFactory();}private KeyManager[] getKeyManager() { try { String pwd = BKS_PWD; inputStream bks = mContext.getAssets().open(JKSname); KeyStore clIEntKeyStore = KeyStore.getInstance("BKS"); clIEntKeyStore.load(bks, pwd.tochararray()); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(clIEntKeyStore, pwd.tochararray()); return keyManagerFactory.getKeyManagers(); } catch (Exception e) { //e.printstacktrace(); } return null;}重点来了,如何
1、androID平台能识别的客户端证书 为:.bks格式的,需要格式转换,分两步:
第一步,将 clIEnt.crt 和 clIEnt.key转换成 clIEnt.p12
openssl pkcs12 -export -in clIEnt.crt -inkey clIEnt.key -out clIEnt.p12 -name tomcat -CAfile ca.crt -caname root -chain
第二步,把.p12格式转换成.bks
使用 【portecle】工具转换为 .bks (JKSname),记住输入的密码 (BKS_PWD)。
2、由ca.crt格式转换而来。(可以直接修改后缀)或者 openssl x509 -in ca.crt -out server.cer -outform der
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
至此全部完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考文献:
https://blog.csdn.net/liudehuaii18/article/details/50373652
总结
以上是内存溢出为你收集整理的android okhttp3 配置https证书全部内容,希望文章能够帮你解决android okhttp3 配置https证书所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)