Let's Encryptの無料SSL/TLSサーバ証明書について
Les't Encryptは簡単にいうと「全てのWEB通信を暗号化すること」を目的に設立されたプロジェクトで、この目的を達成するために通常であれば多額の出費が必要となるサーバ証明書を無料で発行してくれます。
無料のサーバ証明書と言えばちょっと前までは自己署名証明書(所謂オレオレ証明書)がほとんどであったと思いますが、Let's Encryptの無料証明書が大きく異なるのは「普及している大半のWEBブラウザで信頼済みとして扱われる」という点。(アメリカの大手認証局(IdenTrust社)のルート証明書によってクロス署名されているため、IdenTrustの証明書を信頼しているほぼ全てのプラットフォームで使用できる)
この無料サーバ証明書を信頼済みとして扱ってくれるWEBブラウザの一例を挙げると
- マイクロソフトのIE(6以上)とEdge(Windows10)
- Google Chrome(Windows XP SP3 以上※1、Server 2003 SP2 以上※2、OS X 10.4 以上、Linux、Android 2.3.6 以上、iOS 3.1 以上)
- Mozilla Firefox 2.0 以上 (Windows、OS X、Linux、Android、iOS、Firefox OS)
- Apple Safari 4.0 以上 (OS X 10.4 以上、iOS 3.1 以上)
- Android ブラウザ (Android 2.3.6 以上)
など、一般の方が使用するであろうブラウザは大抵カバーされているようです。
今までその費用故に腰が引けていた分野ですが、セキュリティ向上のためにようやくSSL/TSLによる通信を導入することにします。
以下、Apache2がインストール及び設定済みでWEB上にディレクトリが公開されていることを前提とします。
UbuntuにLet's EncryptのSSL/TSLサーバ証明書を取得する
事前準備としてまずはcertbotなるツールをインストール
Ubuntuでは最初からLet's Encryptのサーバ証明書を利用することを見込んでいるのか、証明書をインストール・管理するためのツールがご丁寧に用意されています。これを使わない手はないのでまずはそのツールをインストールします。
# apt install certbot
certbotを使ってSSL/TLSサーバ証明書を取得する
以下、certbotの簡単な備忘録。
基本的なコマンド構文
/var/www/htmlをルートディレクトリに持つhoge.example.comというドメインに対してサーバ証明書を取得するにはコマンドラインで
certbot certonly --webroot -w /var/www/html -d hoge.example.com
と入力します。
※certonlyはサブコマンドのひとつで、証明書の取得のみ行います。ちなみに何も書かない場合はデフォルトのrunで動作し、証明書の取得と同時にサーバソフトウェアへのインストールまで行います。今回は証明書の発行のみ行うこととします。
--webrootオプションはサーバを動かしたままの状態で証明書を取得するための、-wオプションはルートディレクトリを指定するための、-dオプションはフルドメインを指定するためのものとなります。
一つのディレクトリで複数のドメインを運用している場合は
certbot certonly --webroot -w /var/www/html -d hoge.example.com -d hogehoge.example.com -d …
というように-dオプション以下を繰り返すことで複数ドメインに対応したサーバ証明書を1枚で済ませることができます。
異なるルートディレクトリを持つドメインに対しては別のサーバ証明書が必要となります。
certbotコマンドの実行と結果
以下のとおり作業を進めていきます。
# certbot certonly --webroot -w /var/www/html -d hoge.example.com Enter email address (used for urgent notices and lost key recovery) ↑使用可能なメールアドレスの入力と利用条件への同意を求められます webmaster@example.com ↑使用可能なメールアドレスを入力 < OK > <Cancel> ↑OKを押す Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory <Agree > <Cancel> ↑Agreeを押す IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/srv.world/fullchain.pem. Your cert will expire on 2018-07-27. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - If you like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
この結果、/etc/letsencrypt/live/hoge.example.com/以下に証明書が配置されます。作成されるファイルは
- cert.pem…公開鍵を含むSSLサーバ証明書
- chain.pem…中間証明書
- fullchain.pem…cert.pemとchain.pemが結合されたファイル
- privkey.pem…公開鍵に対応する秘密鍵
の4種類で、のちのちSSL/TLSを有効化する際に必要となります。
Let's Encryptサーバ証明書の有効期限と更新
Let's Encryptより発行されるサーバ証明書の有効期間は90日間となっており、約3ヶ月毎に更新を行う必要があります。期限が近づくとLet's Encryptよりメールでお知らせしてくれるそうで、更新は以下のコマンドにて実行します。
# certbot renew
これだけで有効期間が30日未満の証明書全てを更新してくれます。また
# certbot renew --force-renewal
と「--force-renewal」オプションを加えると有効期間に関わらず証明書の更新ができます。
ただしLet's Encryptのサーバ証明書は一定期間での取得枚数に制限があるそうなので「更新が面倒だから毎日スクリプト回して更新しとこう」というような使い方は止めた方がよさそうです。
スクリプトを使ったLet's Encryptサーバ証明書の更新については後日改めて…
まとめ
無料で使えてしかも各種WEBブラウザからも信頼済みとして扱われるLet's EncryptのSSL/TSLサーバ証明書。今回は概要と取得方法及びその更新方法までまとめました。
- Let's Encryptは全WEB通信の暗号化を目標としたプロジェクトの名称で無料のSSL/TSLサーバ証明書を発行してくれる
- 大手認証局のクロス証明がなされており、ほとんどのプラットフォームで信頼済みとして扱われる
- インストール・更新など証明書の管理を行うためにcertbotが提供されている
- certbot certonly --webroot -w ディレクトリ名 -d ドメイン名でサーバ証明書他必要なファイルが/etc/letsencrypt/live/ドメイン名以下に作成・ダウンロードされる
- 入手した各ファイルを基にWEBサーバ側で設定を施すことでSSL/TSL通信が可能となる
- 証明書の有効期限は90日間。随時更新が必要で「certbot renew」コマンドにて実行。
大まかにまとめると以上のとおりとなります。
続いては入手したSSL/TSL証明書を使ってWEBサーバの通信を暗号化(=HTTPSの導入)と証明書の更新の自動化を行いたいと思います。