VagrantでUbuntuサーバ/Apache2のSSL(https)
これまでにやったこと:
- VirtualBoxにUbuntu12.04インストール、openssh-serverインストール、vagrant用インセキュア・キーの設置、VirtualBox Guest Additionsのインストール、VagrantでBase Box作成
- デフォルトエディタをvim-noxに変更、etckeeper/git/tigのインストール、NTPインストール
- IPアドレス固定、SSHポート変更(のメモ)
- UFWの設定、Apache2インストール、a2ensite/a2dissite
環境:
- VirtualBox 4.3.8
- Vagrant 1.5.1
- Ubuntu Server 12.04
今日触れる項目:
SSLの設定
前回の記事では、/etc/apache2/sites-availableにあったdefaultファイルをコピーしてwwwファイルを作り、a2ensiteコマンドでwwwを有効化して/etc/apache2/sites-enableにwwwファイルへのシンボリックリンクを作り、a2dissiteコマンドで000-default(defaultファイルへのシンボリックリンクになっている)を無効化しました。
前回のwwwというサイトがenableされた状態だとして、あらためて、192.168.33.20にホストのブラウザでhttp接続してみます。
前回の設定では、ドキュメントルートが/vagrantで、ここにindex.htmlファイルがあり、これが表示されます。
今度はhttpでなくhttpsでアクセスを試みます。ブラウザが「アクセスできません」と言っていれば、前準備はOKです。
前回のUFWの設定で、'Apache Full'をALLOWにしているので、SSLのポートは通っていますが、Apache2のmod_sslモジュールが有効化されていない状態です。
ApacheがSSLを使えるように、モジュールを有効化します:
$ sudo a2enmod ssl
$ sudo service apache2 reload
もういちど同じIPアドレスにhttps接続を試みようとすると、ブラウザが「SSL接続エラー」と言います(Chromeで確認)。
証明書が無い状況です。ここでいったんetckeeper commit
しておきます。
通常、HTTPSの提供には、CSRを生成し、これに認証局にサインしてもらって証明書としたものを設置しなければなりませんが、開発段階ではテスト用の証明書を利用します。
$ sudo make-ssl-cert generate-default-snakeoil --force-ovarwrite
$ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/apache.pem
$ sudo service apache2 reload
ふたつめのコマンドを打ったときに、ホスト名を聞かれますが、vagrant
とか適当な名前を入れます。ここでもetckeeper commit
しておきます。
この時点でhttps接続しても、さっきと同じ接続エラーがでます。SSLで使うサイトが有効化されていないからです。
/sites-availableにはdefaultの他にもうひとつ、default-sslというenableされていないファイルがあります。これをコピーして使うことにします:
$ cd /etc/apache2/sites-available
$ sudo cp default-ssl ssl
$ sudo a2ensite ssl
$ sudo service apache2 reload
ふたたびブラウザでhttps接続しようとすると、今度はブラウザが「信用できません」と言いますが、「そのまま続行」をクリックすると、「It works!」と表示されます(Chromeの場合。Firefoxでは「危険性を理解したうえで接続するには」>「例外を追加」という手順になりますが、永続的に許可することになるので、Chromeで確認するのが無難でしょう。)。
もともとのdefault-sslのドキュメントルートはdefaultと同様、/var/wwwなので、/vagrantにあるindex.htmlではないファイルにアクセスしました。
httpsをhttpに変えてアクセスし直すと、/vagrantにあるindex.htmlが表示されるのを確認して下さい。
最後にetckeeper commit
を忘れずに。
ちゃんとしたCSRのつくり方
Vagrantで構築するサーバは使い捨てが基本なので、認証局からの証明書は(ほとんどの場合)本番環境まで必要ありませんが、一応、メモとして、認証局に提出するCSRの生成方法も記しておきます。
【ステップ1】CSRを生成するためのキーペアを生成します。
$ sudo openssl genrsa -des3 -out /root/server.key 2048
パスフレーズの入力を2回促されます。
【ステップ2】サーバ起動時などにパスフレーズを入力しなければならないのは面倒なので、パスフレーズを解除します。
$ sudo openssl rsa -in /root/server.key -out /root/server-nopassword.key
先に入力したパスフレーズを聞かれます。
【ステップ3】キーペアを用いてCSRを生成します。
$ sudo openssl req -new -key /root/server-nopassword.key -out /root/server.csr
認証局から要求されているディスティングイッシュネーム情報を入力します。たとえばジオトラストだとはじめの6項目だけ入力するように求められます。
server.csrの内容を認証局に提出して、証明書としての公開鍵を受け取り、インストールします。
秘密鍵(server-nopassword.key)はバックアップのうえ厳重に保管します。
Apache+OpenSSL CSR 生成手順(新規) - YouTube
次回はrbenvかPHPか、どっちかの予定です。