English

チュートリアル - システム秘匿領域への証明書ファイルの導入

目次

1. 概要
2. 対象読者
3. 事前準備
3.1 SSL/TLS証明書ファイルの準備
3.1.1 自己署名サーバ証明書
3.1.2 クライアント証明書
3.2 ファイル管理アプリケーションの準備
3.3 Android端末の画面ロックの設定
4. SSL/TLS証明書の入手
4.1 ネットワーク経由の場合
4.2 オフライン作業の場合
5. SSL/TLS証明書ファイルの導入
5.1 証明書の設定画面への誘導
5.2 自己署名サーバ証明書の導入
5.3 クライアント証明書の導入
5.4 導入した自己署名サーバ証明書の確認
5.5 導入したクライアント証明書の確認

1. 概要

Android端末と対向ブローカ間の通信路を秘匿するためSSL/TLS接続を利用する場合、 ブローカ側の設定によってはクライアント証明書や自己署名サーバ証明書(いわゆるオレオレ証明書)の提示をAndroid端末に要求します。 すなわち、所用のSSL/TLS証明書をAndroid側で事前に用意しておく必要があります。

Android端末側でのSSL/TLS証明書の持ち方として、以下の2つの選択肢があります。

* a) アプリケーション実装時にデータとして証明書ファイルを埋め込む
* b) システム秘匿領域に証明書ファイルを事前導入しておき、それをアプリケーション実行時に参照する

後者b)の場合はSSL/TLS証明書という機微情報をプログラムに内蔵する必要がないため、

* 端末紛失や盗難などの際でも第三者に機微情報が流出する心配がない
* SSL/TLS証明書の失効時にプログラムに手を入れず証明書ファイルを更新できる

などの利点があり、セキュリティ上の脅威を低減できます。 本書では上記b)に着目し、SSL/TLS証明書をAndroid端末のシステム秘匿領域(KeyChain)[1]に導入する方法について具体的な手順を示します。

本書に載せたAndroid端末のスクリーンショットはGoogle Pixel 4 (Android 11)で採取しました。 OSのバージョン違いにより画面構成や文言表現が多少変わるかもしれません。 お手元のAndroid端末の動作環境に合わせて適宜読み替えてください。

[1] セキュリティ機能

2. 対象読者

ブローカとAndroid端末がSSL/TLSで接続する場合、 Android端末側でどんな証明書を用意しなければいけないかは、 当該ブローカ運用上のセキュリティ方針に依存します。

すなわち、Android端末の接続先ブローカのセキュリティ方針が「商用の認証局が署名したサーバ証明書により身元提示を行い、かつAndroid端末側にクライアント証明書を要求しない」であれば以降の作業は不要です。 さもなくば、以降の記述を参考にAndroid端末へのSSL/TLS証明書導入作業を実施してください。

[2] 認証局

3. 事前準備

3.1 SSL/TLS証明書ファイルの準備

ブローカ管理者より、Android端末に導入すべきSSL/TLS証明書ファイルを発行してもらってください。

3.1.1 自己署名サーバ証明書

PC% file ./vm00_cacert.crt
./vm00_cacert.crt: PEM certificate

PC% openssl verify vm00_cacert.crt
vm00_cacert.crt: C = JP, ST = Example_State, O = Example_Organization, CN = private-ca
error 18 at 0 depth lookup:self signed certificate
OK

[3] X.509

3.1.2 クライアント証明書

PC% file ./client03*
./client03.pfx: data
./client03.txt: ASCII text

PC% openssl pkcs12 -in client03.pfx -info -noout
Enter Import Password:
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048

[4] PKCS#12

3.2 ファイル管理アプリケーションの準備

3.3 Android端末の画面ロックの設定

お手元のAndroid端末のOSが10以上の場合、本項は任意です。[5]

システム秘匿領域(KeyChain)にユーザ指定の秘密ファイルを導入するには、 画面ロックの設定が必要となります。 当該Android端末の画面ロックを解除できることをもって、正当な持ち主による 操作であるというデバイス認証を兼ねています。 画面ロックを設定せずに作業を進めることは可能ですが、 その場合はSSL/TLS証明書ファイル導入時に画面ロック設定を促されます。

    ホーム画面(Home)
    --> 設定(Settings)
      --> セキュリティ(Security)
        --> 画面ロック(Screen lock)
          --> 適当な画面ロック方法(「なし」と「スワイプ」以外)を選択

[5] KeyChainの動作変更と機能強化

4. SSL/TLS証明書の入手

4.1 ネットワーク経由の場合

4.2 オフライン作業の場合

    1) Android機材の電源を切る。
    2) Android機材からSDカードを外す。
    3) 手元の作業機材にSDカードを装着し、ファイルシステムにマウントする。
    4) 手元の作業機材からSDカードにSSL/TLSファイルをコピーする。
       コピー先は任意だが、SDカードのルートディレクトリ直下が扱いやすい。
    5) ファイルシステムからアンマウントし、手元の作業機材からSDカードを外す。
    6) Android機材にSDカードを装着する。
    7) Android機材の電源を入れる。
# Android10 or below
% adb push client03.pfx /mnt/sdcard
% adb push vm00_cacert.crt /mnt/sdcard
# Android11
% adb push client03.pfx /mnt/sdcard
adb: error: stat failed when trying to push to /mnt/sdcard: Permission denied

% adb push client03.pfx /sdcard
% adb push vm00_cacert.crt /sdcard

[6] Android Debug Bridge (adb)

5. SSL/TLS証明書ファイルの導入

5.1 証明書の設定画面への誘導

証明書設定画面

システム秘匿領域(KeyChain)で管理する証明書の扱いは、システム設定階層の深いところまで潜る必要があります。 まずは、以下の要領で証明書の設定画面に移動してください。

5.2 自己署名サーバ証明書の導入

自己署名サーバ証明書の導入

5.3 クライアント証明書の導入

クライアント証明書の導入(1)

クライアント証明書の導入(2)

5.4 導入した自己署名サーバ証明書の確認

導入した自己署名サーバ証明書の確認

自己署名サーバ証明書がシステム秘匿領域(KeyChain)に正しく導入されたことは、以下の要領で確認してください。

5.5 導入したクライアント証明書の確認

導入したクライアント証明書の確認(1)

クライアント証明書がシステム秘匿領域(KeyChain)に正しく導入されたことは、以下の要領で確認してください。

導入したクライアント証明書の確認(2)

画面(n2)で自己署名サーバ証明書(エイリアス名なし)の要素を選択すると、当該証明書の詳細情報がダイアログ(o2)で表示されます。 画面(o)と(o2)を見比べて、赤丸で囲った内容の違いに着目ください。