※2016/07/20 更新 (letsencrypt-autoコマンドから certbot-autoコマンドに変更)
はじめまして!
開発部でWebプログラマをやっている高田です。
普段は音声配信サービスの開発・運用を行っています。
このブログでは、開発・運用を行う際に、便利だなと思ったことやノウハウを書いて行きたいと思います。よろしくお願いします。
第1回目は、無料でSSL証明書が使える【Let’s Encrypt】についてご紹介します。
Let’s Encryptって?
Webサイトを立ち上げるときに必要となるものの一つに、「SSL証明書」があります。
https://~で始まるURLを持つWebサイトでは、このSSL証明書を用いて通信の暗号化(途中で盗み見られても中身がわからない)や、Webサイト自身の真正性(通信相手は本当にその人?)を確認しています。
これまで、SSL証明書の取得には、
- 証明書発行会社のWebから申し込み
- クレジットカード情報の入力
- CSR(SSL証明書を作るときに必要な申込書データ)の作成と送付
- メールによるドメインの所持確認
- 発行されたSSL証明書のサーバへの設定
- 証明書代金の支払い
といった煩雑で、お金のかかる手続きと作業が必要でした。
これを覆したのが今回ご紹介する【Let’s Encrypt】です。
Let’s Encryptは、Internet Security Research Group (ISRG)という公益法人によって運営されている認証局(SSL証明書を発行管理する人)です。
Let’s Encryptの特徴は、「無料でSSL証明書が発行できる」という点に加え、「自動でSSL証明書を発行できる」という点にあります。
自動で発行できるということは、つまり、先に挙げたような煩雑な手続きをサーバ上のコマンドだけで完結することが出来るのです。画期的ですよね!
Let’s EncryptでSSL証明書を新規取得
ということで、本ブログで使用するSSL証明書をLet’s Encryptで取得してみましたので、さっそくその手順を見ていきましょう。
環境
本ブログの環境は次のようになっています。
- CentOS 6系
- nginx
今回はCentOS 6系での取得を試します。
※ドメインのAレコードの設定は事前に行っておいて下さいね。
必要な準備
次のものをインストールしておきます。
- git
- centos-release-SCL
- python27 (sclから)
sudo yum install git
sudo yum install centos-release-SCL
sudo yum install python27
letsencrypt-autoコマンドの導入
Let’s Encryptは、専用のコマンド「certbot-auto」を用いて証明書の操作を行います。
次の手順で導入をします。
# root権限が必要になるので、python27を有効化してrootシェルを起動する
sudo -s
# ここからroot
# python27を有効化
scl enable python27 bash
mkdir /srv/work
cd /srv/work
git clone https://github.com/certbot/certbot.git
cd certbot
これで、カレントディレクトリに、「certbot-auto」コマンドと、「letsencrypt-auto」コマンドが準備されました!
まずは、「letsencrypt-auto」コマンドを叩いてみましょう。
./letsencrypt-auto # 2016/07/20時点では、 certbot-autoコマンドではパッケージが導入されない?
叩きましたか?
このコマンドは、必要なパッケージを自動的に導入するように作られています。
※letsencrypt-autoコマンドは、古いコマンドになりますので、今後はcertbot-autoコマンドで証明書の発行作業を行うことになります。が、2016/07/20時点では、初期パッケージ導入のために一度letsencrypt-autoコマンドを叩いて下さい。
初回起動時には、yumで必要パッケージが一括してインストールされますので、完了するまで待ちましょう。
SSL証明書の発行
必要なパッケージがインストールされたら、準備は完了です!
それでは実際に証明書を発行してみましょう。
SSL証明書の発行は、次の2通りの方法があります。
- standaloneモード(Webサーバ無しで発行する)
- webrootモード(既に動いているWebサーバを使う)
既に稼働中のWebサーバで発行する場合はwebrootモード、そうでない場合はstandaloneモードを使います。
なお、どちらの場合もLet’s Encrypt側からのドメイン認証のために、サーバの80番ポートに外からアクセスできる必要があります。
もしファイアウォール等でフィルタリングしている場合は、80番ポートへの外からのアクセスを許可をしておいてくださいね。
standaloneモードでの発行
下記のコマンドを実行します。
./certbot-auto certonly --standalone -d {発行したいドメイン} (例:www.example.com)
初めてコマンドを実行する場合は、「緊急時のメールアドレス入力」と「利用規約への同意」ウインドウがコンソール上で開きますので、メールアドレスの入力と規約への同意を行って下さい。
さて、成功した場合には、
/etc/letsencrypt/live/{domain}/fullchain.pem # 証明書
/etc/letsencrypt/live/{domain}/privkey.pem # 鍵
が生成されます。
はい、これでSSL証明書の出来上がりです!
webrootモードでの作成
webrootモードの場合は、既に動作しているWebサーバのroot公開ディレクトリを指定する必要があります。
例えば、 http://example.com/ の公開ディレクトリが /var/www/ の場合は、下記のようなコマンドになります。
./certbot-auto certonly --webroot -w /var/www/ -d example.com
コマンドを実行すると、 /var/www/.well-known/ というディレクトリが作成されます。
Let’s Encryptでは、このディレクトリに作成されたファイルをチェックできたことをもって、ドメイン所有者であることを認証します。
成功した場合は、webrootモードで作成した場合も、standaloneモードと同じディレクトリに証明書/鍵が作成されます。
コマンド一発でどちらの方法でも簡単にSSL証明書が作成できました。
SSL証明書の更新
Let’s Encryptの証明書は、有効期限が90日間となっています。
そのため、通常のSSL証明書よりも頻繁に更新を行うことになります。
でも、安心して下さい。SSL証明書の更新も、とても簡単に行うことが出来ます。
今回は既にWebサーバが稼働していると考え、webrootモードでの更新を行います。
下記のコマンドを実行します。
./certbot-auto certonly --renew-by-default --webroot -w /var/www/ -d example.com
成功すると、発行した時のファイルを上書き更新してくれます。
あとは Webサーバをreloadすれば完了です。
自動的に更新する
簡単に更新できるとはいえ、90日ごとにコマンドを実行するのは面倒ですよね?
ならば自動化しましょう。
cronを使うことで、例えば以下の様な設定で自動化が可能です。
※nginxの場合
10 0 1 * * scl enable python27 'bash -c "cd /srv/work/certbot && ./certbot-auto --renew-by-default certonly --webroot -w /var/www/ -d example.com >> /root/cert-renew.log 2>&1 && /etc/init.d/nginx reload"'
これでSSL証明書の更新し忘れ・・・なんてことからもおさらばです(笑)。
終わりに
ね、簡単でしょ?
ぜひ、みなさんもLet’s EncryptでhttpsなWebサーバを構築してみてください!