Let's Encrypt でワイルドカード対応のSSL証明書を取得するための手順

公開日:2019/08/29 更新日:2019/08/29
Let's Encrypt でワイルドカード対応のSSL証明書を取得するための手順のサムネイル

certimage.jpg Photo by Robert Anasch on Unsplash

はじめに

VPSでWebサイトを動かして取得した独自ドメインに対してLet's Encryptの証明書を設定する機会があったのでその手順をまとめます。サブドメインにも対応するためにワイルドカードでのSSL証明書も取得しました。ワイルドカード対応でも無料です。

前提と環境

私の環境としては、さくらVPSのUbuntu + Nginxで動作させるWebサイトでした。ただ、ワイルドカード対応のSSL証明書を取得するのに必要な手順自体は、OSやWebサーバアプリによらないのでその他の場合でも同様になると思います。ただ、取得したワイルドカード対応の証明書をWebサーバに設定する手順は、Nginxのものになります。

  • VPSのOS : Ubuntu18.04
  • Webサーバ : Nginx
  • 独自ドメインは取得済とし、VPSですでに使用できる状態とする。この記事では、例として独自ドメインをexample.comとして説明します。

なお、Let's Encryptについては、さくらインターネットの以下の記事が参考になりました。

ssl.sakura.ad.jp

レンタルサーバーの標準機能と言っても過言ではないほど、近年急速に無料SSL機能が普及してきました。実はレンタルサーバーを提供している会社側がSSL証明書を無償提供しているだけで、利用しているSSL証明書や認証局は様々であり、当然コストが発生している可能性もあります。今回はその中でも最も有名なLet’s Encryptについてご紹介します。

作業の流れ

作業としては、VPS側での作業と、取得した独自ドメインのDNS管理サービス側での作業があります。私はムームードメインで取得した独自ドメインをさくらVPSで使用しており、さくらインターネットのDNSサーバを使用しています。

  • certbotを導入する(VPS側)
  • certbotでSSL証明書を取得する(VPS側)
  • 所有者確認のためにDNSレコードを追加する(DNS管理サービス側、1回目)
  • 追加したDNSレコードを確認する(VPS側、1回目)
  • 所有者確認のためにDNSレコードを追加する(DNS管理サービス側、2回目)
  • 追加したDNSレコードを確認して完了(VPS側)
上記だけを見ると作業が多そうに見えますが、実際の作業自体は全く大変ではないです。

以下のサイト様が参考になりました。

knowledge.sakura.ad.jp

VPSによるWebサーバー運用講座の連載2回目です。 今回は、安全にsshのログインを行うため「公開鍵認証(こうかいかぎにんしょう」の設定をします。 公開鍵認証は、そのメカニズムが複雑なため、設定する段階で挫折してしまう方が多いようです。ここでは理論はとりあえず置いといて、設定ができることに重点をおき説明します。今まで公開鍵認証の設定で苦労した方にご一読いた……

certbotを導入する(VPS側)

まずはじめにVPSのUbuntuにcertbotを導入します。certbotは、SSL証明書を管理するためのツールです。certbotは、アメリカの電子フロンティア財団(Electronic Frontier Foundation, 略してEFF)という非営利組織が管理しています。以下が公式サイトです。

certbot.eff.org

certbot

certbotの公式サイトにも掲載されていますが、Ubuntuへの導入手順は簡単です。以下のコマンドを順番に実行し、certbotと必要な関連パッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-nginx 

以上でcertbotの導入は完了です。 なお、certbotの公式サイトには、その他のOSにおけるcertbotのインストール手順、さらにNginxやApacheなどのWebサーバそれぞれの設定方法も記載されています。

certbotでSSL証明書を取得する(VPS側)

certbotのインストールが完了したら、後は以下のコマンドを実行してワイルドカード対応の証明書を取得します。

$ sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m youremail@example.com \
    -d example.com \
    -d *.example.com

上記の各オプションの説明は以下です。

オプション名 説明
certonly 証明書の取得のみを行い、インストールはしない
--manual 手動で証明証の取得作業を実施するために指定。
--preferred-challenges dns-01 独自ドメインの所有者確認を指定する。dns-01を指定することで、DNSサーバにcertbotに指示された値を設定して確認を実施。これは後述。
--server 証明書発行を処理するサーバーの指定。
-m youremail@example.com Let's Encrypt の使用者として登録する自身のメールアドレス。Gmailなどでも指定できますが、気になる方は独自ドメインのEmailを指定してもいいかもしれません。
-d *.example.com ワイルドカード対応の独自ドメインを指定して、これに対するSSL証明書を取得する。

ACMEについては以下の記事が参考になりました。

eng-blog.iij.ad.jp

2018年7月はWeb業界にとって記憶に残る日になるでしょう。httpsが標準となった日として。 これまでWebサイトへのアクセスにはhttpを利用するのが通常...

上記コマンドを実行するといくつか質問が表示されます。まずはじめに、以下のように利用規約に同意するか確認されます。メッセージ内のリンク先にあるPDFを確認の上、問題なければAを入力してEnterを押下します。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

続いて、Let's EncryptのパートナーであるEFFとあなたのメールアドレスを共有して良いか?と確認されます。YとしてOKすると、EFFからEFFの活動についてメールが届くようになります。ここではNとしました。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

次に、このコマンドを実行しているサーバーのIPアドレスをログし、SSL証明書を要求したIPとして公開状態とするが良いか?と確認されます。ここではYにして同意しないとこれ以上進めることはできません。いずれにせよ、元々このサーバはWebサイト用に使用するためYとして進めます。もし、実際に本番用に使うサーバでなければ、本番用サーバでやり直すのがいいかもしれません。

Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.com
dns-01 challenge for example.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

上記でYとして進めると、以下のようにDNSレコードとして設定する文字列が表示されて待機状態になります。

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

KiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAI

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

上記の状態になったら、上記内の以下の値をメモしておきます。なお、example.comは各自の独自ドメインになっていると思います。

  • _acme-challenge.example.com
  • KiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAI

メモしたら、上記はそのまま置いておいて、DNS管理サービス側でDNSレコードとして登録する作業になります。

所有者確認のためにDNSレコードを追加する(DNS管理サービス側、1回目)

certbotが表示した情報をDNSレコードとして登録する手順を説明します。ここでは、さくらVPSで独自ドメインを使用している場合の手順を説明しますが、その他のサービスを使用していても、やること自体は決まっているので各自置き換えてください。 さくらVPSを使用している場合は、以下のようにさくらVPSのダッシュボードから、左側メニューにある「ネームサーバ登録」をクリックします。

0-click-nameserver-register.png

「ネームサーバ登録」をクリックすると、以下のように「ドメインリスト」というメニューがあるのでこれをクリックします。

click-domain-list.png

続いて以下のように、取得済のドメイン一覧が表示されるので、certbotでSSL証明書を設定しようとしている独自ドメインの「ゾーン編集」をクリックします。

manage-zone.png

「ゾーン編集」をクリックすると、以下のように独自ドメインのDNSレコード情報が表示されます。ここで、赤線枠内にあるように「変更」をクリックします。

click-change.png

「変更」をクリックすると、以下のように「エントリの追加と変更」というフォームが表示されるので、ここで先程メモした情報を入力します。

save-challenge-txt-record.png

具体的には、以下のようになります。

項目名 説明
エントリ名 _acme-challengeを入力。_acme-challengeの後には各自の独自ドメインが表示されていると思います。
種別 「テキスト(TXT)」を選択
certbotが表示したKiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAIを入力
DNSチェック 「する」のままでOK
TTLの指定 そのままチェックしない状態でOK

上記を入力したら、「新規登録」をクリックし、さらに左側にある「データ送信」をクリックします。

save-and-send-txt-record.png

以上でDNSレコードの追加が完了です。後ほど全く同じ作業をもう一度行う必要があります。 ここで、自分のパソコンなどのターミナルから、digコマンドを使用して追加したDNSレコードが反映されたかを確認します。example.comは各自の独自ドメインに、your.dns.ne.jpは各自が使用しているDNSサーバのドメインに置き換えてください。例えばさくらインターネットならば、ns1.dns.ne.jpなどがDNSサーバのドメインです。

$ dig -t txt @your.dns.ne.jp _acme-challenge.example.com +short
"KiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAI"

上記のdigコマンドの実行結果として、先程DNSレコードに登録した値が表示されていれば反映されています。これでVPS側の作業に戻れます。もしDNSレコードに登録した値が表示されない場合は、しばらく待機します。私の場合も反映されるまでに15分ほどかかりました。

追加したDNSレコードを確認する(VPS側、1回目)

DNSレコードを追加したら、VPSに戻り以下の状態で止めていたところでEnterを押下すれば完了です。ただし、DNSレコードを追加してから反映されるまでに少々時間がかかります。そしてこの反映前にEnterを押下しても失敗するため、反映されるまで待機する必要があります。反映されたかどうかは、前述したdigコマンドを使用して確認できます。

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

KiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAI

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

上記でEnterを押下して進めると、また違う値で同じ作業をするよう要求されますので、改めてDNS管理サービス側(ここでは、さくらインターネット)で1回目と同じ作業をします。

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

Skiskeije8-AsiejN8-skKsoNeuNntONRwW9ko31KAI

Before continuing, verify the record is deployed.
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

所有者確認のためにDNSレコードを追加する(DNS管理サービス側、2回目)

1回目と全く同じ作業を実施して、DNSレコードにcertbotが指示した値を登録します。なお、1回目で登録した値は削除したり2回目の値で置き換えずににそのまま残し、新しい値として登録します。 すなわち、最終的に以下のようになります。

second-dns-txt-added.png

2個めの登録が完了したら、digコマンドで反映されたことを確認できるまで少々待機します。

$ dig -t txt @your.dns.ne.jp _acme-challenge.example.com +short
"KiejN-Skifje8-slejntONRwW9ko3ijJAopoie21KAI"
"Skiskeije8-AsiejN8-skKsoNeuNntONRwW9ko31KAI"

反映が確認できたらDNS管理サービス側での作業は全て完了です。

追加したDNSレコードを確認して完了(VPS側)

VPS側に戻って改めてEnterを押下して成功すると、以下のように表示されて無事に証明書を取得できます。

Waiting for verification...
Cleaning up challenges

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

上記の中で、以下の2つのパスを各自が使用しているNginxやApacheに必要な設定を行います。

  • /etc/letsencrypt/live/example.com/fullchain.pem
  • /etc/letsencrypt/live/example.com/privkey.pem

Nginxに取得したSSL証明書を設定する

例えばですが、以下が最低限のNginxの設定になります。

/etc/nginx/conf.d/example.com.conf
server {
  listen 443 ssl;
  server_name  *.example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

(...省略...)

}

もし、UbuntuやDebianのデフォルトのNginxパッケージからインストールしている場合は、conf.dというディレクトリはなく、代わりにsites-avilableなどがあると思いますので、そちらで設定を修正してください。

まとめ

Let's Encryptは無料でワイルドカード対応の証明書までも使えるのでとても便利です。とりあえずSSL化した場合にはおすすめです。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。