この記事を三行にまとめると
信じられないくらいすごいラッキー(略してSSL)真剣に勝負を挑んだライオンに(略してSSL)
うどん粉
ロードバランサーを使って複数台のサーバーで運用していて、もしSSLを使いたい場合、それぞれのサーバーにSSLの設定をするのは面倒ですよね。
そうしなきゃいけない場合もあるのかもしれないけど、AWSのELBだとロードバランサーに直接SSLの証明書をインストールできるので、楽チンです。EC2の各インスタンスとかには特に何もする必要はない。
ただ、せっかくELBでSSLの設定をしても、EC2インスタンスに割り当てられたIPアドレスなんかで直接アクセスされちゃったら、非SSLの状態でサイトを開くことになっちゃいますよね。なので、もしELBでSSLを設定してEC2ではSSLの設定をやらない場合、ELB経由でしかアクセスできないようにしておいた方が良い。
今日はそれをちょいとやってみようかなーと。
今回、SSLの証明書はグローバルサインで取得したものを使ってます。グローバルサイン以外のSSLを使ったことないもんで、他のは分からん。
すでにロードバランサーを作成しているという前提での話になってしまいますが、ロードバランサーの設定ページにある「Listeners」ってタブを選択すると、下記のようなポートの設定画面が出て来ます。
ここで使用するポートの設定をする。今回はELBだけSSLを使えるようにするので、この画像のように、ELBはHTTPS(443番ポート)、EC2インスタンスはHTTP(80番ポート)で接続できるようにしてみます。
ELBの方をHTTPSにすると、右の方にある「SSL Certificate」ってとこに「Change」ってリンクが出て来ます。ここからSSLの証明書をインストールする画面を呼び出すことができます。
実際の画面はこんな感じ。
新しく証明書をインストールする場合は「Upload a new SSL Certificate」を選択します。
「Certificate Name」は何でも良いです。自分の好きな名前をつけてください。単純に「ssl_cert」みたいなのでも良いし、「情報を保護せし者(ガーディアン)」とか「信じられないくらいすごいラッキー(略してSSL)」とか「真剣に勝負を挑んだライオンに(略してSSL)」とか「うどん粉」とかでも良い。
「Private Key」は鍵ファイルですね。グローバルサインの場合、証明書を発行する際、CSRを作成するときに自分で鍵ファイルを作ることになるのですが、その鍵ファイルの内容をここに入力します。ただ、そのまま突っ込もうとするとエラーになるかもしれない。それについては後述します。
「Public Key Certificate」は証明書、「Certificate Chain」は中間証明書ですね。証明書を発行したとき、この二つはグローバルサインからメールで送られてくると思うので、それを突っ込めば良いです。後で管理画面からダウンロードすることもできると思いますが。
中間証明書は必須入力ではないですが、ちゃんと入力した方が良いです。僕がやってみた限りだと、中間証明書を入れなかった場合、PCでサイトを開いたときは問題なかったんだけど、スマホで開いたときに「このサイトを信頼して大丈夫っすか?」みたいな、オレオレ証明書を使ったときのような警告が出た。中間証明書を入れたら出なくなったから、たぶんそのせいだと思う。
これは、鍵ファイルにパスワードがかかってる場合に発生するみたいです。ELBはパスワードのかかった鍵ファイルを上手く読み込んでくれないようになっているみたいなので、鍵ファイルのパスワードを解除してやればオッケー。
パスワードを解除する方法は、上のコマンドを実行するだけです。
ssl.keyというのが元々の鍵ファイルで、ssl2.keyというのがパスワードなしで新たに作られる鍵ファイル。ELBの「Private Key」には、このssl2.keyの内容を入力すれば登録できます。
ちなみにグローバルサインで証明書を発行するときに鍵ファイルを作る方法は、もう二年くらい前の記事ですけど、僕が実際にやってみたときのことを書いたんで、良かったらどうぞ。
グローバルサインのSSLを使ってサイトをhttpsでアクセスできるようにする
上記の記事ではパスワードありの鍵ファイルを作成していますが、上で述べたような理由から、もしも今、鍵ファイルの作成からやろうとしているのであれば、順番としては、鍵ファイルを作成して、パスワードを解除して、そのパスワードを解除した鍵ファイルでCSRを作成すると良いと思います。
ちなみに、ELBにSSLをインストールするときは、どこで鍵ファイルやらCSRやら作成しても同じことなので、無理にサーバーで作成しなくても、自分のローカル環境とかで作成しても良いです。
ざっくりこんな感じ。この作業をローカルで行って、グルーバルサインで証明書を発行して、それをELBにインストールすれば、後は歯を磨いて風呂に入って寝るだけだ!!(o^-‘)b
httpsでもhttpでもどっちでもアクセスできるってんならこれで特に何の問題もないですが、もしウェブサイトがhttpsでのアクセスしか許可したくないって場合、EC2インスタンスの方に直接アクセスされたときにhttpでサイトが見れてしまうんで、それを防ぐために、ELB経由でしかサイトを開けないようにしてみます。
アクセスを制限するにはセキュリティグループのInbountってやつを設定します。
まず、ロードバランサー用に適当なセキュリティグループを作成する。
ざっくりこんな感じですね。httpsでサイトを開けるように、InboundにHTTPS(443番ポート)を追加します。
んで、次はロードバランサーに紐づくEC2インスタンス用のセキュリティグループ。
こっちはHTTP(80番ポート)を追加します。重要なのは、右の「Source」ってとこ。ここで「Custom IP」を選択し、先ほど作成したELB用のセキュリティグループのグループIDをここに入力します。上の画像で「sg-1234567」って入ってるとこですね。ここに任意のIDを入力する。セキュリティグループの一覧を見ると、Group IDのところに「sg-*******」みたいな文字列があるので、それをコピって入れます。
こんな感じですねー。これでウェブからのアクセスはロードバランサーを経由した場合のみ有効になります。
正直なところ、このセキュリティグループの設定ってやつをちゃんと理解してなくて、つい最近まではPHP側でごちゃごちゃと処理を書いてアクセスを弾くようなことをやってたんですが、まあ、それはそれで良いとは思うんですが、こっちのやり方も覚えといた方が良いかなーって気はします。
そうしなきゃいけない場合もあるのかもしれないけど、AWSのELBだとロードバランサーに直接SSLの証明書をインストールできるので、楽チンです。EC2の各インスタンスとかには特に何もする必要はない。
ただ、せっかくELBでSSLの設定をしても、EC2インスタンスに割り当てられたIPアドレスなんかで直接アクセスされちゃったら、非SSLの状態でサイトを開くことになっちゃいますよね。なので、もしELBでSSLを設定してEC2ではSSLの設定をやらない場合、ELB経由でしかアクセスできないようにしておいた方が良い。
今日はそれをちょいとやってみようかなーと。
今回、SSLの証明書はグローバルサインで取得したものを使ってます。グローバルサイン以外のSSLを使ったことないもんで、他のは分からん。
SSLをELBにインストール
ほんじゃあ、まずはELBにSSL証明書をインストールしてみます。すでにロードバランサーを作成しているという前提での話になってしまいますが、ロードバランサーの設定ページにある「Listeners」ってタブを選択すると、下記のようなポートの設定画面が出て来ます。
ここで使用するポートの設定をする。今回はELBだけSSLを使えるようにするので、この画像のように、ELBはHTTPS(443番ポート)、EC2インスタンスはHTTP(80番ポート)で接続できるようにしてみます。
ELBの方をHTTPSにすると、右の方にある「SSL Certificate」ってとこに「Change」ってリンクが出て来ます。ここからSSLの証明書をインストールする画面を呼び出すことができます。
実際の画面はこんな感じ。
新しく証明書をインストールする場合は「Upload a new SSL Certificate」を選択します。
「Certificate Name」は何でも良いです。自分の好きな名前をつけてください。単純に「ssl_cert」みたいなのでも良いし、「情報を保護せし者(ガーディアン)」とか「信じられないくらいすごいラッキー(略してSSL)」とか「真剣に勝負を挑んだライオンに(略してSSL)」とか「うどん粉」とかでも良い。
「Private Key」は鍵ファイルですね。グローバルサインの場合、証明書を発行する際、CSRを作成するときに自分で鍵ファイルを作ることになるのですが、その鍵ファイルの内容をここに入力します。ただ、そのまま突っ込もうとするとエラーになるかもしれない。それについては後述します。
「Public Key Certificate」は証明書、「Certificate Chain」は中間証明書ですね。証明書を発行したとき、この二つはグローバルサインからメールで送られてくると思うので、それを突っ込めば良いです。後で管理画面からダウンロードすることもできると思いますが。
中間証明書は必須入力ではないですが、ちゃんと入力した方が良いです。僕がやってみた限りだと、中間証明書を入れなかった場合、PCでサイトを開いたときは問題なかったんだけど、スマホで開いたときに「このサイトを信頼して大丈夫っすか?」みたいな、オレオレ証明書を使ったときのような警告が出た。中間証明書を入れたら出なくなったから、たぶんそのせいだと思う。
鍵ファイルの入力エラー
「Private Key」に鍵ファイルの中身を入力して登録しようとすると、「Invalid private key.」ってエラーが出ることがあります。これは、鍵ファイルにパスワードがかかってる場合に発生するみたいです。ELBはパスワードのかかった鍵ファイルを上手く読み込んでくれないようになっているみたいなので、鍵ファイルのパスワードを解除してやればオッケー。
パスワードを解除する方法は、上のコマンドを実行するだけです。
openssl rsa -in ssl.key -out ssl2.key
ssl.keyというのが元々の鍵ファイルで、ssl2.keyというのがパスワードなしで新たに作られる鍵ファイル。ELBの「Private Key」には、このssl2.keyの内容を入力すれば登録できます。
ちなみにグローバルサインで証明書を発行するときに鍵ファイルを作る方法は、もう二年くらい前の記事ですけど、僕が実際にやってみたときのことを書いたんで、良かったらどうぞ。
グローバルサインのSSLを使ってサイトをhttpsでアクセスできるようにする
上記の記事ではパスワードありの鍵ファイルを作成していますが、上で述べたような理由から、もしも今、鍵ファイルの作成からやろうとしているのであれば、順番としては、鍵ファイルを作成して、パスワードを解除して、そのパスワードを解除した鍵ファイルでCSRを作成すると良いと思います。
ちなみに、ELBにSSLをインストールするときは、どこで鍵ファイルやらCSRやら作成しても同じことなので、無理にサーバーで作成しなくても、自分のローカル環境とかで作成しても良いです。
//鍵ファイル作成
# openssl req -new -key ssl.key -out ssl.csr
//パスワード解除
# openssl rsa -in ssl.key -out ssl2.key
//ssl2.keyの方を使ってCSR作成
# openssl req -new -key ssl2.key -out ssl.csr
ざっくりこんな感じ。この作業をローカルで行って、グルーバルサインで証明書を発行して、それをELBにインストールすれば、後は歯を磨いて風呂に入って寝るだけだ!!(o^-‘)b
セキュリティグループの設定
証明書のインストールが終われば、ELB経由でもhttpsでサイトを開けるようになります。httpsでもhttpでもどっちでもアクセスできるってんならこれで特に何の問題もないですが、もしウェブサイトがhttpsでのアクセスしか許可したくないって場合、EC2インスタンスの方に直接アクセスされたときにhttpでサイトが見れてしまうんで、それを防ぐために、ELB経由でしかサイトを開けないようにしてみます。
アクセスを制限するにはセキュリティグループのInbountってやつを設定します。
まず、ロードバランサー用に適当なセキュリティグループを作成する。
ざっくりこんな感じですね。httpsでサイトを開けるように、InboundにHTTPS(443番ポート)を追加します。
んで、次はロードバランサーに紐づくEC2インスタンス用のセキュリティグループ。
こっちはHTTP(80番ポート)を追加します。重要なのは、右の「Source」ってとこ。ここで「Custom IP」を選択し、先ほど作成したELB用のセキュリティグループのグループIDをここに入力します。上の画像で「sg-1234567」って入ってるとこですね。ここに任意のIDを入力する。セキュリティグループの一覧を見ると、Group IDのところに「sg-*******」みたいな文字列があるので、それをコピって入れます。
こんな感じですねー。これでウェブからのアクセスはロードバランサーを経由した場合のみ有効になります。
正直なところ、このセキュリティグループの設定ってやつをちゃんと理解してなくて、つい最近まではPHP側でごちゃごちゃと処理を書いてアクセスを弾くようなことをやってたんですが、まあ、それはそれで良いとは思うんですが、こっちのやり方も覚えといた方が良いかなーって気はします。