nginxにLet's Encryptの証明書を入れる

Let's Encryptを利用することで、nginxにTLS証明書を設定する手順を確認します。作成する証明書は、ワイルドカード証明書となります。

環境情報

試してみる

Let's Encryptの証明書を取得するのに、certbotを利用します。

certbotとは、

Certbot is an easy-to-use automatic client that fetches and deploys SSL/TLS certificates for your web server. Certbot was developed by EFF and others as a client for Let’s Encrypt and was previously known as “the official Let’s Encrypt client” or “the Let’s Encrypt Python client.” Certbot will also work with any other CAs that support the ACME protocol.

らしいです。

公式ドキュメントに記載の通り、とりあえずcertbotをインストールしてみます。

EPELのリポジトリの中にcerbootはあるらしいので、epelのリポジトリをダウンロードしてきます。

$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo rpm -ivh ./epel-release-latest-7.noarch.rpm
$ sudo yum search certbot

yumでインストールできるようなったので、必要パッケージをインストールします。

$ sudo yum -y install certbot python2-certbot-nginx

python2系で動くみたいなので、Pythonのバージョンを確認しておきます。

$ python --version
Python 2.7.14

証明書作成のためのコマンドを実行します。

$ sudo certbot certonly --manual \
> -d *.goodbyegangster.com \
> --preferred-challenges dns \
> --agree-tos \
> -m (メールアドレス)

コマンドで指定したオプションの意味です。

  • certonly --manual
    • ワイルドカード証明書を利用する場合、domain validationが必要となる
    • その場合には、このオプションを付与する必要ありとのこと
      • 証明書の取得のみを手動で行う、というオプション
  • -d (FQDN)
    • 作成したい証明書のFQDNを指定
  • --preferred-challenges dns
    • Verify方法を指定
      • 今回は前述の通り dns
  • --agree-tos
    • terms of service にagreeするよってオプション
    • 指定しない場合、処理の途中で訊かれる
  • -m (メールアドレス)
    • Let's Encryptに登録するメールアドレス
    • 登録は必須

ログがつらつらつらと流れてきて、途中、お前のIPをログっとくけどいいよな、と訊かれるので、Yesと回答します。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for goodbyegangster.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.goodbyegangster.com with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

すると、DNS認証用のTXTレコードが表示されるので、これをDNSサーバに登録します。

登録して、名前解決できることを確認。

$ dig -t txt _acme-challenge.goodbyegangster.com

certbotコマンド実行のプロンプトに戻ってきて、Enterを押すと、Verifyが始まります。成功すると、チェーン証明書と秘密鍵ファイルが作成されます。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/goodbyegangster.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/goodbyegangster.com/privkey.pem
   Your cert will expire on 2019-07-21. 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 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

nginx.confにて、上で作成された証明書と秘密鍵を指定してあげれば、SSLでのWEB通信が可能となります。

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/goodbyegangster.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/goodbyegangster.com/privkey.pem;
}

有効期間は3ヶ月みたいですね。

f:id:goodbyegangster:20190423031406p:plain