2010-12-16 259 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,並以基於線程併發症不會導致崩潰的方式調用此方法,但我不會在此處添加所有這些混淆...

相關問題