2010-12-16 217 views
95

我已经创建了自己的CA证书,现在我想将其安装在我的Android Froyo设备(HTC Desire Z)上,以便设备信任我的证书。如何在Android设备上安装可信CA证书?

的Android商店CA证书在/system/etc/security/cacerts.bks其Java密钥库。我将该文件复制到我的电脑,使用portecle 1.5添加了我的证书并将其推回设备。

现在,Android似乎不会自动重新加载文件。我已阅读过几篇博文,需要重启设备。这样做会导致文件被原来的文件覆盖。

我的下一个尝试是通过复制并使用从设置菜单中的相关选项安装从SD卡的证书。设备告诉我证书已经安装,但显然它不信任证书。而且,当我尝试将密钥库复制到我的电脑时,我仍然可以找到原始股cacerts.bks

那么,什么是对的Android 2.2设备上安装自己的根CA证书作为可信证书的正确方法?有没有办法做到这一点编程?

+0

You可以在这里假设一根扎根的电话。 :) – 2010-12-22 14:35:51

+0

堆栈溢出是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://stackoverflow.com/help/on-topic)。也许[Android爱好者堆栈交换](http://android.stackexchange.com/)会是一个更好的地方。 – jww 2016-10-29 09:00:43

回答

58

此前Android的奇巧,你必须根您的设备安装新的证书。

从Android KitKat(4.0)到牛轧糖(7.0)这是可能的,也很容易。我能够在我的根目录设备上安装Charles Web Debbuging Proxy cert并成功嗅探SSL流量。

摘自http://wiki.cacert.org/FAQ/ImportRootCert

的Android 4.0版本,与Android姜饼版本Froyo的&以前,有一个单一的只读文件包含信任存储与(/system/etc/security/cacerts.bks)所有的CA('系统')证书在Android上默认都是可信的。系统应用和使用Android SDK开发的所有应用都使用此功能。使用Android上的姜饼,升级Froyo,安装CACERT证书这些指令......

从搭载Android 4.0(ICS安卓/ '冰淇淋三明治' 的Android 4.3 '果冻豆' &的是Android 4.4 '奇巧')开始,系统信任证书位于文件夹“/ system/etc/security /”中的(只读)系统分区上作为单个文件。但是,用户现在可以轻松添加他们自己的'用户'证书,这些证书将存储在'/ data/misc/keychain/certs-added'中。

系统安装的证书可以在Android设备的设置 - >安全 - >证书 - >'系统'部分进行管理,而用户可信证书在该用户部分进行管理。使用用户信任的证书时,Android会强制Android设备的用户实施其他安全措施:使用用户提供的证书时,必须使用PIN码,模式锁定或密码来解锁设备。

将CAcert证书安装为“user trusted”证书非常简单。将新证书安装为“系统可信”证书需要更多工作(并且需要root访问权限),但它具有避免Android锁定屏幕要求的优势。

于Androidň起它得到一个利特勒困难,看到从Charles proxy website这种提取物:

由于Android的N,你需要为了增加配置到您的应用程序 有它信任由Charles SSL Proxying生成的SSL证书。 这意味着您只能使用SSL代理与 控制的应用程序。

为了配置您的应用程序以信任Charles,您需要将一个 Network Security配置文件添加到您的应用程序。此文件可以 覆盖系统默认值,使您的应用程序能够信任安装了 CA证书的用户(例如查尔斯根证书)。您可以指定 这仅适用于您的应用程序的调试版本,因此 生产版本使用默认的信任配置文件。

文件RES/XML/network_security_config.xml添加到您的应用程序:

<network-security-config>  
    <debug-overrides> 
     <trust-anchors> 
      <!-- Trust user added CAs while debuggable only --> 
      <certificates src="user" /> 
     </trust-anchors>  
    </debug-overrides> 
</network-security-config> 

然后添加到该文件在您的应用程序的清单参考,具体如下:

<?xml version="1.0" encoding="utf-8"?> 
<manifest> 
    <application android:networkSecurityConfig="@xml/network_security_config"> 
    </application> 
</manifest> 
+0

重新启动/重新启动AVD后,我的自定义证书文件('/ system/etc/security/cacerts/*。0')不会保留,所以此解决方案不成功。 – BornToCode 2016-02-27 04:54:40

+0

@BornToCode有趣 - 我很少使用AVD,所以我不知道这个限制 – 2016-04-20 07:31:05

14

如果您需要证书的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); 
     } 
    } 
} 
+0

感谢您的回复。实际上,我需要按照设备上的每个应用程序信任该证书的方式来安装证书。同样的问题也应该存在于一些较小的CA中,例如CAcert,它的证书默认不受信任。他们如何获得他们的证书安装? – 2010-12-20 17:48:26

+0

你试过了:设置 - >安全 - >从SD卡安装 – 2010-12-20 20:11:26

+0

另外这可能很有趣: http://android.git.kernel.org/?p=platform/packages/apps/CertInstaller.git;a = blob; f = src/com/android/certinstaller/CertFile.java; h = 8e6379491fc342632e85396ccbc8ba75192d2133; hb = HEAD – 2010-12-20 20:17:57

41

我花了很多时间试图找到答案(我需要Android来看到StartSSL证书)。结论:Android 2.1和2.2允许您导入证书,但只能用于WiFi和VPN。没有用于更新受信任根证书列表的用户界面,但有关于添加该功能的讨论。目前还不清楚是否有可靠的解决方法来手动更新和替换cacerts.bks文件。

详细信息和链接:http://www.mcbsys.com/techblog/2010/12/android-certificates/。在那篇文章中,请参阅Android bug 11231的链接 - 您可能希望添加您的投票和查询到该bug。

+3

Android开发人员回答了我的问题。更新cacerts.bks:“在2.3版本的所有版本中,OTA需要更新非根目录手机上的cacerts.bks。” http://code.google.com/p/android/issues/detail?id=11231#c25。 OTA =无线电,对吗?难道这就是为什么你的手机不断回复到工厂cacerts.bks? 但是,如果您拥有root权限,似乎您应该能够下载源代码,添加您的证书,然后使用certimport.sh脚本构建cacerts.bks。 http://android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/src/main/files。 – 2010-12-22 17:11:02

+0

谢谢。这显然不是我想听到的答案,但似乎是正确的。我希望有一种方法可以在不更新整个系统的情况下安装证书。我当然可以构建新的cacerts.bks,它具有root访问权限,我甚至可以替换旧的cacerts.bks,但每次重新引导后都会恢复到原始版本。在不重新启动的情况下,Android似乎拒绝重新加载受信任的证书文件。 – 2010-12-22 18:47:51

+27

在3.X和4.X平台上安装CA证书如何? – 2012-04-02 08:46:44

0

下面是实际上增加了您的证书到内置在默认证书列表中的一个替代的解决方案:Trusting all certificates using HttpClient over HTTPS

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

3

我做了什么可以使用startssl证书很容易。 (我的手机扎根)

我复制/system/etc/security/cacerts.bks到我的SD卡

下载http://www.startssl.com/certs/ca.crthttp://www.startssl.com/certs/sub.class1.server.ca.crt

走到portecle.sourceforge.net并直接从跑portecle网页。

睁开cacerts.bks文件从我的SD卡(当问及密码输入任何内容)

选择进口在portacle,打开sub.class1.server.ca.crt,即时我的情况下,媒体链接有CA .crt,但也许你需要安装它。

保存密钥库,并复制它baxck到/系统的/ etc /安全/ cacerts中。BKS

重新启动我的电话(我只是第一次的情况下做出文件的备份),现在我可以访问次数我的网站多数民众赞成使用startssl如果证书没有错误。

+0

新的从Mozilla:[不信任新的WoSign和StartCom证书](https://blog.mozilla.org/security/2016/10/24/distrusting-new-wosign-and-startcom-certificates/)。 – jww 2016-10-29 08:52:58

+0

任何想法如何把cacert.bks重新放在没有根的设备上? – Bob 2017-02-22 18:33:12

6

导联here可能会回答原来的问题,而不需要编写自定义的SSL连接器。

找到了一个非常详细的如何引导对进口实际步骤你通过不同版本的Android设备上安装可信CA证书(其他设备之间)的根证书。

基本上你将需要:

  1. 下载:通过手机cacerts.bks文件。

    亚行拉/system/etc/security/cacerts.bks cacerts.bks

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

  3. 使用BouncyCastle Provider

  4. 上传的文件cacerts.bks回你的电话,并重新启动修改计算机上的文件cacerts.bks。

这里是一个更详细的分步更新较早的Android手机: How to update HTTPS security certificate authority keystore on pre-android-4.0 device

3

有是比这里发布的更容易的解决方案,或在相关的线程。如果您使用的是webview(就像我),您可以通过在其中执行JAVASCRIPT功能来实现此目的。如果你不使用webview,你可能想为此创建一个隐藏的。这里有一个函数可以在任何浏览器(或webview)中启动ca安装(通常通过共享os证书库,包括Droid)。它使用iFrames的一个很好的技巧。只需将URL传递给.crt文件给这个函数:

function installTrustedRootCert(rootCertUrl){ 
    id = "rootCertInstaller"; 
    iframe = document.getElementById(id); 
    if(iframe != null) document.body.removeChild(iframe); 
    iframe = document.createElement("iframe"); 
    iframe.id = id; 
    iframe.style.display = "none"; 
    document.body.appendChild(iframe); 
    iframe.src = rootCertUrl; 
} 

UPDATE:

iframe的技巧适用于机器人与API 19,但较旧版本的网页流量不会喜欢这个工作。一般的想法仍然有效 - 只需下载/打开一个webview文件,然后让os接管。这可能是一种更简单和更通用的解决方案(在实际的Java现在):

public static void installTrustedRootCert(final String certAddress){ 
    WebView certWebView = new WebView(instance_); 
    certWebView.loadUrl(certAddress); 
} 

注意instance_是活动的参考。如果您知道证书的URL,这完美地工作。然而,就我而言,我使用服务器端软件动态解决这个问题。我不得不添加大量额外的代码来拦截重定向url,并以基于线程并发症不会导致崩溃的方式调用此方法,但我不会在此处添加所有这些混淆...

相关问题