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
この変更により,ApacheはSSL通信に必要な依存ライブラリと
設定ファイル(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」を入力して
次の図のような画面が表示されればひとまず成功です。