为 Android 程序创建 CA keystore 以及 self-signed keystore 的方法 - yanbin's Blog

为 Android 程序创建 CA keystore 以及 self-signed keystore 的方法

yanbin posted @ 2015年3月29日 18:36 in Networking with tags programming Networking , 3435 阅读
为什么 Android 程序需要 CA KeyStore?
1. 在 Android 程序中建立一条 SSL/TLS 连接时,受信任 CA (Trusted CAs) 用来验证 server。
    Public-Key Infrastructure (PKI) 中有 trust certs 概念,许多网络工具实现了 trusted CA 的使用。
    比如: curl, Android URLConnection.
    Android 系统中有一个 trusted CAs list, 包含 100 多个 trusted CAs.
  
2. 建立 SSL/TLS 连接时现有的 trusted CAs 不能验证服务器证书,会引发一个 security exception:
       javax.net.ssl.SSLHandshakeException: ... : Trust anchor for certification path not found.
   具体而言,以下这些情况会引发这个问题:
      (a) The CA that issued the server certificate was unknown;
      (b) The server certificate wasn't signed by a CA, but was self signed;
      (c) The server configuration is missing an intermediate CA;
 
3. 针对(a) 和 (b) 这两种情况,解决方法是创建 SSL/TLS 连接时使用 Android TurstManager 工具。
    在 Android 程序中 TrustManager 用 KeyStore instance 初始化,而 KeyStore instance 读取/解析
    BKS/JKS 格式的 KeyStore 文件,获得证书信息。
 
  
4. 使用 keytool 工具创建 BKS 格式的 KeyStore 文件。
    keytool 在多数 linux 发行版中都可以通过 package 管理工具获得。
    keytool 创建 BKS 格式的 KeyStore 文件需要用到 BouncyCastle Provider, 这个文件 JRE 不提供,
    keytool 本身也没有提供,需要下载后通过参数指定。创建 JKS 格式的 KeyStore 不用这个文件。
 
    $ keytool -importcert -v -trustcacerts -file "root-ca.crt" -alias root-ca -keystore "root-ca.bks"
       -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar"
       -storetype BKS -storepass zhelishimia
 
   验证 keystore 文件是否正确:
   $ keytool -list -keystore "root-ca.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider
     -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass zhelishimima
 
5. 也可以直接用 server certificate 生成 keystore 并且设置为 trusted, 不过这样做不够安全,而且 server
    端的证书有改变时还需要生成新的证书。
  
 
有时也客户端程序也用证书标识自己的身份。或者有些 JAVA server 程序中建立 SSL 连接时用 KeyStore
提供证书信息。
1. 使用 openssl 工具转换 X509 格式的 public certificate 和 private key 为 pkcs12 格式的文件。
    $ openssl pkcs12 -export -in broker.crt -inkey broker.key -out broker.p12 -name client001
       -CAfile root-ca.crt -chain
 
2. 使用 openssl 工具和 pkcs12 文件生成 keystore
    $ keytool -importcert -v -trustcacerts -file "root-ca.crt" -alias root-ca -keystore "root-ca.bks"
       -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar"
       -storetype BKS -storepass 12345678
 
3. 在 Android 程序中, 建立一条 SSL 连接时可以用 KeyManager 工具指定本端的 public certificate,
    private key, KeyManager 需要用 KeyStore instace 初始化,KeyStore instance 加载/解析 keystore 文件,
    获取 public certificate 以及 private key 信息。
 
 
参考:

   

Avatar_small
pokemon go apk 说:
2017年1月22日 19:04

This is a very interesting web page and I have enjoyed reading many of the articles and posts contained on the website, keep up the good work and hope to read some more interesting content in the future.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee