ちょっと話題の記事

[小ネタ] Amazon ELBで使えるSSL自己署名証明書を3ステップで作る

2014.02.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
ELBのSSL Termination、みなさん使っていますか?EC2のSSL処理をオフロードしたり、バーチャルホストを複数ELBで対応したり、便利ですよね。
ただ、"ちょっとSSL Terminationを試してみたい"というときサンプルの証明書を準備する作業は、結構面倒なのではないでしょうか。今回はなるべく手早く、自己署名証明書を作成する方法としてmake-ssl-certコマンド+αの方法をご紹介します。

お決まりの断りですが、SSL自己署名証明書はあくまで動作確認用に用いるべきものですので、HTTPS通信の保護およびWebサーバー認証のためには、然るべき正式なSSL証明書を準備ください。

Step1: Ubuntu VMをVagrantで用意する

まずは、SSL証明書作成用のUbuntu仮想マシンを用意します(キリッ)。「えー、証明書作成のためにわざわざ仮想マシン用意するのかよ?!」と文句が聞こえてきそうですが、Windows用やMac OS X用などいろいろなSSL証明書を扱うツールを試してきた結果、一番シンプルに使えるのはLinux(Ubuntu)のmake-ssl-certコマンドという結論に至りました。Vagrantを使えばとても簡単にUbuntu仮想マシンが扱えるので、この機会にVagrantデビューするのもいいかもしれません(笑)。

Vagrantは、公式Webページからバイナリをダウンロード、インストールします。(VirtualBoxも合わせてインストールしましょう)Mac OS Xであれば、端末を開いて数分でUbuntu仮想マシンを起動、ログインすることができます!途中のvagrant up実行時に仮想マシンイメージ(Box)のダウンロードが実行されるので、太いネットワーク回線に接続し作業することをお奨めします。

Vagrantの入門チュートリアルがちょうどUbuntu仮想マシンを起動しているので、その流れに沿って作業してみます。

macbook:~ ryuta$ mkdir precise                          # Vagrantの設定ファイルを配置する、任意のディレクトリを作成
macbook:~ ryuta$ cd precise
macbook:precise ryuta$ vagrant init precise32 http://files.vagrantup.com/precise32.box # Ubuntu 12.04 LTS 32-bit(普通のUbuntu)を指定
  :
macbook:precise ryuta$ vagrant up                       # 初回実行時は仮想マシンイメージをダウンロードして起動、2回目以降はイメージを使い回す
Bringing machine 'default' up with 'virtualbox' provider...
  :
Guest Additions Version: 4.2.0
VirtualBox Version: 4.3
[default] Mounting shared folders...
[default] -- /vagrant
macbook:precise ryuta$ vagrant ssh                      # いきなりSSH接続!SSH鍵などはVagrantが自動生成してくれます。Cool!!
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2
vagrant@precise32:~$

Ubuntu仮想マシンにログインできました!続いて、make-ssl-certコマンドを含むssl-certパッケージをインストールします。

vagrant@precise32:~$ sudo apt-get install ssl-cert 
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  openssl-blacklist
The following NEW packages will be installed:
  ssl-cert
0 upgraded, 1 newly installed, 0 to remove and 156 not upgraded.
Need to get 12.3 kB of archives.
After this operation, 91.1 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ precise-updates/main ssl-cert all 1.0.28ubuntu0.1 [12.3 kB]
Fetched 12.3 kB in 0s (28.9 kB/s)
Preconfiguring packages ...
Selecting previously unselected package ssl-cert.
(Reading database ... 29361 files and directories currently installed.)
Unpacking ssl-cert (from .../ssl-cert_1.0.28ubuntu0.1_all.deb) ...
Processing triggers for man-db ...
Setting up ssl-cert (1.0.28ubuntu0.1) ...
vagrant@precise32:~$ make-ssl-cert
debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied
Usage: /usr/sbin/make-ssl-cert template output [--force-overwrite]
Usage: /usr/sbin/make-ssl-cert generate-default-snakeoil [--force-overwrite]

これで準備OKです。

Step2: make-ssl-certの実行+α

make-ssl-certコマンドは、自己署名証明書を簡単に作成するコマンドラインツールです。以下のようにHost name(Common Name)を入力するだけでそれ以外はツールが自動でうまいこと見繕い、秘密鍵と証明書を含むpemファイルを作成してくれます!以下の実行例で指定している./cert.pemが、作成する証明書のファイル名です。任意のファイルで、どんどん作ることができます。

vagrant@precise32:~$ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf ./cert.pem

                     ┌────────────────────┤ Configure an SSL Certificate. ├─────────────────────┐
                     │ Please enter the host name to use in the SSL certificate.                │
                     │                                                                          │
                     │ It will become the 'commonName' field of the generated SSL certificate.  │
                     │                                                                          │
                     │ Host name:                                                               │
                     │                                                                          │
                     │ sample-elb-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com___________________ │
                     │                                                                          │
                     │                   <Ok>                       <Cancel>                    │
                     │                                                                          │
                     └──────────────────────────────────────────────────────────────────────────┘
                     
vagrant@precise32:~$ ls
20154bec  cert.pem  postinstall.sh
vagrant@precise32:~$ sudo cat cert.pem
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC88d+01eujf0lN
  : (中略)
EiPZjALfvnEmIhdFcxtYGguGdCG1sXHaDzY052+jCx70OYtD5XPO2yWlQEvrv3Si
sDEkBIU7PDNbRXjX2eoprTd/pg==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIC/DCCAeQCCQDMFK9wYsijGzANBgkqhkiG9w0BAQUFADBAMT4wPAYDVQQDEzVz
  : (中略)
HktEr/6CwFp3XutubBSXrxQc5wLBr/0m9hNb0SN1qGJdANxPKW6NdeRYkT/+37SK
-----END CERTIFICATE-----
vagrant@precise32:~$

あっという間にできました!
-----BEGIN CERTIFICATE-----から-----END CERTIFICATE-----までの部分を、ELBの証明書アップロード時のPublic Key Certificate欄に貼付けて使います。参考までに証明書の詳細を確認するopenssl x509コマンドの結果を示します。

vagrant@precise32:~$ sudo openssl x509 -in cert.pem -text # 証明書の内容を確認
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            cc:14:af:70:62:c8:a3:1b
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=sample-elb-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com
        Validity
            Not Before: Feb 10 08:41:46 2014 GMT
            Not After : Feb  8 08:41:46 2024 GMT
        Subject: CN=sample-elb-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                  : (以下鍵情報)
vagrant@precise32:~$

設定したとおりにできていますね!

Step3: 秘密鍵の変換

ここでちょっとしたコツです。make-ssl-certコマンドで作成されるpemファイルにある秘密鍵(Private Key)はRSA形式になっていないため、ELBのアップロード時に以下のようなエラーが出てしまいそのままでは使えません。openssl rsaコマンドで、RSA形式に変換したものを貼付けましょう。

elb-selfsigned-cert01

vagrant@precise32:~$ sudo openssl rsa -in cert.pem
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAvPHftNXro39JTcvP8RdYapGRojNd9H68MIrBaIuZwKAe9xjb
  : (中略)
NOdvowse9DmLQ+VzztslpUBL6790orAxJASFOzwzW0V419nqKa03f6Y=
-----END RSA PRIVATE KEY-----

こちらをPrivate Key欄に貼付ければ、一丁あがりです!

elb-selfsigned-cert02

後片付け

SSL証明書をアップロードしたELBが正常に動作することを確認したら、Ubuntu仮想マシンを片付けましょう。今回作成した証明書が不要であれば、vagrant destroyで仮想マシンごと削除してしまうのがお奨めです。また必要になったらvagrant upを実行し新規仮想マシンを作成します。2回目以降はBoxのダウンロードは省略されるので、ネットワーク通信は発生せず、より早く起動します。Vagrant賢い!

vagrant@precise32:~$ logout
Connection to 127.0.0.1 closed.
macbook:precise ryuta$ vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y
[default] Forcing shutdown of VM...
[default] Destroying VM and associated drives...
macbook:precise ryuta$

まとめ

make-ssl-certコマンドを利用したELB向けSSL自己署名証明書の作成方法をご紹介しました。この方法なら複数ドメインでSSLバーチャルホストの動作検証も苦にならないハズ!
また、Macネイティブでイケてるツールがあれば教えてください!乗り換えを検討します(笑