提兵百万西湖上,立马吴山第一峰!这篇文章主要讲述如何在Android设备上安装可信CA证书?相关的知识,希望能为你提供帮助。
我已经创建了自己的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证书作为可信证书的正确方法是什么?有没有办法以编程方式进行?
答案在Android KitKat之前,您必须使用root设备来安装新证书。
从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),其中包含信任存储,默认情况下信任所有CA('系统')证书Android系统。系统应用程序和使用Android SDK开发的所有应用程序都使用此功能。使用这些说明在Android Gingerbread,Froyo上安装CAcert证书,...从Android N开始,它变得更加轻松,请参阅Charles proxy website的这个摘录:
从Android 4.0(Android ICS /'Ice Cream Sandwich',Android 4.3'Jelly Bean'和Android 4.4'KitKat')开始,系统可信证书位于'/ system / etc /文件夹中的(只读)系统分区上安全性/'作为单个文件。但是,用户现在可以轻松添加自己的“用户”证书,这些证书将存储在“/ data / misc / keychain / certs-added”中。
系统安装的证书可以在Android设备上的“设置” - > “安全性” - > “证书” - > “系统”部分进行管理,而用户可信证书则可以在“用户”部分进行管理。使用用户可信证书时,Android会强制Android设备的用户实施其他安全措施:使用用户提供的证书时,必须使用PIN码,模式锁或密码来解锁设备。
将CAcert证书安装为“用户信任”证书非常简单。将新证书安装为“系统可信”证书需要更多工作(并且需要root访问权限),但它具有避免Android锁定屏幕要求的优势。
从Android N开始,您需要为您的应用添加配置,以使其信任Charles SSL Proxying生成的SSL证书。这意味着您只能对您控制的应用程序使用SSL代理。将文件res / xml / network_security_config.xml添加到您的应用程序:
要将您的应用配置为信任Charles,您需要向应用添加网络安全配置文件。此文件可以覆盖系统默认值,使您的应用程序可以信任用户安装的CA证书(例如Charles Root证书)。您可以指定这仅适用于应用程序的调试版本,以便生产版本使用默认信任配置文件。
<
network-security-config>
<
debug-overrides>
<
trust-anchors>
<
!-- Trust user added CAs while debuggable only -->
<
certificates src="https://www.songbingjia.com/android/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>
另一答案我花了很多时间试图找到答案(我需要Android才能看到StartSSL证书)。结论:Android 2.1和2.2允许您导入证书,但仅用于WiFi和VPN。没有用于更新受信任根证书列表的用户界面,但是有关于添加该功能的讨论。目前还不清楚手动更新和替换cacerts.bks文件是否有可靠的解决方法。
详细信息和链接:http://www.mcbsys.com/techblog/2010/12/android-certificates/。在该帖子中,请参阅Android错误11231的链接 - 您可能希望将该投票和查询添加到该错误中。
另一答案如果您需要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);
}
}
}
另一答案链接here的指南可能会回答原始问题而无需编写自定义SSL连接器。
找到了有关导入根证书的非常详细的操作指南,这些证书实际上会引导您在不同版本的Android设备(以及其他设备)上安装可信CA证书。
基本上你需要:
- 下载:手机中的cacerts.bks文件。 adb pull /system/etc/security/cacerts.bks cacerts.bks
- 从您要允许的证书颁发机构下载.crt文件。
- 使用BouncyCastle Provider修改计算机上的cacerts.bks文件
- 将cacerts.bks文件上传回手机并重新启动。
另一答案对此有一个更容易的解决方案,而不是在这里发布,或在相关的线程中。如果您正在使用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 = https://www.songbingjia.com/android/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,这将完美地工作。但是,在我的情况下,我使用服务器端软件动态解决这个问题。我不得不添加大量额外的代码来拦截重定向url并以一种不会导致基于线程并发症的崩溃的方式调用它,但我不会在这里添加所有这些混淆...
另一答案我所做的能够使用starttls证书非常容易。 (在我的根电话上)
我将/system/etc/security/cacerts.bks复制到了我的SD卡
下载http://www.startssl.com/certs/ca.crt和http://www.startssl.com/certs/sub.class1.server.ca.crt
【如何在Android设备上安装可信CA证书()】去了portecle.sourceforge.net并直接从网页上运行了portecle。
从我的SD卡打开我的cacerts.bks文件(当被要求输入密码时没有输入)
在portacle中选择import并打开sub.class1.server.ca.crt,我的情况下它已经有了ca.crt,但也许你需要安装它。
保存密钥库并将其复制回/system/etc/security/cacerts.bks(我先备份该文件以防万一)
重新启动我的手机,现在我可以访问我的网站使用startssl证书没有错误。
另一答案这是一个替代解决方案,实际上将您的证书添加到内置的默认证书列表中:Trusting all certificates using HttpClient over HTTPS
但是,它只适用于您的应用程序。没有办法以编程方式为用户设备上的所有应用程序执行此操作,因为这会带来安全风险。
推荐阅读
- Node Webkit Desktop App - 浏览器默认缓存PDF文件
- 如果您的CA不受系统信任,如何将Android应用程序连接到SSL服务器()
- 让我们加密证书与android api <20一起使用
- 当前关于高级内存管理的Apple文档是否存在轻微的不准确之处()
- 在Swift Cocoa App中实现“打开文件”
- 在tomcat中部署战争后,在catalina中重复WebapplicationException
- Tomcat war run application - 无法启动组件
- 从tomcat context.xml而不是application.properties获取数据源
- 使用Laravel处理密集任务