社内や社外のクラウド上に構築する検証サーバでSSLを設定していたりするのだが、検証用のために証明書をちゃんと買うというのも懐事情としては厳しい時もある。 だからと言って認証されていない状態だと、RestAPIなどにアクセスする際に処理がうまくできないことがある。 社内の場合であればプライベート認証局でも作れという話かもしれないがめんど(ry...もとい、設計とかでそれなりに工数がかかる。

なんかいい感じに手抜きできる方法ないかなと思っていたのだが、最近は無料でSSL証明書を発行してくれるプロジェクト「Let's Encrypt」というものがあるようなので、試してみることにした。 これならパブリック認証局で認証してるからプライベートと違ってサーバもいらないし、証明書をクライアントに配布するような作業も不要だ。 以前から無料で利用できる証明書もあるにはあったが、それらと違い手軽(証明書が必要なサーバ側にクライアントプログラムを導入して1か月単位で自動生成させる)に利用できるのもよさそうだ。 会社で利用する証明書としてはどうかと思うが、個人で利用するなら便利そう。

今回は、無難にApacheおよびNginx用の証明書を発行させてみる。 OSはCentOS 7を利用する。 なお、Apache/NginxどちらもWebサーバとしての設定(パッケージのインストールやVirtualHostの設定など)はすでに完了しているものとし、詳細な設定については各自の環境に合わせるものとする。 Let's Encryptの仕組みについては、こちらを参照するとよいだろう。

1.Let's Encryptのインストール

まず、以下のコマンドでgit等必要なコマンドを導入する。

yum install -y git openssl mod_ssl

次に、以下のコマンドでLet's Encryptのダウンロードを行う。

git clone https://github.com/letsencrypt/letsencrypt.git
cd letsencrypt

証明書の取得には、「certbot-auto」というコマンドを利用する。 ここでポイントなのが、Let's Encryptでは証明書の取得にWebサーバ(80番ポート)が必要になる。 つまり、ApacheなどのWebサーバなどで既に80番ポートを使っている場合の挙動が問題になる。 で、「certbot-auto」コマンドでは証明書の取得・更新時におけるWebサーバの扱いについて、以下のオプションがある。 (certbot-autoの細かいオプションについては、こちらのページが詳しい)

  • --webroot … 既存のWebサーバで使用しているWebRootに一時ファイルを置くことで、新たにWebサーバなどを立ち上げる必要がなくなる(同居させることができる)。
  • --standalone … Let's Encrypt用のスタンドアローンWebサーバが別に立ち上がる。このため、Webサーバなどと同居している場合は証明書更新時にプロセスの停止が必要になるため、サービスダウンが発生する
  • --apache … 証明書を同居しているApacheから取得して設定ファイルの生成をする
  • --nginx … 証明書を同居しているNginxから取得して設定ファイルの生成をする

どちらでWebサーバを構築しているかにもよるが、とりあえず「--webroot」で指定してやればどちらでも利用できるので、今回は「--webroot」オプションを用いる。 以下のコマンドを実行する。

./certbot-auto certonly --webroot -w DocumentRootPath -d ドメイン名 -m メールアドレス --agree-tos

コマンド実行後、「/etc/letsencrypt/live/ドメイン名/」配下に証明書が出力されるようになる。

[root@BS-SAKURA-TEST01 letsencrypt]# ls -1 /etc/letsencrypt/live/XXXX.XXXX.com/
cert.pem
chain.pem
fullchain.pem
privkey.pem

それぞれの内容は以下。

  • /etc/letsencrypt/live/ドメイン名/cert.pem … 証明書
  • /etc/letsencrypt/live/ドメイン名/privkey.pem … 秘密鍵
  • /etc/letsencrypt/live/ドメイン名/chain.pem … 中間CA証明書
  • /etc/letsencrypt/live/ドメイン名/fullchain.pem … 証明書+中間CA証明書

これで証明書の作成は完了。

2.Apacheでの設定および証明書の発行

Apacheで設定する場合は、「/etc/httpd/conf.d/ssl.conf」にて以下の内容を記述し、証明書等を読み込ませる。

/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem

記述後はhttpdを再起動する。

3.Nginxでの設定および証明書の発行

Nginxの場合は、「/etc/nginx/nginx.conf」に以下の設定を記述する。

/etc/nginx/nginx.conf
server {     :     listen 443 default ssl;     ssl on;     ssl_certificate      /etc/letsencrypt/live/ドメイン名/fullchain.pem;     ssl_certificate_key  /etc/letsencrypt/live/ドメイン名/privkey.pem;      : }

設定後、サービスの再起動を行う。

4. 証明書の自動更新設定

Let'sEncryptでは2か月で証明書が切れてしまうので、自動更新の設定をする。 まず、gitでとってきたLet'sEncryptのソース等を移動しておく。

mv ~/letsencrypt/ /usr/local/

次にcrontabに以下の内容を記述することで、毎日朝3時に証明書の更新を行う。

/etc/crontab
00 03 * * * root /usr/local/letsencrypt/certbot-auto renew --force-renew && /bin/systemctl reload httpd

以上。 無料で簡単にSSL証明書の取得、設定ができるので、個人のページとか検証環境にはかなりよさそう。 (業務で使うようなシステムの本番ではさすがにちょっとアレだけど…)


参考