□Let’s Encryptでワイルドカードを使う方法(ベースドメインもひとつの証明書にまとめる)

★2018.07.13 追記★

さらにMyDNS.JPにAPIを用意して、–manual-****-hook オプションに対応するスクリプトを公開しました。

https://github.com/disco-v8/DirectEdit

詳しくは上記のREADMEを読んでください。

当初ここ(下記)に書いたような手動でTXTレコードをいじる方法では、サーバー証明書の自動更新が著しくめんどくさーです。

★追記終わり★

MyDNS.JPではだいぶ前から「*」(.ドメイン名)というワイルドカードをホスト名として設定することはできてました。
で、無料でサーバー証明書を発行してくれるLet’s Encryptが今年から「ワイルドカードのサーバー証明書」を発行してくれるようになったので、こりゃさっそく使いたいなぁと思ったのですが…

「ベースドメインと当該ベースドメインに対するワイルドカードの両方を含むオーダー」をしたい場合、今までのMyDNS.JPでは仕様上できませんでした。

理由は簡単で、同じホスト名の同じレコード(例:「_acme-challenge」の「TXT」レコード)は一つしか存在できなかったからでした。

でも、これだと上記のようなベースドメインもひとつの証明書にまとめるということができなかったので、できるようにしました。 🙂

例えば、「*.test0327.pgw.jp」と「test0327.pgw.jp」を一つの証明書として取得してみましょう。

WEBサーバーとcertbotのバージョン0.22以上をインストールして、

http://test0327.pgw.jp
http://www.test0327.pgw.jp
http://second.test0327.pgw.jp

などにアクセスできるようにしておいてから、

/usr/bin/certbot certonly \
--manual --preferred-challenges dns \
-d "test0327.pgw.jp" -d "*.test0327.pgw.jp" \
--agree-tos -m webmaster@test0327.pgw.jp \
--server https://acme-v02.api.letsencrypt.org/directory

とすると、

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

——————————————————————————-
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 EFF and
our work to encrypt the web, protect its users and defend digital rights.
——————————————————————————-
(Y)es/(N)o: Y

となってメールアドレスを登録していいかい?と聞いてくるので「Y」とします。

すると、

Starting new HTTPS connection (1): supporters.eff.org
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for test0327.pgw.jp

——————————————————————————-
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

となってこのマシンのIPアドレスを公開(記録)してもいいかい?と聞いてくるので、こちらも「Y」とします。

すると、まずは一つ目のドメインについてのワンタイムパスワードが

——————————————————————————-
Please deploy a DNS TXT record under the name
_acme-challenge.test0327.pgw.jp with the following value:

EqBjvqDzwzZcCsKnbQeNzLMWExs_654SnZP7Zofwv_g

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

というように出力されます。

で、続いてEnterキーを押すと、二つ目のドメインについてのワンタイムパスワードが

——————————————————————————-
Please deploy a DNS TXT record under the name
_acme-challenge.test0327.pgw.jp with the following value:

_Vqb3tfJ7yZKiU1KRMHMNI2ZrMbeviKSGKylA90HduY

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

というように出力されます。

そしたらMyDNS.JPにて「test0327.pgw.jp」のDOMAIN INFOで、「_acme-challenge」のTXTレコードにこれらの文字列を設定します。

_acme-challenge TXT EqBjvqDzwzZcCsKnbQeNzLMWExs_654SnZP7Zofwv_g
_acme-challenge TXT _Vqb3tfJ7yZKiU1KRMHMNI2ZrMbeviKSGKylA90HduY

以上のように設定したら、

dig _acme-challenge.test0327.pgw.jp TXT

として、設定した文字列を「ANSWER SECTION」で確認します。

;; ANSWER SECTION:
_acme-challenge.test0327.pgw.jp. 300 IN TXT “_Vqb3tfJ7yZKiU1KRMHMNI2ZrMbeviKSGKylA90HduY”
_acme-challenge.test0327.pgw.jp. 300 IN TXT “EqBjvqDzwzZcCsKnbQeNzLMWExs_654SnZP7Zofwv_g”

というように確認できるようになったら、改めてEnterキーを押すと、

Waiting for verification…
Cleaning up challenges

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/test0327.pgw.jp/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/test0327.pgw.jp/privkey.pem
Your cert will expire on 2018-06-25. 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

– We were unable to subscribe you the EFF mailing list because your
e-mail address appears to be invalid. You can try again later by
visiting https://act.eff.org.

となって、鍵が取得できたことが分かる。

ls -al /etc/letsencrypt/live/test0327.pgw.jp/

でも取得できたことが確認できる。

そしたら、それぞれのバーチャルホストに取得できた証明書ファイルを記述して、SSL対応にする。

Apacheなら

SSLCertificateFile /etc/letsencrypt/live/test0327.pgw.jp/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test0327.pgw.jp/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/test0327.pgw.jp/fullchain.pem

と書けばOKです。

全部同じファイルでいいので楽ですね。

そしたらApacheをリスタートして、

https://test0327.pgw.jp
https://www.test0327.pgw.jp
https://second.test0327.pgw.jp

にアクセスして証明書を確認してみましょう。

「*.test0327.pgw.jp」と「test0327.pgw.jp」が一つの証明書として扱えています。

ばっちりばっちり。