Androidアプリ開発で自己証明書を使ってサーバとアプリ間でHTTPS通信を行う場合の実装方法を紹介します。

実装のガイドラインはJSSECから公開されています

AndroidでHTTPS通信するためのセキュアガイドラインがJSSECから公開されています。基本はこのガイドの5.4章に沿って行いました。

https://www.jssec.org/report/20150710_securecoding.html

自己証明書の発行する

CA証明書とサーバ証明書の2つを生成する必要があります。ガイドラインの5.4.3.1に沿って以下の3つのファイルをlinuxサーバ上に作成します。

  • newca.sh
    CA証明書を発行するためのスクリプト。
    ガイドラインのソースコードを流用し、必要に応じて証明書作成先のディレクトリや有効期間等の変更を行います。
  • openssl.cnf
    newca.sh実行時に読み込まれる設定ファイル。
    ガイドラインのソースコードを流用し、必要に応じて証明書作成先のディレクトリ等の変更を行います。
  • newsv.sh
    サーバ証明書を発行するためのスクリプト。
    ガイドラインのソースコードを流用し、必要に応じて証明書作成先のディレクトリや有効期間等の変更を行います。
    「/CN=selfsigned.jssec.org」となっているコモンネームはサーバのドメイン名を指定します。
    この設定値がサーバのドメイン名と異なると、信用のないサイトと見なされてエラーとなります。

次に以下の手順で証明書を発行します。

  1. newca.shを実行する
    3回パスワードが聞かれるので、すべて同じパスワードを入力します。
  2. newsv.shを実行する
    パスワードが聞かれるので、1で入力したパスワードを入力します。

以下のファイルが出力されるため、それぞれ必要な場所に配置します。

  • CA/cacert.crt
    プライベート認証局のルート証明書。
    クライアント(Androidアプリ)側のキーストア等に登録します。
  • svkey.pem
    秘密鍵。WEBサーバに配置します。
  • svcert.pem
    サーバ証明書。WEBサーバに配置します。

サーバに秘密鍵と証明書を配置しWebサーバの設定を行う

Webサーバに秘密鍵と証明書を配置します。ここではnginxを使う場合の設定例を紹介します。

server {
  listen 443;
  server_name sample.co.jp;
  ssl on;
  ssl_certificate /etc/nginx/cert/svcert.pem; ←サーバ証明書の格納先を指定
  ssl_certificate_key /etc/nginx/cert/svkey.pem; ←秘密鍵の格納先を指定
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  access_log /var/log/nginx/sample.co.jp/ssl_access.log;
  error_log /var/log/nginx/sample.co.jp/ssl_error.log;

  location /sample {
    proxy_pass http://127.0.0.1:8080;
  }
}

Androidアプリ側への設定方法については「自己証明書を使ってAndroidでHTTPS通信を実装する(2/2)」で紹介します。