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

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

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

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

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

那么,在 Android 2.2设备上安装我自己的根 CA 证书作为受信任证书的正确方法是什么呢?有没有一种方法可以通过编程实现?

490673 次浏览

如果需要 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 来查看 StartSSL 证书)。结论: Android 2.1和2.2允许您导入证书,但只能用于 WiFi 和 VPN。没有用于更新可信根证书列表的用户界面,但是讨论了添加该特性。目前还不清楚是否有可靠的解决方案来手动更新和替换 ccerts.bks 文件。

详情及连结: http://www.mcbsys.com/techblog/2010/12/android-certificates/。在这篇文章中,请看到 Android bug 11231的链接——你可能想要对这个 bug 进行投票和查询。

下面是一个替代解决方案,它实际上将您的证书添加到内置的默认证书列表中: 通过 HTTPS 信任使用 HttpClient 的所有证书

但是,它只适用于您的应用程序。不可能通过编程方式为用户设备上的所有应用程序做到这一点,因为这会带来安全风险。

我所做的使用 startssl 证书的工作非常简单

我将/system/etc/security/ccerts.bks 复制到我的 sdcard

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

转到 portecle.sourceforge.net 并直接从网页运行 portecle。

从我的 sdcard 中打开我的 ccerts.bks 文件(要求输入密码时没有输入任何内容)

在 portacle 中选择 import 并打开 sub.class1.server.ca.crt,在我的例子中,它已经有了 ca.crt,但是也许您也需要安装它。

保存密钥存储库并将其复制回/system/etc/security/ccerts.bks (我首先对该文件进行了备份,以防万一)

重新启动我的手机,现在我可以访问我的网站,使用 startssl 证书没有错误。

链接 给你的指南可能会回答最初的问题,而不需要编写自定义 SSL 连接器。

找到了一个非常详细的如何导入根证书的指南,实际上可以帮助您在不同版本的 Android 设备(以及其他设备)上安装受信任的 CA 证书。

基本上你需要:

  1. 下载: 从您的手机上下载 ccerts.bks 文件。

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

  2. 从您希望允许的认证机构下载. crt 文件。

  3. 使用 弹跳城堡供应商修改计算机上的 ccerts.bks 文件

  4. 上传 ccerts.bks 文件到您的手机并重新启动。

下面是更详细的更新早期 Android 手机的步骤: 如何更新前 android-4.0设备上的 HTTPS 安全证书授权密钥库

在安卓 KitKat 之前,你必须在你的设备上安装新的证书。

从安卓 KitKat (4.0)到棉花糖(6.0) 这是可能的,也是容易的。我能够在我的非根设备上安装 Charles Web 调试代理证书,并成功地嗅探 SSL 流量。

http://wiki.cacert.org/FAQ/ImportRootCert中提取

在 Android 版本4.0之前,Android 版本的 Gingerbread & Froyo 只有一个只读文件(/system/etc/security/ccerts.bks) ,其中包含 Android 默认信任的所有 CA (‘ system’)证书的信任存储。系统应用程序和所有用 Android SDK 开发的应用程序都使用这种方法。使用以下说明在 Froyo 的 Android Gingerbread 上安装 CAcert 证书..。

从 Android 4.0(Android ICS/‘ Ice Cream Sandwich’、 Android 4.3‘ Jelly Bean’和 Android 4.4‘ KitKat’)开始,系统可信证书作为单独的文件位于文件夹“/system/etc/security/”中的(只读)系统分区上。但是,用户现在可以轻松地添加自己的“用户”证书,这些证书将存储在“/data/misc/keychain/certs-add”中。

系统安装的证书可以在“设置-> 安全-> 证书-> ‘系统’-”部分的 Android 设备上管理,而用户受信任的证书则在“用户”部分管理。当使用用户可信证书时,Android 将强制 Android 设备的用户实施额外的安全措施: 当使用用户提供的证书时,必须使用 PIN 码、模式锁或密码来解锁设备。

安装 CAcert 证书作为“用户信任”-证书是非常容易的。将新证书安装为“系统可信”——证书需要更多的工作(并且需要 root 访问权限) ,但它的优势在于避免了 Android 锁屏要求。

从 Android N (7.0)开始它变得更加困难了,看看这个来自 查尔斯代理网站的摘录:

从 Android N 开始,您需要向应用程序添加配置,以便 让它信任由 Charles SSL 代理生成的 SSL 证书。 这意味着您只能对您的应用程序使用 SSL 代理 控制。

为了将应用程序配置为信任 Charles,需要添加一个 网络安全配置文件到您的应用程序。这个文件可以 覆盖系统默认值,使您的应用程序能够信任安装的用户 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>

对于这个问题,有一个比在这里或相关线程中发布更简单的解决方案。如果您正在使用 webview (就像我一样) ,那么可以通过在其中执行 JAVASCRIPT 函数来实现这一点。如果您没有使用 webview,那么您可能需要为此创建一个隐藏的 webview。下面是一个可以在任何浏览器(或 webview)中运行的函数,它可以启动 ca 安装(通常通过共享的 os cert 存储库,包括 Droid)。它对 iFrame 使用了一个很好的技巧。只需将 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;
}

更新:

Iframe 技巧适用于 API 19及以上版本的 Droids,但是旧版本的 webview 不能像这样工作。总体思路仍然可行-只需下载/打开一个 webview 文件,然后让操作系统接管。这可能是一个更简单、更通用的解决方案(现在在实际的 Java 中) :

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

注意 instance _ 是对 Activity 的引用。如果您知道 cert 的 url,那么这个工作就完美了。然而,在我的例子中,我使用服务器端软件动态地解决这个问题。我必须添加相当多的额外代码来拦截一个重定向 URL,并以一种不会因为线程复杂性而导致崩溃的方式调用它,但我不会在这里添加所有的混淆..。

这些步骤对我很有效:

  1. 在移动设备上安装多利证书 Android 应用程序: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. 用 USB 电缆将移动设备连接到笔记本电脑。
  3. 在内部电话内存上创建根文件夹,复制该文件夹中的证书文件并断开电缆。
  4. 打开多利证书 Android 应用程序,单击圆形[ + ]按钮并选择正确的导入文件证书选项。
  5. 选择 format,提供名称(我键入的名称与 filename 相同) ,浏览证书文件并单击[ OK ]。
  6. 三张牌。我忽略了只有[ SIGN CSR ]按钮的卡,然后点击另外两张卡上的[ INSTALL ]按钮。
  7. 我刷新了 PWA 网络应用程序,我打开了没有我的手机 Chrome (它是托管在一个本地 IIS 网络服务器)和 voala!没有铬合金警告信息。绿色的锁在那里。起作用了。

或者,我发现这些选择,我不需要自己尝试,但看起来很容易遵循:

最后,它可能并不相关,但是如果你想为你的 PWA 应用程序(网站)创建和设置一个自签名的证书(使用 mkcert)托管在本地 IIS Web 服务器上,我遵循这个页面:

Https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

谢谢,希望能有所帮助! ! :)

如果您有一个根设备,您可以使用 Magisk 模块将用户证书移动到系统,这样它将成为可信证书

Https://github.com/magisk-modules-repo/movecert

是否尝试: 设置-> 安全-> 从 SD 卡安装?亚历山大 · 艾格12月20日10点20分11秒

我不知道为什么这不是一个答案,但我只是遵循这个建议,它工作。