android 系统中使用的证书要求以BKS的库文件结构保存,通常情况下,我们使用java的keytool只能生成jks的证书库,如果生成BKS的则需要下载BC库,如是JDK1.6则下载bcprov-jdk16-141.jar,且将该文件放到jdk1.6.0_03\jre\lib\ext目录下,然后运行以下命令即可以生成BKS的证书库和相应的证书。

keytool -genkey -alias <别名> -keypass <密钥口令>  -keyalg RSA -keysize 1024 -validity 365 -keystore <库文件名,如runcerts.keystore> -storepass <证书库密码> -dname "cn=runtestuser3, ou=vpn, o=run, c=CN, l=shanghai" -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider

Android client端

1.       该android客户端生成一个私钥文件

Keytools –genkey –alias clientkey –keystorebksclient.keystore –storetype BKS

2.       由kserver.keystore导出证书(BKS格式)

keytool -exportcert -alias kserverkey -keystorekserver.keystore -storetype BKS -filebksserver.crt

3.       从android的/system/etc/security中提取cacerts.bks信任证书,该证书是BKS格式的

4.       把向cacerts.bks导入证书(BKS)

keytool -importcert -keystorecacerts.bks -storetypeBKS -filebksserver.crt -providerorg.bouncycastle.jce.provider.BouncyCastleProvider -trustcacerts

5.       可以keytool –list –keystore“keystore文件名”  查看证书的信息

6.       将bksclient.keystore和cacerts.bks放到res/raw目录下

7.       android代码:


public class AndroidSslActivity extends Activity{

private static final int SERVER_PORT =4444;//端口号

private static final String SERVER_IP = "服务器ip地址";//连接IP

private static final String CLIENT_KET_PASSWORD = "123456";//私钥密码

private static final String CLIENT_TRUST_PASSWORD = "changeit";//信任证书密码,该证书默认密码是changeit

private static final String CLIENT_AGREEMENT = "TLS";//使用协议

private static final String CLIENT_KEY_MANAGER = "X509";//密钥管理器

private static final String CLIENT_TRUST_MANAGER = "X509";//

private static final String CLIENT_KEY_KEYSTORE = "BKS";//密库,这里用的是BouncyCastle密库

private static final String CLIENT_TRUST_KEYSTORE = "BKS";//

private static final String ENCONDING = "utf-8";//字符集

private SSLSocket Client_sslSocket;

private Log tag;

private TextView tv;

private Button btn;

private Button btn2;

private Button btn3;

private EditText et;

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tv = (TextView)findViewById(R.id.textview01);

et = (EditText)findViewById(R.id.edittext01);

btn = (Button)findViewById(R.id.button01);

btn2 = (Button)findViewById(R.id.button02);

btn3 = (Button)findViewById(R.id.button03);

btn.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0){

if(null != Client_sslSocket){

getOut(Client_sslSocket, et.getText().toString());

getIn(Client_sslSocket);

et.setText("here");

}

}

});

btn2.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0){

if (Client_sslSocket != null){

try {

Client_sslSocket.close();

Client_sslSocket = null;

catch (IOException e){

e.printStackTrace();

}

}

}

});

btn3.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0){

init();

if (Client_sslSocket != null){

getIn(Client_sslSocket);

}else {

tag.i("AndroidSslActivity", "sslsocket= null");

}

}

});

}

public void init(){

try {

//取得SSL的SSLContext实例

SSLContext sslContext =SSLContext.getInstance(CLIENT_AGREEMENT);

//取得KeyManagerFactory和TrustManagerFactory的X509密钥管理器实例

KeyManagerFactory keyManager =KeyManagerFactory.getInstance(CLIENT_KEY_MANAGER);

TrustManagerFactory trustManager =TrustManagerFactory.getInstance(CLIENT_TRUST_MANAGER);

//取得BKS密库实例

KeyStore kks=KeyStore.getInstance(CLIENT_KEY_KEYSTORE);

KeyStore tks =KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);

//加客户端载证书和私钥,通过读取资源文件的方式读取密钥和信任证书

kks.load(getBaseContext()

.getResources()

.openRawResource(R.raw.bksclient),CLIENT_KET_PASSWORD.toCharArray());

tks.load(getBaseContext()

.getResources()

.openRawResource(R.raw.cacerts),CLIENT_TRUST_PASSWORD.toCharArray());

//初始化密钥管理器

keyManager.init(kks,CLIENT_KET_PASSWORD.toCharArray());

trustManager.init(tks);

//初始化SSLContext

sslContext.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),null);

Log.i("AndroidSslActivity", "startssl connecting");

//生成SSLSocket

Client_sslSocket = (SSLSocket)sslContext.getSocketFactory().createSocket(SERVER_IP,SERVER_PORT);

Log.i("AndroidSslActivity", "sslconnected");

catch (Exception e){

tag.e("AndroidSslActivity",e.getMessage());

}

}

public void getOut(SSLSocketsocket,String message){

PrintWriter out;

try {

out = new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(

socket.getOutputStream()

)

),true);

out.println(message);

catch (IOException e){

e.printStackTrace();

}

}

public void getIn(SSLSocketsocket){

BufferedReader in= null;

String str = null;

try {

in = new BufferedReader(

new InputStreamReader(

socket.getInputStream()));

str = new String(in.readLine().getBytes(),ENCONDING);

Log.i("AndroidSslActivity", "gettedstring : " + str);

catch (UnsupportedEncodingExceptione) {

e.printStackTrace();

catch (IOException e){

e.printStackTrace();

}

new AlertDialog

.Builder(AndroidSslActivity.this)

.setTitle("服务器消息")

.setNegativeButton("确定", null)

.setIcon(android.R.drawable.ic_menu_agenda)

.setMessage(str)

.show();

}

}

四、Trouble shooting

Connect refuse绝绝连接:ip地址不正确,用127.0.0.1也不行

Integrality checkedfail完整性检查失败:证书格式不对,android端用到的证书都要是BKS格式的,生成私钥以及想信任证书导入服务端证书时都要记得加上BKS和provider的参数

参考

http://aquariusoft.org/page/android/certs/

http://www.sunchis.com/html/java/javaweb/2010/0314/71.html

http://eddie.iteye.com/blog/78274

http://hi.baidu.com/renyijiu/blog/item/7e57a8a465ed60ff9052ee90.html

http://www.iteye.com/topic/88918

http://www.unix-center.net/bbs/archiver/?tid-4759.html

http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html

http://www.save-info.com/classic/2011/03/18/951

http://hi.baidu.com/bluewhale84/blog/item/f3bb20a1f538a9884710648c.html

http://www.blogjava.net/hadeslee/archive/2008/05/31/204867.html

http://qingzuochen.iteye.com/blog/404307

http://mywayscut.iteye.com/blog/671560

http://book.51cto.com/art/200707/51714.htm

http://soft.zdnet.com.cn/software_zone/2007/0829/476766.shtml

http://www.cublog.cn/u2/86974/showart_2197014.html

http://blog.csdn.net/hfeng101/article/details/10163627

android BKS相关推荐

  1. 挑战独立开发项目能力___ITlanbao

    2019独角兽企业重金招聘Python工程师标准>>> 做了5年的android开发,今天没事写写刚入行不久的时候第一次独立开发项目的心得体会,     当时我刚工作8个月,由于公司 ...

  2. httos双向认证配置_https双向认证配置

    https 双向认证配置: 1.生成服务器端密钥库 : keytool -genkey -keyalg RSA -dname "cn=rtsm.nfcstore.com.cn,ou=a,o= ...

  3. android 客户端bks,Keytools Https双向认证(Android通用)

    Https认证: 单向认证:保证服务器是可信任的,可以安全的访问的! 客户端拿到服务器的证书,通过CA认证信任,然后取出公钥,加密对称密钥传给服务器,服务器用自己的私钥解密得到对称密钥,后续使用该对称 ...

  4. Android(cacerts.bks)添加根证书

    Android(cacerts.bks)添加根证书 Android系统中CA证书文件的位置在:/system/etc/security/cacerts.bks 注意:Android 2.2官方系统中是 ...

  5. 生成android使用的BKS证书

    生成android使用的BKS证书 android 系统中使用的证书要求以BKS的库文件结构保存,通常情况下,我们使用java的keytool只能生成jks的证书库,如果生成BKS的则需要下载BC库, ...

  6. android load BKS error: wrong version of key store

    在android上加载BKS证书,4.3以上的高版本可以成功,但是低版本4.0.3上一直报错,搞了几天终于找到方法了 java.io.IOException: Wrong Version of key ...

  7. 如何生成android的BKS证书

    Android中要求使用BC证书,而java的keytool本身并不提供BKS证书,因此需要额外的辅助操作进行证书生成. (1)下载 bcprov-ext-jdk15on-146.jar,且将该文件放 ...

  8. android请求https(一)生成BKS

    本文乃博主方便以后忘记可以快速拾起而撰写的,不喜勿喷. 最近公司的项目要用到https请求,负责服务器的同事给了我证书,搞了一天都没成功,老是挂掉.(如果不太清楚可以先搜索下SSL握手) 后来在网上才 ...

  9. android https bks,如何将.cer转换为BKS

    尝试在terminal上使用这个(我假设你已经下载了Bouncy Castle jar在http://bouncycastle.org/latest_releases.html ): keytool ...

  10. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android

    客户端与服务器SSL双向认证(客户端Android-服务端vc)-含源码(一)服务端已经生成了client.p12.server.p12.ca.p12:主要实现客户端过程(二)目录结构(三)客户端注 ...

最新文章

  1. 【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  2. 迁移学习的挑战和六大突破点
  3. CodeForces - 1137B Camp Schedule(KMP的next数组+构造)
  4. LRU LeetCode
  5. nginx汇总(z)
  6. leetcode202. 快乐数
  7. kotlin数据库_如何在Kotlin应用程序中使用Xodus数据库
  8. Bootstrap 打印机类
  9. 企业的培训体系:145页企业培训年度规划和培训体系的建立
  10. java代码中发送http请求中使用DnsResolver的问题
  11. IDEA登录Github账号失败的解决办法
  12. php备份网站程序,使用PHP备份整个网站
  13. python socket connect 阻塞_python – 如何获得非阻塞socket connect()?
  14. c语言设计数字增量pi控制器,PI控制器的工作原理是什么?
  15. 4)自适应滤波(一)[LMS算法]
  16. JMeter做性能测试之前,你应该要知道的套路?
  17. 发那科pmc地址分配_FANUC IO模块地址分配详解
  18. [OHIF-Viewers]医疗数字阅片-医学影像-安装问题
  19. 干货 | 数据思维在携程商旅页面性能优化中的一次实践
  20. sqlserver 查询练习

热门文章

  1. [教程] PSP 5.00M33-6升级图文教程
  2. 视觉心理物理学(2)matlab与ptb3
  3. 【Flutter实战静态页面】--在线点餐app(7)——页面跳转
  4. phalcon mysql_PHP-Phalcon框架中的数据库操作
  5. 通过微信传文件在服务器保留几天,微信发送文件多久会失效
  6. 【人情世故】汇报措辞
  7. 个人用 Qt + ffmpeg + D3D9/D3D11 开发的播放器
  8. [毕业生的商业软件开发之路]现代商业软件开发概况
  9. Apache NiFi简介
  10. 产品经理-自然资源行业4大产品线整理