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


## はじめに

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

* [イラスト図解でよくわかる ITインフラの基礎知識]('https://www.amazon.co.jp/dp/4774196002')

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

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

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Let&#39;s Encrypt ACMEv2 implementation now supports wildcard certs. <a href="https://t.co/jPk8DZBr4X">https://t.co/jPk8DZBr4X</a></p>&mdash; Jerry Gamblin (@JGamblin) <a href="https://twitter.com/JGamblin/status/969585640282230784?ref_src=twsrc%5Etfw">March 2, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


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

``` bash
[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

### 必要なものをインストールする
``` bash
[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を落としてくる
``` bash
[root@localhost ~]# git clone https://github.com/certbot/certbot.git
[root@localhost ~]# cd certbot
```

### 適当にvirtualenvする
``` bash
[root@localhost certbot]# virtualenv certbottest
[root@localhost certbot]# source certbottest/bin/activate
```

### certbotコマンドを整える
pip install または、python setup.py installで必要なpythonモジュールを入れます。

```bash 
(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が古いと怒られたら、アップデートしてあげてください。

```bash

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


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


```bash 
(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でサーバを建てて証明書を検証してみました。
<img width="593" alt="スクリーンショット 2018-03-05 12.05.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/104051/aa11cdf1-36f7-011f-3bb4-0db9cc9446b3.png">
確かにワイルドカードで証明書が発行されています。
![スクリーンショット 2018-03-05 12.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/104051/ebe74386-2d33-59da-bccf-5e3fe6aad308.png)

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


<img width="537" alt="スクリーンショット 2018-03-05 12.16.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/104051/8c27aec6-d0be-bbc1-3f69-9a021b94e007.png">
比較のため従来のLet's Encrypt証明書も貼っておきます。


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

```bash

(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.
* @chibiegg 
* @tukejonny 
* @isida