神様、仏様、Let's Encrypt様
ほんのつい最近まで、サーバ証明書を取得するというのは、結構金額がかさむものだった。
数人の社員しか使わないような小ぢんまりとしたサーバでも、インターネット側に出したい場合には、暗号化しないわけにもいかず、「何か割に合わんな」と思いながらお金を払っていた。
ちなみにSSL化するのに必要となるサーバ証明書には、大きく次の3種類がある。
- DV : Domain Validated / ドメイン認証型 : 申請者がドメインの持ち主であることを確認
- OV : Organization Validated / 実在証明型 : 申請者の組織が実在することを確認
- EV : Extended Validated / 拡張実在証明型 : 申請者の組織を厳格(?)に確認 (この証明書だとブラウザのアドレス欄が緑になる)
下にいくほど、信頼性が高いとされていて、当然、価格もお高い。
こちらの目的は、通信を暗号化したいだけなので、当然、DVでいいのだが、それでもそれなりの値段するし、更新の度に費用が発生する。さらに、CSR作って送ったりと面倒なことも多くて、サーバ証明書と聞くだけで、イラっとすることが多かった。
そんなちょっとした暗黒の時代が続いていたが、2016年4月12日に、我らが救世主 Let’s Encrypt が正式サービスを開始した。
証明書の種類としては、DVだけであるが、なんとタダでいいというのである。こちとらDVで十分なので、喜ばしいかぎりなのだが、タダでいいとなると、今度は、ちょっと申し訳ない気持ちになってきてしまう。でも、ありがたく使わせていただこうということで、その手順を。
0. 前提
サーバ証明書をインストールしたいサーバにLet’s EncryptのクライアントソフトウェアであるCerbotをダウンロードし、実行する必要がある。
このCerbotがサーバ情報の送信、サーバ証明書の取得、および、サーバ証明書の更新(有効期間90日)を行ってくれる。(CLIベースで実行できるので、cronで自動化できる)
以下手順では、HOMEディレクトリにcerbotディレクトリが展開されることとする。
1. Cerbotのダウンロード
git で clone する。
$ cd
$ git clone https://github.com/certbot/certbot
2. テスト実行
cerbot が機能する環境であるかのチェックする。(内部でyum等のパッケージインストールが実行されるためroot権限のパスワードが要求される)
$ cd cerbot
$ ./cerbot-auto
[sudo] password for your-name:
内部でyum等でパッケージインストールが実行されると言ったが、pythonはじめ、結構な量のパッケージがインストールまたはアップデートされる。
パッケージのバージョンを厳格に管理する必要がある場合は、事前に Let’s Encrypt のサイトで確認したほうがいい。
尚、パッケージをインストールする前に、一応最終確認はしてくる。
尚、こちらで試した環境では、opensslパッケージのバージョンが古く、エラーで停止したのでアップデートがに ./cerbot-auto を再実行した。(環境: CentOS 6.5)
$ sudo yum clean all
$ sudo yum update openssl openssl-devel
パッケージのインストール/アップデートが完了すると、TUIの青い画面で、以下の様に聞いてくる。
ここまででくるとテストの目的は完了したので、<NO>を選択して終了する。
No names were found in your configuration files.
You should specify ServerNames in your config files in order to
allow for accurate installation of your certificate.
If you do use the default vhost, you may specify the name manually.
Would you like to continue?
< Yes > < No >
3. サーバ証明書の取得
CSRの作成等を手動で実行する必要はなく、全て、cerbotがやってくれる。このサーバで利用したいDNS名(以下ではmy-domain.jp)を準備した上で、再びcerbotを実行する。
[重要] 実行プロセスの中で、PORT80のチェックが行われるため、PORT80を使用しているWEBサーバなどがあれば、サービスを停止しておく(下の例では、Nginxが動いている前提で、まずそれを止める)。
$ sudo service nginx stop
$ ./certbot-auto certonly --standalone -d www.my-domain.jp
オプションの
- standalone : サーバ証明書の取得のみを行うという意味
- d : ドメイン名。例の様に複数指定できる。
実行すると、
- またTUIの青い画面になり、今度は、メールアドレスの入力が促される。適切なメールアドレスを入力し、了解を選択する。
- Term of Serviceへの同意が促されるので、Agreeを選択する。
- もし、実行時のコマンドで、-dオプションでドメイン名を指定しなかった場合は、ここでドメイン名の入力を促される。
- もし、PORT80を使用しているサービスが稼働中であったら、その旨が表示され、処理が中止される(サービス停止後に再実行すればよい)。
サーバ証明書の取得が無事成功すると、IMPORTANT NOTES: - Congratulations! …. will expire on 2016-yy-mm … というメッセージが表示され、処理が完了する。
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.my-domain.jp/fullchain.pem. Your
cert will expire on 2016-yy-mm. To obtain a new or tweaked version
of this certificate in the future, simply run certbot-auto again.
To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
yy-mmは、実際には、90日後の日付。「有効期限は、3ヶ月だから、それまでに”cerbot-auto renew”で更新してくださいね!」的なメッセージが表示されている。
取得できたサーバ証明書は、次の場所に保存される。
$ su -
# cd /etc/letsencrypt/www.my-domain.jp
# ls -l
cert1.pem
chain1.pem
fullchain1.pem
privkey1.pem
- cert1.pem : サーバ証明書(公開鍵)
- chain1.pem : 中間証明書
- fullchain1.pem : サーバ証明書と中間証明書の結合ファイル
- privkey1.pem : 秘密鍵
但し、これらは、ファイルの実体で、1となっている数字の部分は、更新する際に変更される。
これらのファイルに対して、各々、次のシンボリックリンクも生成されているので、WEBサーバに設定する際は、こちらを使う。
- /etc/letsencrypt/live/www.my-domain/jp/cert.pem
- /etc/letsencrypt/live/www.my-domain/jp/chain.pem
- /etc/letsencrypt/live/www.my-domain/jp/fullchain.pem
- /etc/letsencrypt/live/www.my-domain/jp/privkey.pem
4. WEBサーバへの設定
WEBサーバによって、設定方法は異なるが、ここでは、Nginxでの設定例 (/etc/nginx/conf.d/my-domain.conf)
server {
listen 443 ssl;
server_name www.my-domain.jp;
root /var/www/html;
access_log /var/log/nginx/ssl_access.log;
error_log /var/log/nginx/ssl_error.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/www.my-domain.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.my-domain.jp/privkey.pem;
}
Nginxの場合、
- ssl_certificate : 3.のサーバ証明書と中間証明書の結合ファイルを指定
- ssl_certificate_key : 4.の秘密鍵を指定
WEBサービスを起動する。
$ sudo service nginx start
ブラウザでhttpsアクセスし、正しく証明書が設定されているかを確認する。
5. サーバ証明書の更新
しつこいようだが、Let’s Encryptのサーバ証明書の有効期間は、90日間。
よって、80日目頃には、サーバ証明書の更新を行う。更新処理は、簡単で、certbot-auto renew を実行するだけ。
ただし、はじめの証明書の取得と同様にWEBサービスは一時的に停止する必要がある。
(WEBサービスを停止せずに証明書を更新する方法もあるが、詳しくは、Let’s Encrypt 参照)
$ sudo service nginx stop
$ cd cerbot
$ ./certbot-auto renew
$ sudo service nginx start