はじめに
最近技術書を書いて、沢山の方に読んで頂いていて大変感謝しております。
その書籍の中でも、無料で手軽に使える証明書として紹介したLet's Encrypt (certbot) ですが、唯一ワイルドカード証明書が発行できないという欠点がありました。
しかしながら以前から予告されていたように、先日やっとワイルドカードに対応したというアナウンス
Let's Encrypt ACMEv2 implementation now supports wildcard certs. https://t.co/jPk8DZBr4X
— Jerry Gamblin (@JGamblin) March 2, 2018
が出ましたので、早速ワイルドカード証明書を取得してみました。
ところがフツーにやろうとするとエラーになになってしまいます。
[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でサーバを建てて証明書を検証してみました。
確かにワイルドカードで証明書が発行されています。 ![スクリーンショット 2018-03-05 12.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/104051/ebe74386-2d33-59da-bccf-5e3fe6aad308.png)ただし、まだ正式な証明書ではないので、警告が表示されてしまいました。
比較のため従来の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>"}]}'
最後に
証明書の検証が足りてなくてすみませんでした!
疲れました。
本買ってください!!!!