Androidデバイスに信頼できるCA証明書をインストールする方法


134

自分のCA証明書を作成しましたが、これをAndroid Froyoデバイス(HTC Desire Z)にインストールして、デバイスが私の証明書を信頼できるようにします。

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

現在、Androidはファイルを自動的にリロードしないようです。デバイスを再起動する必要があるいくつかのブログ投稿を読みました。これを行うと、ファイルは元のファイルで再び上書きされます。

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

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


ここでは、根ざした電話を想定できます。:)
ビョルンMarschollek

回答:


116

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 /」フォルダーの(読み取り専用)システムパーティションにあります個々のファイルとしてのセキュリティ/ '。ただし、ユーザーは「/ data / misc / keychain / certs-added」に格納される独自の「ユーザー」証明書を簡単に追加できるようになりました。

システムがインストールした証明書は、Androidデバイスの[設定]-> [セキュリティ]-> [証明書]-> [システム]セクションで管理できますが、ユーザーが信頼する証明書は[ユーザー]セクションで管理されます。ユーザーが信頼する証明書を使用する場合、AndroidはAndroidデバイスのユーザーに追加の安全対策を実施することを強制します。ユーザー提供の証明書を使用する場合、PINコード、パターンロック、またはパスワードを使用してデバイスをロック解除する必要があります。

CAcert証明書を「ユーザーが信頼する」証明書としてインストールするのは非常に簡単です。「システムが信頼する」証明書として新しい証明書をインストールするには、さらに多くの作業が必要です(ルートアクセスが必要です)が、Androidのロック画面要件を回避できるという利点があります。

Android N以降は少し難しくなります。Charles プロキシウェブサイトからのこの抜粋をご覧ください。

Android N以降、Charles SSLプロキシによって生成されたSSL証明書をアプリに信頼させるには、アプリに設定を追加する必要があります。つまり、制御するアプリでのみSSLプロキシを使用できます。

Charlesを信頼するようにアプリを設定するには、ネットワークセキュリティ設定ファイルをアプリに追加する必要があります。このファイルはシステムのデフォルトを上書きし、ユーザーがインストールしたCA証明書(Charlesルート証明書など)をアプリが信頼できるようにします。これがアプリケーションのデバッグビルドにのみ適用されるように指定して、本番ビルドでデフォルトの信頼プロファイルが使用されるようにすることができます。

ファイル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
/system/etc/security/cacerts/*.0AVDを再起動/再起動した後、カスタム証明書ファイル()が保持されないため、このソリューションは成功しませんでした。
fikr4n 2016

@BornToCode興味深い-AVDを使用することはめったにないので、この制限を認識していませんでした
Dean Wild

設定が表示されますがdebug-overrides、これnetwork_security_configはデバッグバリアントのみをターゲットにしているということですか?UATバリアントなどの他のバリアントがある場合、これは機能しませんか?
Isaac、

1
@Isaacこれは、debugable = trueのすべてのバリアントに適用されることを意味します
Dean Wild

1
@DeanWild-どうもありがとう!私はこれを永遠に機能させようとし、アプリのデバッグ時に「無効なSSL証明書」を取得し続けました。このソリューションは、サムスン注8でAndroid 9で私のAndroidアプリの実行のための魅力のように働いた
デイブ・ブラック

43

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

詳細とリンク:http : //www.mcbsys.com/techblog/2010/12/android-certificates/。その投稿で、Androidバグ11231へのリンクを参照してください。投票とクエリをそのバグに追加することをお勧めします。


3
Android開発者が私の質問に再回答しました。cacerts.bksの更新:「2.3を除くすべてのリリースでは、ルート権限を取得していない電話でcacerts.bksを更新するにはOTAが必要です。」 code.google.com/p/android/issues/detail?id=11231#c25。OTA =無線、そうですか?これがお使いの携帯電話が工場のcacerts.bksに戻り続ける理由ですか?ただし、ルートアクセス権がある場合は、ソースコードをダウンロードして証明書を追加し、certimport.shスクリプトを使用してcacerts.bksをビルドできるはずです。android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/…
Mark Berry

ありがとう。これは明らかに私が聞きたかった答えではありませんでしたが、正しい答えのようです。システム全体を更新せずに証明書をインストールする方法があることを望みました。もちろん、新しいcacerts.bksをビルドできます。ルートアクセスがあれば古いものを置き換えることもできますが、再起動するたびに元のバージョンに戻ります。再起動しないと、Androidは信頼できる証明書ファイルの再読み込みを拒否するようです。
ビョルンMarschollek

27
3.Xおよび4.XプラットフォームへのCA証明書のインストールについてはどうですか?
Alok Kulkarni


16

HTTPS接続に証明書が必要な場合は、.bksファイルをrawリソースとしてアプリケーションに追加し、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);
        }
    }
}

お返事をありがとうございます。実際には、デバイス上のすべてのアプリケーションが証明書を信頼するような方法で証明書をインストールする必要があります。同じ問題は、証明書がデフォルトで信頼されていないCAcertなどのいくつかの小さなCAにも存在するはずです。どのようにして証明書をインストールしますか?
ビョルンMarschollek

試してみました:設定->セキュリティ-> SDカードからのインストール
Alexander Egger

また、これは興味深いかもしれません:android.git.kernel.org/
Alexander Egger

2
同じ問題があります。Adroid2.3.3アプリケーションを使用して.PDX X509証明書をロードしてから、SSL接続を作成する必要があります。コメント付きのコードで誰かが私を助けてくれますか?
AndroidLearner

9

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

ルート証明書のインポートに関する非常に詳細なハウツーガイドが見つかりました。これは、さまざまなバージョンのAndroidデバイス(他のデバイスの中でも)に信頼できるCA証明書を実際にインストールする手順を示しています。

基本的に、次のことを行う必要があります。

  1. ダウンロード:携帯電話からcacerts.bksファイルをダウンロードします。

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

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

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

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

以前のAndroid電話を更新するための詳細な手順は次のとおりです: Android-4.0より前のデバイスでHTTPSセキュリティ認証局キーストアを更新する方法


5

ここ、または関連するスレッドに投稿するよりもはるかに簡単な解決策があります。(私と同じように)Webビューを使用している場合は、その内部でJAVASCRIPT関数を実行することでこれを実現できます。WebViewを使用していない場合は、この目的で非表示のビューを作成することをお勧めします。これは、ほとんどすべてのブラウザー(またはWebビュー)で機能し、CAのインストールをキックオフする機能です(通常、Droidを含む共有のos certリポジトリを介して)。それはiFramesで素敵なトリックを使用します。この関数に.crtファイルのURLを渡すだけです。

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はこのように機能しません。一般的なアイデアはまだ機能しますが、ファイルをダウンロードしてWebビューで開くだけで、OSが引き継ぎます。これはより簡単でより普遍的な解決策になるかもしれません(現在のJavaでは):

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

instance_はアクティビティへの参照であることに注意してください。証明書のURLがわかっている場合、これは完全に機能します。しかし、私の場合は、サーバー側のソフトウェアで動的に解決しています。リダイレクトURLをインターセプトし、スレッドの複雑化に基づいてクラッシュを引き起こさない方法でこれを呼び出すために、かなりの量の追加コードを追加する必要がありましたが、ここではそのような混乱をすべて追加しません...


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にアクセスし、webページから直接portecleを実行しました。

SDカードからcacerts.bksファイルを開きました(パスワードを要求されたときに何も入力しませんでした)

portacleでインポートを選択し、sub.class1.server.ca.crtを開きます。私の場合、すでにca.crtがあったのですが、おそらくそれもインストールする必要があります。

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

電話を再起動し、startssl証明書を使用してエラーなしでサイトを表示できるようになりました。



cacert.bksを非根ざしデバイスに戻す方法はありますか?
ボブ

1

これらの手順は私にとってうまくいきました:

  1. モバイルデバイスにDory Certificate Androidアプリをインストールします:https : //play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. USBケーブルでモバイルデバイスをラップトップに接続します。
  3. 内蔵電話のメモリにルートフォルダを作成し、そのフォルダに証明書ファイルをコピーして、ケーブルを取り外します。
  4. Dory Certificate Androidアプリを開き、丸い[+]ボタンをクリックして、適切なImport File Certificateオプションを選択します。
  5. 形式を選択し、名前(ファイル名と同じタイプ)を入力し、証明書ファイルを参照して、[OK]をクリックします。
  6. 3枚のカードがリストアップされます。[CSRの署名]ボタンしかないカードは無視して、他の2枚のカードの[インストール]ボタンをクリックしました。
  7. モバイルChrome(ローカルのIIS Webサーバーでホストされています)とボアラを開かなかったPWA Webアプリを更新しました!Chromeの警告メッセージはありません。緑の鍵がありました。それは働いていました。

あるいは、私は自分で試す必要はないが、簡単に理解できるこれらのオプションを見つけました。

最後に、関連性がない可能性がありますが、ローカルIIS WebサーバーでホストされているPWAアプリ(Webサイト)の自己署名証明書(mkcertを使用)を作成および設定する場合は、次のページを参照しました。

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

よろしくお願いいたします。:)



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.