株式会社ライブキャストロゴ 株式会社ライブキャスト

ちょっと前にやったことを思い出しながら文章をまとめていたら時間がかかってしまい、いつのまにかAWS Management Consoleが日本語化されておりました…d
本文中の画面キャプチャは英語表記になっているので、お手数ですが適宜読みかえていただければと思います。

ずいぶん前のことになりますが、Nginxで稼働中のインスタンスを配下に持つElastic Load Balancers(ELB)にSSLを設定する機会があったので、備忘録もかねて手順を簡単にまとめたいと思います。

大まかな手順は以下のようになります。

  1. 秘密鍵を作成する
  2. 作成した秘密鍵からパスフレーズを抜く
  3. CSRを作成する
  4. SSL証明書の申請・取得
  5. ELBにSSLアップロードする

この手順に従って作業を進めますが、SSL証明書の申請方法や、認証局については細かくは触れていません。あらかじめご了承ください。

※ 尚、実際のSSL導入には、以下のサイトを参考にしました。
[CSR生成] nginx + OpenSSL(新規・更新) | SSL・電子証明書ならグローバルサイン

秘密鍵を作成する

秘密鍵の作成にはOpenSSLを使用します。
OpenSSLといえば、一昨年ハートブリード – Wikipediaという脆弱性で話題になりました。バージョンを確認して対応されている事をちゃんと確認しておきましょう(その後もちょこちょこと脆弱性を指摘されていますので注意しましょう)。
※ 参考:OpenSSLの脆弱性「Heartbleed」について -サイバートラスト株式会社-

[root@ip-172-30-0-93 nginx]# openssl genrsa -des3 -out www.example.com2014.key 2048
Generating RSA private key, 2048 bit long modulus
…………………..+++
……………………………….+++
e is 65537 (0x10001)
Enter pass phrase for www.example.com2014.key:
Verifying – Enter pass phrase for www.example.com2014.key:

秘密鍵が作成されました。

作成した秘密鍵からパスフレーズを抜く

ELBにSSL証明書をアップロードする際に秘密鍵を設定するのですが、その際にパスフレーズが含まれているとアップロード時にエラーになりますので、パスフレーズを抜いたバージョンを用意しておきます。

[root@ip-172-30-0-93 nginx]# openssl rsa -in www.example.com2014.key -out www.example.com2014_nophrase.key
Enter pass phrase for www.example.com2014.key:
writing RSA key

パスフレーズを抜いた秘密鍵が作成されました。

CSRを作成する

次に、SSL証明書の申請時に必要なCSRを作成します。

CSR作成時には、対話形式でいくつか入力する項目(Country Name等)がありますが、内容についてはこちらを参考にしてください。

[root@ip-172-30-0-93 nginx]# openssl req -new -key www.example.com2014_nophrase.key -out www.example.com.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shibuya
Organization Name (eg, company) [Default Company Ltd]:example.com
Organizational Unit Name (eg, section) []:-
Common Name (eg, your name or your server’s hostname) []:www.example.com
Email Address []:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CSRができました!

SSL証明書の申請と取得

実際の申請手順は、申請する会社によって異なると思いますので、ここは各社の申請方法に従っていただければと思います。

今回はGlobalSignの「クイック認証SSL」を選択しました。
クイック認証SSL 新規お申し込み方法 | SSL・電子証明書ならGMOグローバルサイン

たいていの場合、担当者宛てにメールで証明書が送られてくると思います。以降の作業で使用する証明書は、このメールで送られてきたもので事足りると思います。「ELBにSSLアップロードする」でも、この証明書を使用していきます。

ELBにSSLアップロードする

それでは取得したSSLをElastic Load Balancer(ELB)にアップロードしていきたいと思います。

AWS マネジメントコンソールからLoad Balancerメニューから行います。
以下の2ケースが考えられます。

  • ELBをウィザード形式で新規作成する際にSSLをアップロードする。
  • すでに運用中のELBにSSLをアップロードする。

AWS Management Console左ペインのLoad Balancerメニューから、Load Balancerを新規作成する際の一連の作業の中で行う場合と、作成済みのLoad Balancerを選んで、それに対してSSLをアップロードするという2種類になります。

実際にSSLのアップロードを行う画面は以下の画面になります。


  • Certificate Type(必須):使用するSSLをアップロード済みのSSLから選ぶか、新規でアップロードするかを選択します。
  • Certificate Name(必須):便宜上、アップロードしたSSLに名前をつけます。後でアップロード済みのSSLを削除したい、なんてときに使いますのでわかりやすい名前にしましょう。
  • Private key(必須):前述のパスフレーズを抜いた秘密鍵の値を貼り付けます。
  • Public key Certificate(必須):メールで送られてきた証明書を貼り付けます
  • Certificate Chain(オプション):中間CA証明書を指定します
Certificate Chainの中間CA証明書ですが、項目上、Optionとなっているので入力は必須ではありません。ですが、必ず設定するようにしましょう(今回GlobalSignを使用していますが、それ以外でも同様のことが起こりえますので要注意です。RapidSSLもそうみたいですね)。

Certificate Chainの入力

これを設定しないと、Firefoxで、以下のような警告メッセージが表示されてしまうことがあります。

Firefoxで表示されるSSLの警告メッセージ

通常、ブラウザには認証局の証明書があらかじめインストールされているのですが、最近のFireFoxではGlobalSignの証明書が入っていないようなのです。

詳しくはこちらをどうぞ↓
SSLサーバ証明書FAQ:エラーについて | SSL・電子証明書ならGMOグローバルサイン
ちょうど真ん中くらいのところです。

globalsignのサイトにあるよくある質問

一度でも、中間証明書がダウンロードされるとローカルに保存されるので以降発生することはなくなるのですが、はじめてアクセスされた際に証明書がなければ、このような警告表示になってしまうので、それは極力避けたいところです。

通常、中間証明書はSSLが届いたメールに添付されていると思いますが、GlobalSignの場合はここ(SHA-1)からもダウンロードできます。

※ 2015年6月19日追記
SHA-256ハッシュ関数を使用したSSLの中間証明書はこちらからのダウンロードとなります。上記の説明はSHA-1ハッシュ関数を使用したSSLの手順でした。SHA-1のSSLは今後廃止になるため有効期限終了日によっては各種ブラウザで警告が表示されることがあります。これからSSLを取得する方はSHA-256のハッシュ関数を使用したSSLを取得するようにしましょう。

リポジトリ・利用約款 | SSL・電子証明書ならGMOグローバルサイン

「Save」ボタンを押してエラーが出なければ、SSLのアップロードは完了です。
秘密鍵にパスフレーズが含まれているものを使用していたり、中間CA証明書が間違っていたりするとエラーになります。

エラーも出ず、次のステップに進めば、SSLの設定は完了です!

ちなみに、ELBにSSLを設定するのではなく、Webサーバー(Nginx)に設定する場合は以下のような手順になります。簡単ですが、参考までに。

サーバー証明書と中間CA証明書のファイルを結合させて1つのファイルにします。

[root@ip-172-30-0-224 nginx]# cat example.com_2015.crt dvcacert_v3.cer > example.com_2015.pem
[root@ip-172-30-0-224 nginx]# ls -lv
合計 116
-rw-r–r– 1 root root 1654 12月 2 2013 dvcacert_v3.cer
-rw-r–r– 1 root root 997 3月 14 05:04 example.com_2015.csr
-rw-r–r– 1 root root 1797 3月 18 13:45 example.com_2015.crt
-rw-r–r– 1 root root 1751 3月 14 04:58 example.com_2015.key
-rw-r–r– 1 root root 3451 3月 20 13:07 example.com_2015.pem
-rw-r–r– 1 root root 1679 3月 14 05:00 example.com_2015_nophrase.key

/etc/nginx/nginx.confの設定を変更します。

●変更前
SSL関連設定部分設定のデフォルトです。

    #server {                                                                                                           
    #    listen       443;                                                                                              
    #    server_name  localhost;                                                                                        
    #    root         html;                                                                                             

    #    ssl                  on;                                                                                       
    #    ssl_certificate      cert.pem;                                                                                 
    #    ssl_certificate_key  cert.key;                                                                                 

    #    ssl_session_timeout  5m;                                                                                       

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;                                                                              
    #    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;                                                                          
    #    ssl_ciphers  HIGH:!aNULL:!MD5;                                                                                 
    #    ssl_prefer_server_ciphers   on;                                                                                

    #    location / {                                                                                                   
    #    }                                                                                                              
    #}      

●変更後

  • すべてのコメントアウトをはずす
  • サーバー証明書の指定
  • 秘密キーの指定
    server {
        listen       443;
        server_name  live-cast.asia;
        root         html;

        ssl                  on;

        ssl_certificate      example.com_2015.pem;
        ssl_certificate_key  example.com_2015_nophrase.key;

        ssl_session_timeout  5m;

        #ssl_protocols  SSLv2 SSLv3 TLSv1;                                                                              
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
	}
}

あ!それとバージョンの指定ですが、SSLv2とSSLv3には脆弱性が指摘されていますので、有効にはしません。13行目の部分です。14行目のみコメントをはずしてください。

Nginxの設定をリロードして、設定ファイルが正常に読み込まれれば、SSLの設定は完了です。

以上で、Nginxで稼働中のインスタンスを配下に持つElastic Load BalancersへのSSLの設定は完了です。本題より、注意事項のほうが多くなってしまったような気がしますが、なにかの参考になればうれしいです!

最後に

先月、HTTPSの関連で「Logjam」という脆弱性が発見されています。
TLS プロトコルの脆弱性 「Logjam」 に関するお知らせ|サイバートラスト

Elastic Load Balancersを使う上での注意点をもう1つ。

執筆時点(2015/6/10)で、ELBSecurityPolicy-2015-05という最新のセキュリティーポリシーが提供されています。特別な理由がなければこちらを選択するようにしましょう。Logjamの脆弱性の対応がされていますので。



弊社では、GlobalSign クイック認証SSLの取得代行、および、Amazon Web Serviceへの導入作業を代行しています。何かございましたらお気軽にお問い合わせいただければと思います。
お問い合せ | 株式会社ライブキャスト