web-dev-qa-db-ja.com

Androidデバイスに信頼性のあるCA証明書をインストールするにはどうすればいいですか?

私は自分のCA証明書を作成しました。今度はそれを私のAndroid Froyoデバイス(HTC Desire Z)にインストールしたいので、そのデバイスは自分の証明書を信頼します。

AndroidはCA証明書を/system/etc/security/cacerts.bksのJavaキーストアに格納します。ファイルを自分のコンピュータにコピーし、 portecle 1.5 を使用して証明書を追加し、それをデバイスにプッシュしました。

今、Androidは自動的にファイルをリロードしていないようです。デバイスを再起動する必要があるというブログ記事をいくつか読みました。ファイルを元のファイルで上書きすることになります。

私の次の試みはそれをコピーして設定メニューからの対応するオプションを使ってSDカードから証明書をインストールすることでした。デバイスは証明書がインストールされたことを私に伝えますが、どうやらそれは証明書を信頼していません。さらに、キーストアを自分のコンピュータにコピーしようとしても、元のcacerts.bksが見つかります。

それで、私の自身のルートCA証明書を信頼できる証明書としてAndroid 2.2デバイスにインストールするための正しい方法は何ですか?プログラムでそれを行う方法はありますか?

117

Android KitKatの前にあなたは新しい証明書をインストールするためにあなたのデバイスを根絶しなければなりません。

Android KitKat(4.0)からNougat(7.0)までそれは可能で簡単です。 Charles Web Debbuging Proxyの証明書を自分の根ざしていないデバイスにインストールし、SSLトラフィックを盗聴することに成功しました。

から抽出 http://wiki.cacert.org/FAQ/ImportRootCert

Androidバージョン4.0より前、AndroidバージョンGingerbread&Froyoでは、デフォルトで信頼されているすべてのCA(「システム」)証明書を含むトラストストアを含む単一の読み取り専用ファイル(/system/etc/security/cacerts.bks)がありました。アンドロイド。システムアプリと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 Certificate)を信頼できるようにします。本番ビルドではデフォルトの信頼プロファイルを使用するように、これをアプリケーションのデバッグビルドにのみ適用するように指定できます。

ファイル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>
93
Dean Wild

私はこれに対する答えを見つけるために多くの時間を費やしました(私はStartSSL証明書を見るためにAndroidが必要です)。結論:Android 2.1と2.2では証明書をインポートできますが、WiFiとVPNでのみ使用できます。信頼されたルート証明書のリストを更新するためのユーザーインターフェースはありませんが、その機能を追加することについては議論があります。手動でcacerts.bksファイルを更新および置換するための信頼できる回避策があるかどうかは不明です。

詳細とリンク: http://www.mcbsys.com/techblog/2010/12/Android-certificates/ 。その記事の中で、Android bug 11231へのリンクを見てください - あなたはそのバグにあなたの投票と質問を追加したいかもしれません。

43
Mark Berry

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);
        }
    }
}
15
Alexander Egger

リンクされたガイド ここ は、おそらくカスタムのSSLコネクタをプログラミングする必要なしに元の質問に答えるでしょう。

信頼性のあるCA証明書をさまざまなバージョンのAndroidデバイス(とりわけ他のデバイス)にインストールする手順を実際に説明しているルート証明書のインポートに関する非常に詳細な使用方法ガイドを見つけました。

基本的にあなたがする必要があります:

  1. ダウンロード:あなたの携帯電話からcacerts.bksファイル。

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

  2. 許可したい認証局から.crtファイルをダウンロードします。

  3. コンピュータ上のcacerts.bksファイルを BouncyCastle Provider を使用して変更します。

  4. Cacerts.bksファイルを電話機にアップロードして再起動します。

これは、以前のAndroid携帯を更新するためのステップバイステップのより詳細な手順です。 Android 4.0より前のデバイスのHTTPSセキュリティ認証局キーストアを更新する方法

9

ここに掲載されているもの、または関連するスレッドに掲載されているものよりもはるかに簡単な解決策があります。あなたが(私がそうであるように)ウェブビューを使っているなら、あなたはそれの中でJAVASCRIPT機能を実行することによってこれを達成することができます。 Webビューを使用していない場合は、この目的のために非表示のビューを作成することをお勧めします。これはcaインストールをキックオフするためにほぼすべてのブラウザ(またはwebview)で動作する機能です(一般にDroid上を含む、共有os certリポジトリを通して)。それはiFramesでNiceトリックを使います。この関数の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以降を搭載したDroidで機能しますが、古いバージョンのWebビューはこのようには機能しません。一般的な考え方は、まだうまくいきます - ただWebviewでファイルをダウンロード/開いて、それからosに引き継がせてください。これは(今のところ実際のJavaでは)もっと簡単で普遍的な解決策かもしれません:

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

Instance_はActivityへの参照です。あなたが証明書のURLを知っていれば、これは完璧に機能します。私の場合は、サーバー側のソフトウェアを使って動的に解決します。私は、リダイレクトURLを傍受してスレッドの複雑さに基づくクラッシュを引き起こさないような方法でこれを呼び出すためにかなりの量の追加コードを追加しなければなりませんでした、しかし私はここですべての混乱を加えません...

4
BuvinJ

Startssl証明書を使用できるようにするために私がしたことは非常に簡単でした。 (私の根ざした電話で)

私は自分のSDカードに/system/etc/security/cacerts.bksをコピーしました

ダウンロード http://www.startssl.com/certs/ca.crt and http://www.startssl.com/certs/sub.class1.server.ca.crt

Portecle.sourceforge.netに行き、Webページから直接portecleを実行しました。

私のSDカードから私のcacerts.bksファイルを開いた(パスワードを要求されたときに何も入力しなかった)

Portacleでimportを選択してsub.class1.server.ca.crtを開きました。私の場合はすでにca.crtを持っていましたが、インストールする必要があるかもしれません。

キーストアを保存し、それを/system/etc/security/cacerts.bksにbaxckコピーしました(念のため、最初にそのファイルのバックアップを作成しました)。

私の電話を再起動し、今私はエラーなしでstartssl証明書を使用して私のサイトのthatsをvistすることができます。

3
hans

これは、デフォルトの証明書の組み込みリストに実際に証明書を追加する別の解決策です。 HTTPS経由でHttpClientを使用してすべての証明書を信頼する

ただし、それはあなたのアプリケーションにしか機能しません。ユーザーのデバイス上のすべてのアプリケーションに対してプログラムで実行する方法はありません。セキュリティ上のリスクがあるためです。

0
emmby