我已经创建了自己的CA证书,现在我想在我的Android Froyo设备(HTC Desire Z)上安装它,以便设备信任我的证书。
Android将CA证书存储在/system/etc/security/cacerts.bks
的Java密钥库中。我将文件复制到我的计算机,使用portecle 1.5添加了我的证书并将其推回设备。
现在,Android似乎没有自动重新加载文件。我在几篇博客文章中看到我需要重启设备。这样做会导致文件再次被原始文件覆盖。
我的下一个尝试是通过复制并使用设置菜单中的相应选项从SD卡安装证书。设备告诉我证书已经安装,但显然它不信任证书。此外,当我尝试将密钥库复制到我的计算机时,我仍然可以找到原始库存cacerts.bks
。
那么,在Android 2.2设备上安装我自己的根CA证书作为可信证书的正确方法是什么?有没有办法以编程方式进行?
答案 0 :(得分:91)
在安装Android KitKat之前,您必须根据您的设备安装新证书。
从Android KitKat(4.0)到Nougat(7.0),这是可能的,也很简单。我能够在我的非root设备上安装Charles Web Debbuging Proxy证书,并成功嗅探SSL流量。
摘自http://wiki.cacert.org/FAQ/ImportRootCert
在Android 4.0之前,使用Android版Gingerbread& Froyo,有一个只读文件(/system/etc/security/cacerts.bks),其中包含信任存储,默认情况下在Android上信任所有CA('系统')证书。系统应用程序和使用Android SDK开发的所有应用程序都使用此功能。使用这些说明在Android Gingerbread,Froyo,...上安装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-added”中。
系统安装的证书可以通过设置 - >在Android设备上进行管理安全 - >证书 - > “系统”部分,而用户可信证书则在那里的“用户”部分中管理。使用用户可信证书时,Android会强制Android设备的用户实施其他安全措施:使用用户提供的证书时,必须使用PIN码,模式锁或密码来解锁设备。
将CAcert证书安装为“用户信任”证书非常简单。将新证书安装为“系统可信”证书需要更多工作(并且需要root访问权限),但它具有避免Android锁屏要求的优势。
从Android N开始它会变得更加困难,请参阅Charles proxy website的摘录:
从Android N开始,您需要为您的应用添加配置 让它信任Charles SSL Proxying生成的SSL证书。 这意味着您只能将SSL代理与您的应用程序一起使用 控制。
要将您的应用配置为信任Charles,您需要添加一个 网络安全配置文件到您的应用程序。这个文件可以 覆盖系统默认值,使您的应用程序可以信任安装的用户 CA证书(例如Charles Root证书)。你可以指定 这只适用于您的应用程序的调试版本,所以 生产版本使用默认的信任配置文件。
将文件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>
答案 1 :(得分:43)
我花了很多时间试图找到答案(我需要Android才能看到StartSSL证书)。结论:Android 2.1和2.2允许您导入证书,但仅用于WiFi和VPN。没有用于更新受信任根证书列表的用户界面,但是有关于添加该功能的讨论。目前还不清楚手动更新和替换cacerts.bks文件是否有可靠的解决方法。
详细信息和链接:http://www.mcbsys.com/techblog/2010/12/android-certificates/。在该帖子中,请参阅Android错误11231的链接 - 您可能希望将该投票和查询添加到该错误中。
答案 2 :(得分:15)
如果您需要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);
}
}
}
答案 3 :(得分:9)
指南链接here可能会回答原始问题,而无需编写自定义SSL连接器。
找到了一个非常详细的导入根证书的操作指南,它实际上会引导您在不同版本的Android设备(以及其他设备)上安装可信CA证书。
基本上你需要:
下载:手机中的cacerts.bks文件。
adb pull /system/etc/security/cacerts.bks cacerts.bks
从您要允许的认证机构下载.crt文件。
将cacerts.bks文件上传回手机并重新启动。
以下是更新早期Android手机的更详细步骤: How to update HTTPS security certificate authority keystore on pre-android-4.0 device
答案 4 :(得分:4)
这方面的解决方案比此处或相关主题更容易解决。如果您正在使用webview(就像我一样),您可以通过在其中执行JAVASCRIPT函数来实现此目的。如果您没有使用webview,则可能需要为此目的创建一个隐藏的视图。这是一个可以在任何浏览器(或webview)中运行的功能,以启动安装(通常通过共享的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;
}
更新:
iframe技巧适用于使用API 19及更高版本的Droids,但旧版本的webview不会像这样工作。一般的想法仍然有效 - 只需用webview下载/打开文件,然后让操作系统接管。这可能是一个更简单,更通用的解决方案(现在在实际的java中):
public static void installTrustedRootCert( final String certAddress ){
WebView certWebView = new WebView( instance_ );
certWebView.loadUrl( certAddress );
}
请注意,instance_是对Activity的引用。如果您知道证书的URL,这将完美地工作。但是,在我的情况下,我使用服务器端软件动态解决这个问题。我不得不添加大量额外的代码来拦截重定向网址并以不会因线程复杂性而导致崩溃的方式调用它,但我不会在这里添加所有混淆......
答案 5 :(得分:3)
我使用startssl证书所做的很容易。 (在我的根电话上)
我将/system/etc/security/cacerts.bks复制到我的SD卡
已下载http://www.startssl.com/certs/ca.crt和http://www.startssl.com/certs/sub.class1.server.ca.crt
去了portecle.sourceforge.net并直接从网页上运行了portecle。
从我的SD卡中打开我的cacerts.bks文件(在被要求输入密码时没有输入任何内容)
在portacle中选择import并打开sub.class1.server.ca.crt,我的情况下它已经有了ca.crt,但也许你需要安装它。
保存密钥库并将其复制到/system/etc/security/cacerts.bks(我先备份该文件以防万一)
重新启动了我的手机,现在我可以使用startssl证书无误地访问我的网站。
答案 6 :(得分:1)
如果您拥有植根设备,则可以使用Magisk模块将用户证书移至系统,以便将其成为受信任的证书
答案 7 :(得分:1)
您是否尝试过:设置 -> 安全 -> 从 SD 卡安装? – 亚历山大·艾格 10 年 12 月 20 日 20:11
我不知道为什么这不是一个答案,但我只是遵循了这个建议并且它奏效了。
答案 8 :(得分:0)
这是一个替代解决方案,它实际上将您的证书添加到内置的默认证书列表中:Trusting all certificates using HttpClient over HTTPS
但是,它仅适用于您的应用程序。没有办法以编程方式为用户设备上的所有应用程序执行此操作,因为这会带来安全风险。
答案 9 :(得分:0)
这些步骤对我有用:
或者,我发现这些选项是我不需要尝试的,但是看起来很容易理解:
最后,它可能无关紧要,但是,如果您要为托管在本地IIS Web服务器上的PWA应用程序(网站)创建并设置自签名证书(使用mkcert),请遵循以下页面: / p>
谢谢,希望对您有所帮助!! :)