android - 如何在Android设备上安装可信的CA证书?

我已经创建自己的CA证书,现在我想将它安装在我的安卓设备(HTC Desire Z)上,这样设备会信任我的证书。

Android在/system/etc/security/cacerts.bks的Java密钥库中存储CA证书,我将文件复制到我的计算机上,使用portecle 1.5添加证书,并且将它推送回设备。

现在,Android似乎不会自动重新加载文件,我已经阅读了几个博客文章,我需要重启设备,但这样做会导致文件再次被原始文件覆盖。

我的下一个尝试是通过SD卡复制,并且使用设置菜单中的选项来安装证书,设备告诉我证书已经安装,但是,显然它不信任证书,此外,当我尝试将密钥库复制到我的计算机时,仍然找到原始的cacerts.bks 。

那么,在Android 设备上安装我自己的根CA证书作为可信证书的正确方法是什么?是否有方法以编程方式进行?

时间:

如果你需要HTTPS连接的证书,你可以将.bks文件作为原始资源添加到你的应用程序,并扩展DefaultHttpConnection以便你的证书用于HTTPS连接。


public class MyHttpClient extends DefaultHttpClient {

 private Resources _resources;

 public MyHttpClient(Resources resources) {
 _resources = resources;
 }

 @Override
 protected ClientConnectionManager createClientConnectionManager() {
 SchemeRegistry registry = new SchemeRegistry();
 registry.register(new Scheme("http", PlainSocketFactory
 .getSocketFactory(), 80));
 if (_resources != null) {
 registry.register(new Scheme("https", newSslSocketFactory(), 443));
 } else {
 registry.register(new Scheme("https", SSLSocketFactory
 .getSocketFactory(), 443));
 }
 return new SingleClientConnManager(getParams(), registry);
 }

 private SSLSocketFactory newSslSocketFactory() {
 try {
 KeyStore trusted = KeyStore.getInstance("BKS");
 InputStream in = _resources.openRawResource(R.raw.mystore);
 try {
 trusted.load(in, "pwd".toCharArray());
 } finally {
 in.close();
 }
 return new SSLSocketFactory(trusted);
 } catch (Exception e) {
 throw new AssertionError(e);
 }
 }
}

找到了有关导入根证书的非常详细的操作指南,这些证书实际上会引导您在不同版本的Android设备(以及其他设备)上安装可信CA证书。

基本上,你需要:

  1. 下载:你的手机中的cacerts.bks文件。

    adb pull/system/etc/security/cacerts.bks cacerts.bks

  2. 从你要允许的认证机构下载.crt文件。

  3. 使用BouncyCastle提供程序修改计算机上的cacerts.bks文件

  4. 将cacerts.bks文件上传到你的手机,并且重新启动。

这里有一个更详细的步骤来更新早期的Android手机:如何在早于android-4.0设备上更新HTTPS安全证书颁发机构密钥库

下面是将证书添加到默认证书列表中的另一种解决方案: 使用HttpClient通过HTTPS信任所有证书

但是,它只适用于你的应用程序,没有办法以编程方式为用户设备上的所有应用程序执行此操作,因为这会带来安全风险。

...