ワイルドカードでドメイン認証の設定

こんにちは:upside_down:
DNSチャレンジ[^1]でLet's Encrypt証明書を発行したので、参考にと思い手順を残します。
助けになれば幸いです。
ワイルドカードで証明書を発行すれば
同一階層のサブドメインのみが異なるすべてのサーバーにインストールできます。
_CentOS Stream 8 とnginx1.22.0を使用しています。。_

# EPELリポジトリの取得  

EPELリポジトリインストール[^2]

```
$dnf install epel-release
```


## 設定変更

```
＄vi /etc/yum.repos.d/epel.repo
```

7行目enabled=0に変更

![スクリーンショット 2022-06-28 165412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/de813dd7-b5ea-24a8-8264-591d87ebe6df.png)


## EPELインストール
インストールコマンド
```
＄ dnf --enablerepo=epel install certbot python3-certbot-nginx
```

下記が確認コマンド

```
＄ dnf --enablerepo=epel list certbot python3-certbot-nginx image.png
```

![スクリーンショット 2022-06-28 165533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/ca2509c9-6a05-8a3b-976a-be6b7d0f3745.png)


certbotがインストールされていることがわかります。

## Let's encryptでワイルドカード証明書を作成

```
＄ certbot certonly --manual --preferred-challenges dns-01 -m メールアドレス -d *.FQDN(ドメイン名) 
```
上記のコマンドを打ちます。
※*.はワイルドカード表記[^3]

![スクリーンショット 2022-06-28 170233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/ccd9ce3a-7a13-db15-6be0-ed13956ed273.png)


ここで一旦止まる。

HOST NAMEとTXTレコードをDNSのTXTレコードとして追加する。

### DNS TXTレコードが適用されてるか確認する 

#### Windowsのコマンドプロンプトの場合 
```
nslookup FQDN(ドメイン名)
```
コマンドプロンプトで上記のコマンドを打つとDNSサーバーのIPアドレスがわかります。
```
nslookup -type=TXT _acme-challenge.FQDN(ドメイン名) DNSサーバーのIPアドレス
```
コマンドプロンプトで上記のコマンドを打ちます。

![スクリーンショット 2022-06-28 171012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/456d85fc-cfc8-59d4-48db-438a4d3db884.png)

#### Linux上での場合
CentOSでは、nslookupコマンドが無い場合がありますので、先ずは、nslookupコマンドの有無を確認していきます。

```
which nslookup
```
上記のコマンドを入力し、nslookupコマンドがあるのかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/5e5773b6-7402-2d93-a06c-41fa73114f6f.png)
この様に出力されたらOK！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/776364ca-f94e-7ef9-f60b-78be3ee98dc2.png)
と表示されたら**bind-utilsパッケージ[^4]のインストール**をします。

###### bind-utilsパッケージのインストール方法
```
dnf install bind-utils
```
上記のコマンドを入力してください。その後、以下の様な画面が出て来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/85260d8b-f0bd-f674-10fe-a3f81892f65d.png)

yes か Noを聞かれるため**y**と入力して、エンターを押してください。
そうしたらインストールの完了です。
※念のため`which nslookup`を入力し、インストールされていることを確認してください。

そうしたら、下記のコマンドを入力してください。
**※FQDNドメインにAレコード設定しているサーバー上ではIPアドレスは不要です。** その為、`nslookup FQDN(ドメイン名)`は省略しています。
```
nslookup -type=TXT _acme-challenge.FQDN
```
下記の画像と同じ様になると思います。

![スクリーンショット 2022-06-29 104952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/b6daeb14-e3a8-e150-e483-e18e254ae71f.png)

以上で**DNS TXTレコードが適用されているかの確認が出来ます。**

### 適用確認後

TXTレコードが適用されているのが確認できたらエンターを打ち証明書を取得します。

Successfully の文字が確認できたら成功です!

### おまけ

#### Tera Termの接続やルーターが切れてしまった場合。
このチャレンジは接続が切れても有効なため、同じコマンドを打てば
再度同じTXTレコードで応答するので焦らないでください:upside_down:

#### --dry-runフラグ
Certbot を使用している場合、--dry-run フラグを設定するだけでステージング環境を利用できる。
その他の ACME クライアントを利用している場合は
そのクライアントの設定方法を参照して Let’s Encrypt のステージング環境でテストを必ず行う。
ただし、v2 staging environment には v2 互換の ACME クライアントが必要。

#### レート制限について
ステージング環境でも
本番環境のレート制限の説明に書かれているのと同様のレート制限が適用される。

次のような例外が設けられている。
・登録ドメインごとの証明書は、1週間ごとに 30,000 個まで
・重複する証明書は、1週間ごとに 30,000 個まで
・検証の失敗は、1時間ごとに 60 個まで
・IP アドレスごとのアカウント数は、1つの IP につき、3時間ごとに 50 アカウントまで
・ACME v2 では、New Orders は、1アカウントにつき、3時間ごとに 1,500 new orders まで

### 脚注
[^1]:DNSチャレンジとは証明書取得方法の種類です。他にはHTTP-01チャレンジがあり下記に図で違いを表記します。
DNSチャレンジ
![Qiita載せる用 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/1dec1f22-8b8c-0c25-1dcc-6bb9d164825f.jpeg)
HTTP-01チャレンジ
![Qiita載せる用 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/8033cc48-98f9-cee5-b01d-fb84ea6b369f.jpeg)
※今回DNSチャレンジを選んだ理由はHTTP-01チャレンジだとワイルドカード証明書が発行出来ないからです。

[^2]:EPELリポジトリとは
CentOS 標準のリポジトリでは提供されていないパッケージを
yum コマンドでインストールすることを可能にするリポジトリ。
今回はCentOS 8 Streamを使用しているのでdnfを使用しています。
[^3]:ワイルドカードとは
ワイルドカード証明書は「www.example.jp」「for.example.jp」「bar.example.jp」のように
アスタリスクと同一階層のサブドメインのみが異なるすべてのサーバーにインストールできます。

[^4]:bind-utilsパッケージとは
`nslookup`や`dig`といった、DNS情報の取得などのDNSに関係する作業を行うコマンドが一纏まりになったモノ。このパッケージが無いと、上記のコマンドが使えない。