無料でSSL証明書が発行できる Let’s Encrypt を使ってみました。
その時の操作手順を紹介します。
本記事執筆時に存在していた「Let’s Encrypt 総合ポータル (https://letsencrypt.jp/)」は既に閉鎖しています。
目次
Let’s Encrypt について
- 無料でSSLサーバー証明書が取得できる認証局(CA)です。
- ドメイン認証(DV : Domain Validation)証明書しか生成できません。
- 公式サイト
参考
- Let’s Encrypt の概要 – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/about/)
前提
example.com
とwww.example.com
のSSLサーバー証明書を生成すると仮定します。- 別の業者から導入した SSLサーバー証明書が既に設定されていると仮定します。
環境その1
- CentOS 6
- Nginx 1.10
Certbot クライアントのインストール
(1) ウェブサーバーにログインします。
今回は、Windows 10 上の MSYS2ターミナルから、目的のウェブサーバー(OS は CentOS 6)に ssh接続しました。一般ユーザーで作業します。
(2) Certbot クライアントのインストール – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/usage/install-certbot.html) に書いてある通りに進めます。
まず、以下のコマンドで EPEL (Extra Packages for Enterprise Linux) リポジトリを導入する必要があるのですが、今回の環境では既に導入済みでしたのでスキップしました。
※ /etc/yum.repos.d/epel.repo
ファイル内の [epel]
のセクションで、enabled=1
と設定してありましたので有効になっています。
$ sudo yum install epel-release
(3) Certbot クライアントをダウンロード・インストールするために、以下のコマンドを入力して実行します。
# 作業用のディレクトリを作成して、そこに移動します。
$ mkdir -p ~/work/certbot
$ cd ~/work/certbot
# certbot コマンドとなるスクリプトファイルをダウンロードします。
$ wget https://dl.eff.org/certbot-auto
# このファイルに実行権限を与えます。
$ chmod a+x certbot-auto
# 実行します。
$ ./certbot-auto
(省略)
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to laboradian@gmail.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- いろいろ yum のパッケージがインストールされました。特に python関連が多いようでした。
- certbot-auto ファイルはシェルスクリプトでした。
- 途中でドメイン名(SSL証明書を作成するドメイン)を聞いてきましたので入力しました。
- 途中でメールアドレスを聞いてきましたので入力しました。
表示されたメッセージの中に、今すぐ /etc/letsencrypt
のバックアップをとるようにとありますので、cp
コマンドでコピーをとっておきましょう。このディレクトリ内には秘密鍵も入っていますので、外部に漏れてはいけません。また、定期的なバックアップも推奨されています。
SSL/TLS サーバ証明書の取得
ここで行われる処理の中で ドメイン使用権者の認証が行われるのですが、この認証方法にはいろいろな方法があり、それぞれプラグインになっているようです。Nginx 用もありますが、今回はなるべくシンプルな方法でやってみたかったため、Standaloneプラグインを使います(certbot-auto
コマンドの --standalone
オプションを指定します)。
# Standaloneプラグインの場合、ドメイン使用権者の認証処理で ポート 80 もしくは 443 が使われるため、nginxを止めます。
$ sudo service nginx stop
# ドメイン使用権者の認証が行われ、続けて SSL/TLS サーバ証明書が取得されます。
$ sudo ./certbot-auto certonly --standalone -d example.com -d www.example.com
(省略)
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-01-30. 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
- 上にも少し書きましたが、Standaloneプラグインの場合、ポート 80 もしくは 443 を使って独自のウェブサーバーが一時的に起動され、外部からこのポートに通信することによって、ドメイン使用権者の認証を行うようです。
- Let’s Encrypt のドメイン認証(DV : Domain Validation)証明書の有効期間は3ヶ月です。
この時点で既に SSLサーバー証明書などが生成されています。
Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/usage/#SaveCertificate) の一番下あたりに、どこにどんなファイルが生成されているかの説明があります。Apache や Nginx のバージョン毎にどのファイルが必要なのかも説明されており非常に親切です。
簡単に引用させて頂くと以下になります。
サーバ証明書(公開鍵)
- /etc/letsencrypt/archive/ドメイン名/certN.pem
中間証明書
- /etc/letsencrypt/archive/ドメイン名/chainN.pem
サーバ証明書と中間証明書が結合されたファイル
- /etc/letsencrypt/archive/ドメイン名/fullchainN.pem
秘密鍵
- /etc/letsencrypt/archive/ドメイン名/privkeyN.pem
(Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル(https://letsencrypt.jp/usage/#SaveCertificate) から抜粋)
ドメイン名 は、設定したドメイン名を指していまして、N というのは証明書が更新される度に 1ずつ増える整数です(1から始まります)。詳細は、Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/usage/#SaveCertificate) を参照して下さい。
そして、これらのファイルはシンボリックリンクになっていまして、ウェブサーバーの設定ファイル内に記述するのは以下のパスになります。そうすることによって、Nの数が増えていっても、設定ファイルを書き換える必要がなくなります。
サーバ証明書(公開鍵)
- /etc/letsencrypt/live/ドメイン名/cert.pem
中間証明書
- /etc/letsencrypt/live/ドメイン名/chain.pem
サーバ証明書と中間証明書が結合されたファイル
- /etc/letsencrypt/live/ドメイン名/fullchain.pem
秘密鍵
- /etc/letsencrypt/live/ドメイン名/privkey.pem
(Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル(https://letsencrypt.jp/usage/#SaveCertificate) から抜粋)
例えば「サーバ証明書と中間証明書が結合されたファイル」の中身を確認するには以下のコマンドを実行します。
$ sudo openssl x509 -text -noout -in /etc/letsencrypt/archive/example.com/fullchainN.pem
Nginxの設定ファイルを書き換える
CentOS 6 上の yum コマンドから nginx を導入している場合は、/etc/nginx/conf.d/
以下に 設定ファイルがあると思います(拡張子が .conf
となっているファイルです)。
今回は別の業者から導入した SSLサーバー証明書が既に設定されていると仮定していますので、ファイル内の ssl_certificate
と ssl_certificate_key
を書き換えるだけです。
以下のような記述になると思います。
...
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
...
あとは、Nginx を起動します。
$ sudo service nginx start
設定後
念のため、SSL Server Test (Powered by Qualys SSL Labs) などで SSLの設定をテストしておきましょう。
環境その2
- CentOS 7
- Apache 2.4
「環境その1」と手順はほとんど同じです。
Certbot クライアントのインストール
(1) ウェブサーバーにログインします。
今回は、Windows 10 上の MSYS2ターミナルから、目的のウェブサーバー(OS は CentOS 6)に ssh接続しました。一般ユーザーで作業します。
(2) Certbot クライアントのインストール – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/usage/install-certbot.html) に書いてある通りに進めます。
こちらの環境でも、既に EPEL (Extra Packages for Enterprise Linux) リポジトリが導入済でしたので、以下のコマンドは実行しませんでした。
$ sudo yum install epel-release
次のコマンドで、certbotパッケージをインストールします。(Apache プラグインは使用しませんので、python-certbot-apache はインストールしません)
$ sudo yum install certbot
これで、certbot
コマンドが使えるようになりました。
SSL/TLS サーバ証明書の取得
こちらも、ドメイン使用権者の認証には、standalone プラグインを使用しますので、あらかじめ Apache は止めておきます。
$ sudo systemctl stop httpd.service
続いて、次のコマンドで ドメイン使用権者の認証と SSL/TLS サーバ証明書の取得を行います。
$ sudo certbot certonly --standalone -d example.com -d www.example.com
(省略)
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-02-07. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you lose your account credentials, you can recover through
e-mails sent to laboradian@gmail.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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
- 途中でメールアドレスを聞いてきましたので入力しました。
- 最初
-d
オプションで指定したい ホスト名を1つ忘れていたため、実はこのコマンドを 2回実行しました。その結果、/etc/letsencrypt/archive/example.com/ 以下の各ファイルの バージョン2版が生成されました(N の部分が 2 になっているファイルが生成されたということです)。
これで、SSLサーバー証明書などが生成されました。
Apacheの設定ファイルを書き換える
CentOS 7 上の yum コマンドから Apache (httpd) を導入している場合は、/etc/httpd/conf.d/
以下に 設定ファイルがあると思います(拡張子が .conf
となっているファイルです)。
今回は、これらのファイル内の <VirtualHost>
ディレクティブに含まれている `SSLCertificateFile
ディレクティブと SSLCertificateKeyFile
ディレクティブを変更しました。
以下のような記述になると思います。
...
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
...
あとは、Apache を起動します。
$ sudo systemctl start httpd.service
設定後
念のため、SSL Server Test (Powered by Qualys SSL Labs) などで SSLの設定をテストしておきましょう。
今後の証明書の更新作業
Let’s Encrypt で生成した SSLサーバー証明書の有効期間は 3ヶ月ですので、その少し前に 更新しなければいけません。cron に certbot renew
コマンドを登録すれば、自動更新できるのですが、今回その設定は行いませんでした。また、3ヶ月後に certbot の復習を兼ねて更新作業をしようと思います。その時には自動更新の設定も行うかもしれません。
感想
はじめて Let’s Encrypt の設定を行いましたが、最初は面倒だなと感じたものの、作業をしているうちにこれはよくできた仕組みであると思えてきました。通常、SSLサーバー証明書を発行したり、更新したりする作業は意外と面倒なのですが、こちらの場合、最初に専用のアプリケーション(certbot)をインストールして、後は簡単なコマンドでいろいろ操作できるのでかなりラクです。更新作業の自動化もできます。
Let’s Encrypt はドメイン認証(DV : Domain Validation)証明書しか対応していません。つまり、高い信用を必要とする企業などではこのレベルの証明書は使わないだろうなということです。しかし、それほど高い信用を必要としないサイトにとってはこれで十分です。現在、「全てのウェブサイトが SSLでないといけない」といった風潮がありますが、SSL証明書の導入の手間を考えると無理があるように感じています。そんな中、このお手軽さでSSL証明書が導入できる Let’s Encrypt は非常に貴重な存在だと思います。
参考
- Let’s Encrypt 総合ポータル (https://letsencrypt.jp/)
- 必読なサイトですが、SSLサーバー証明書やウェブサーバーの設定方法などの知識がないと省略されている手順を自分で補完するのは難しいと思います。
- Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/usage/)
- ユーザーガイド – Let’s Encrypt 総合ポータル (https://letsencrypt.jp/docs/using.html)