スマートデバイスアプリ開発のあれやこれや

Mac標準のApacheでSSL環境を構築する

Macにデフォルトで入っているApacheを使ったSSL環境を作ってみました。
環境の概要は以下の通りです。

  • Apache: 2.4.9
  • OpenSSL: 0.9.8za

次回はクライアント認証対応版の環境構築について書きたいです!

1. サーバ秘密鍵用の乱数ファイルを作成する

サーバ側が保持する秘密鍵作成時に必要な乱数ファイルを作成します。

openssl dgst -md5 /var/log/system.log > rand.dat


opensslのコマンドで「dgst」を指定することで,
後で指定する文字列(system.logの中身)を入力とした乱数を生成します。
(ここではsystem.logを指定していますが,実際はテキストファイルだったら何でもOK)

ちなみにオプションの「-md5」は乱数生成のアルゴリズムの指定です。
結果,生成される乱数はrand.datファイルに保存されます。

2. サーバ秘密鍵を作成する

サーバ秘密鍵を作成します。
秘密鍵は,クライアントから送信された共通鍵(暗号化済み)を復号化する際に利用します。

openssl genrsa -des3 -rand rand.dat 1024 > server_key.pem


opensslのコマンドで「genrsa」を指定することで,RSA秘密鍵を生成します。
オプションの「-des3」は,暗号化アルゴリズムの指定です。
秘密鍵の作成には乱数が必要になるので「-rand」オプションで前述の
手順で作成した乱数(rand.datファイル)を指定しています。
最後の「1024」は秘密鍵のビット数指定です。

作成した鍵は「server_key.pem」という名前で保存します。

Generating RSA private key, 1024 bit long modulus
................++++++
...............................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:


パスワードの入力を求められるので任意のパスワードを2回入力します。

3. サーバ秘密鍵のパスワードを削除する

前述の手順で作成したサーバ秘密鍵にはパスワードが付いています。
そのままだとApache再起動時にパスワードを求められて面倒なので,
パスワードを削除した秘密鍵に加工します。

openssl rsa -in server_key.pem -out server_key.pem


rsaコマンドは,秘密鍵を表示/操作するためのコマンドです。
具体的にいうと「-in」で指定した鍵からパスワードを取り除き
「-out」で指定した名前で保存し直します。

Enter pass phrase for server_key.pem:
writing RSA key

秘密鍵作成時に指定したパスワードの入力を求められます。

3.証明書署名要求(CSR)ファイルを作成する

サーバ証明書の元データ(これに署名することで証明書になる)である
証明書署名要求ファイルを作成します。

openssl req -new -key server_key.pem -out server_csr.pem


「req」は,証明書署名要求を作成するためのコマンドです。
オプションの「-new」は,新規作成時に指定するお約束みたいです。
「-key」は,公開鍵(≒証明書署名要求)に対応した秘密鍵ファイルを指定します。
「-out」で,出力する署名要求のファイル名を指定します。

コマンド実行後は,対話型式で以下の情報の入力を求められます。

  • Country Nmae(国名):JP
  • State or Province Name(都道府県): Kyoto
  • Locality Name(市町村): Kyoto
  • Organization Name(組織名): Red Libbon Army
  • Organizational Unit Name(部署名): Labo
  • Common Name(サーバ名):localhost
  • Email Address(メールアドレス): hoge@example.com
  • A challenge password(証明書破棄時に必要なパスワード):なし
  • An optional company name(別の組織名):なし

4. 自己署名証明書を作成する

前述の手順で作成した証明書署名要求を元に証明書を作成します。

openssl req -days 365 -in server_csr.pem -key server_key.pem -x509 -out crt.pem


再び「req」コマンドで,証明書を作成します。
「-days」オプションでは,証明書の有効期限を指定しています。
「-in」オプションでは,署名対象の署名要求ファイルを
「-key」オプションでは,公開鍵に対応した秘密鍵ファイルを指定します。
「-out」で,出力する証明書のファイル名を指定します。

これまでの成果物は以下の4つです。

以降の手順で必要なファイルは以下の2つです。

  • server_key.pem
  • crt.pem

これらのファイルはApacheの設定ファイルと後で
紐付けるのでリネームして別の場所にコピーしておきます。

sudo cp server_key.pem /private/etc/apache2/server.key
sudo cp crt.pem /private/etc/apache2/server.crt

5. Apacheの設定ファイル(httpd.conf)を変更する

Apacheの設定ファイルを変更してSSL通信を行う準備を行います。
具体的には「/private/etc/apache2/httpd.conf」を編集していきます。

cd /private/etc/apache2
sudo vi httpd.conf

変更箇所は3箇所です。

#LoadModule ssl_module libexec/apache2/mod_ssl.so
↓
LoadModule ssl_module libexec/apache2/mod_ssl.so

#LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
↓
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

# Secure (SSL/TLS) connections
#Include /private/etc/apache2/extra/httpd-ssl.conf
↓
Include /private/etc/apache2/extra/httpd-ssl.conf


この変更により,ApacheSSL通信に必要な依存ライブラリと
設定ファイル(httpd-ssl.conf)をロードするようになります。

6. SSL用の設定ファイル(httpd-ssl.conf)を編集する

いよいよ大詰めです。
前述の手順で作成した秘密鍵と証明書を読み込むように
設定ファイル(httpd-ssl.conf)を編集します。

cd /private/etc/apache2/extra
sudo vi httpd-ssl.conf


変更箇所は以下の2箇所です。

#SSLCertificateFile "/private/etc/apache2/server.crt"
↓
SSLCertificateFile "/private/etc/apache2/server.crt"

#SSLCertificateKeyFile "/private/etc/apache2/server.key"
↓
SSLCertificateKeyFile "/private/etc/apache2/server.key"

すでにコメントアウトされているなら編集は不要です。

7. Apacheを再起動する。

動作確認です。
以下のコマンドでApacheを再起動しましょう。

sudo apachectl restart

ブラウザのアドレスバーに「https://localhost」を入力して
次の図のような画面が表示されればひとまず成功です。

f:id:cross-xross:20150114233529p:plain