このチュートリアルでは、ローカル環境でHTTPSを使用してRuby on Railsアプリケーションを開発する方法を説明します。ローカル環境でHTTPSを使用する主な利点は次のとおりです。
- 本番環境との差異の減少:本番環境とできる限り同じ設定で開発することで、開発環境では問題なかったのに本番環境にリリースしたら動作しなかったという事態を回避できます。
- HTTPSが必須の機能のローカル開発が可能:例えば、シングルサインオン(SSO)連携をローカル開発する場合、Google OAuthのように認証プロバイダーが認証後のコールバックURLとしてHTTPSサイトしか許可していない場合でも対応できます。
以下の手順で比較的簡単にHTTPSでの開発環境を構築できます。
- ルート証明書の作成
- ローカルサーバー用SSL証明書の作成
- ブラウザーにルート証明書をインポート
- Ruby on Railsの設定
- RailsサーバーでSSLを使用
1. ルート証明書の作成
opensslで、ルート証明書用の秘密鍵を作成します。
openssl genrsa -des3 -out myCA.key 2048
次に、作成した秘密鍵を使ってルート証明書を作成します。
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem
2. ローカルサーバー用SSL証明書の作成
次のコマンドを実行して、ローカルサーバー用の秘密鍵を作成します。
openssl genrsa -out your_local_domain.key 2048
次のコマンドを実行して、証明書署名要求(CSR)を作成します。
openssl req -new -key your_local_domain.key -out your_local_domain.csr
設定ファイルを作成します。一般公開サイトと管理サイト、またはサブドメインのようにシステム上に複数のサイトが存在する場合、alt_namesセクションで各サイトのホスト名またはIPアドレスを記載しておくと、すべてHTTPSでアクセスできるようになります。
# your_local_domain.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = your_local_domain_name
DNS.2 = your_another_local_domain_name
IP.1 = 192.168.0.1
上記で作成したファイルと秘密鍵を使用して、署名付きSSL証明書を作成します。
openssl x509 -req -in your_local_domain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial
-out your_local_domain.crt -days 825 -sha256 -extfile your_local_domain.ext
3. ブラウザーにルート証明書をインポート
ローカル開発で使うブラウザーに、ステップ1で作成したルート証明書(myCA.pem)をインポートします。これにより、ステップ2で作成したSSL証明書の有効性をブラウザーが検証できるようになります。
Google Chromeの場合:
- メニューから[設定]を開きます。
- 左側の [プライバシーとセキュリティ] をクリックします。
- [セキュリティ] をクリックします。
- [詳細設定] セクションの[証明書の管理] をクリックします。
- [信頼されたルート証明機関]からステップ1で作成したルート証明書(myCA.pem)をインポートします。
4. Ruby on Railsの設定
開発環境の設定ファイルに、SSL証明書に記載したローカル開発用ドメインを記載します。
# config/environments/development.rb
config.hosts << 'your_local_domain'
同様に、hostsファイルにもローカル開発用ドメインを記載してローカルホスト(127.0.0.1)にルーティングします。
# /etc/hosts
127.0.0.1 your_local_domain
5. RailsサーバーでSSLを使用
Ruby on Railsでローカルサーバーを起動する際に、SSLプロトコルを使ってステップ2で作成した秘密鍵とSSL証明書を指定します。
rails s -b 'ssl:https://engineerjutsu.com:3000?&key=your_local_domain.key&cert=your_local_domain.crt'
これで、ブラウザーでhttps://your_local_domain:3000にアクセスすれば、HTTPSでサイトが表示されるようになります。
もしHTTPSとHTTPの両方を使いたい場合は、config/puma.rbに設定を記述します。
# config/puma.rb
ssl_bind 'localhost', '3001', {
key: 'your_local_domain.key',
cert: 'your_local_domain.crt'
}
そして、バインドオプション(-b)なしでRailsサーバーを起動します。
rails s
これで、3000ポートではHTTPで、3001ポートではHTTPSでローカルサイトにアクセスできるようになります。
まとめ
以上の手順に従うことで、Railsローカル環境でもHTTPSを使った開発が可能になります。そうすることで、本番環境と開発環境の差異を少なくできたり、シングルサインオンの開発が行いやすくなります。SSL証明書の有効期限を長めにすればずっと使えますし、比較的短時間で設定できるので、ぜひ試してみてはいかがでしょうか。
