でじたま日記 the 3rd

日々の戯れ言 - 技術系

#heroku に構築した Web サーバのSSL証明書の更新

2013-09-02
弊社のホームページは heroku 上に構築していますが、今回SSL証明書の更新作業を行いました。
証明書はRapidSSLを使用しているため中間証明書が必要なことと、heroku のSSLアドオンが変更になったためアドオンの更新を行ったのでその備忘録です。

証明書の入手

RapidSSLはオンラインショップがいくつかあり、値段や支払方法などが異なります。 今回はディファイン合同会社のショップから購入しました。

購入手続きが終わると、新規に更新証明書用のCSRを求められるので手元で生成します。

$ openssl md5 * > rand.dat
$ openssl genrsa -rand rand.dat -des3 2048 > 2013key.pem
$ openssl req -new -key 2013key.pem -out 2013csr.pem
4743 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
..............................................+++
..............+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:

なお、パスフレーズを指定すると heroku に登録できないので注意してください。生成したCSR(2013csr.pem)の内容をコピペして申請者情報を入力し、申請者の確認手順(メールやWebサーバにファイルを置く方法があります)を完了すると証明書が届きます。

中間証明書との結合

RapidSSLで入手する証明書はルート認証局が発行するものではないため、中間証明書が必要になります。つまり、サーバIDとして使用される証明書と中間証明書の2つのファイルを利用しますが、heroku で一つのアプリケーションに登録することのできる証明書ファイルは一つしかないため、これらを結合します。
まず、中間証明書はダウンロードURLが提示されているのでそこからダウンロードします。メールで送られてきた証明書を server.csr.original、ダウンロードした中間証明書のファイル名を RapidSSL_CA_bundle.pem とすると、次のようにして結合します。

$ cat server.csr.original RapidSSL_CA_bundle.pem > server.csr

heroku のSSLアドオンの登録

去年登録した段階では、heroku で SSL を使用するには ssl:hostname アドオンが必要でした。しかし現段階ではこのアドオンは無効になっており、新規の登録はできません。(継続利用はできていました)
そこで、新しい SSL アドオンである ssl:endpoint アドオンをアプリケーションに追加します。

$ heroku addons:add ssl:endpoint --app dejitama
$ heroku certs:add --app dejitama server.csr 2013key.pem
$ heroku addons:remove ssl:hostname
$ heroku certs --app dejitama
Endpoint                 Common Name(s)                  Expires               Trusted
-----------------------  ------------------------------  --------------------  -------
gifu-1775.herokussl.com  www.dejitama.com, dejitama.com  2014-05-30 09:42 UTC  True

1行目で ssl:endpoint アドオンの追加、2行目で証明書のアップロード、3行目は古いアドオンの削除、4行目で状態を確認します。なお、詳細については heroku のドキュメントを参照してください。

DNSの登録

先ほどの手順の最後でステータスを確認しましたが、一番左端(Endpoint)が実サーバ名となります。このサーバ名が証明書のアップロード前と変わっていたため、DNSのレコードの変更が必要になりました。heroku 上で SSL を使っている場合は CNAME レコードで登録しているかと思いますが、CNAMEで向けているホスト名と異なっている場合はレコードを修正しなければなりません。最初、これに気づかずに5分ほどサイトを停止させてしまいましたのでご注意を・・・。

以上で作業は終了です。ブラウザでアクセスし、証明書が更新されていることを確認して問題がなければ証明書の更新作業は完了となります。