Let's Encrypt (certbot) を使ってワイルドカード証明書する!(あとちょっと)


はじめに

最近技術書を書いて、沢山の方に読んで頂いていて大変感謝しております。

その書籍の中でも、無料で手軽に使える証明書として紹介したLet's Encrypt (certbot) ですが、唯一ワイルドカード証明書が発行できないという欠点がありました。

しかしながら以前から予告されていたように、先日やっとワイルドカードに対応したというアナウンス

が出ましたので、早速ワイルドカード証明書を取得してみました。
ところがフツーにやろうとするとエラーになになってしまいます。

[root@localhost ~]# certbot certonly --manual -d *.charakoba.com  --preferred-challenges dns-01
Wildcard domains are not supported: *.charakoba.com

半日に及ぶ試行錯誤の結果、無事取得することができたので、その手順をまとめておきます。

結論

  • PyPIのacme,certbotが古い
  • virtualenvして、pip install、python setup.py installする
  • certbotコマンドでワイルドカード証明書が取得できる。(ただしルート証明書のインストールが必要)

Let's Encryptでワイルドカード証明書を取得するまで

検証環境

  • CentOS7.4
  • certbot 0.22.0.dev0

必要なものをインストールする

[root@localhost ~]# yum -y install epel-release git
[root@localhost ~]# yum -y install gcc augeas-libs openssl openssl-devel libffi-devel redhat-rpm-config ca-certificates
[root@localhost ~]# yum -y install --enablerepo=epel python-virtualenv python-tools python-devel

最新版のcertbotを落としてくる

[root@localhost ~]# git clone https://github.com/certbot/certbot.git
[root@localhost ~]# cd certbot

適当にvirtualenvする

[root@localhost certbot]# virtualenv certbottest
[root@localhost certbot]# source certbottest/bin/activate

certbotコマンドを整える

pip install または、python setup.py installで必要なpythonモジュールを入れます。

(certbottest)[root@localhost certbot]# cd ./acme/
(certbottest)[root@localhost acme]# python setup.py install
(certbottest)[root@localhost acme]# cd ../
(certbottest)[root@localhost certbot]# python setup.py install

途中、setuptoolsが古いと怒られたら、アップデートしてあげてください。


(certbottest)[root@localhost certbot]# pip install setuptools --upgrade

証明書発行の準備をする

gitで落としてきたcertbot-auto は、変な場所にvirtualenvしてワイルドカード未対応のモジュールをインストールしようとするので使いません。
以前はwebrootを使っていましたが、ワイルドカードではDNSによる認証しかサポートしないとどっかで聞いたので、--manual--preferred-challenges dns-01 を指定指定してます。
また、デフォルトではAPIサーバのURLが古いので、公式ドキュメントを参考に、ACME2のステージングのサーバURLを指定してみました。

(certbottest)[root@localhost certbot]# certbot certonly --manual -d *.<ドメイン> -m <メールアドレス> --agree-tos \ 
--manual-public-ip-logging-ok --preferred-challenges dns-01 \ 
--server https://acme-staging-v02.api.letsencrypt.org/directory

3/5昼追記:
ステージングサーバを利用して発行された証明書では Fake LE Root X1というルート証明書のインストールが必要でした。(https://letsencrypt.org/docs/staging-environment/)
やはりACMEv2本番サーバが公開されるまで待つ必要があるようです。
(その頃にはcertbotが対応してそう)

TXTレコードで認証する

うまくいくと以下の用にトークンが表示されますので、DNSサーバにTXTレコードを追加してください。

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

rl7Tm_n2QmwIQ7Lr7vrdQrI03pLK4vfBdhsnLs5C4x8

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------

証明書が発行される

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/charakoba.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/charakoba.com/privkey.pem
   Your cert will expire on 2018-06-02. 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でサーバを建てて証明書を検証してみました。


確かにワイルドカードで証明書が発行されています。

ただし、まだ正式な証明書ではないので、警告が表示されてしまいました。


比較のため従来のLet's Encrypt証明書も貼っておきます。

おまけ

GehirnDNSにAPIでTXTレコードを追加する

APIも充実しておりGehirnDNSを愛用しているので、GehirnDNSにTXTレコードを追加する手順も書いておきます。


(certbottest)[root@localhost certbot]# curl --user <Token>:<Secret>  --request POST \
 https://api.gis.gehirn.jp/dns/v1/zones/<ZoneID>/versions/<VersionID>/records \
 --data '{"name":"_acme-challenge","type":"TXT","ttl":30,"enable_alias":false,"records":[{"data”:”<TXTRecord>"}]}'

最後に

証明書の検証が足りてなくてすみませんでした!
疲れました。
本買ってください!!!!

Special thx.