Windows Server 2025でSMB over QUICを実装してみた(ドメイン環境)01 ～証明書準備編～

[以前の記事](https://qiita.com/hidekko/items/385301500337dbbca498)ではNTLM認証だったので、今回はドメイン認証で構築します。
NTLM認証はエンタープライズ環境を前提としておらず、なかばお遊びで作った環境のため証明書は自己証明書でした。
今回はドメイン認証を行うエンタープライズ環境を前提にSMB over QUICを構築しようと思い、正規の証明書を利用して環境を構築します。
しかしながら完全自前(つまり支払いも全部自腹)で環境を準備しているため、正規の証明書は無料のLet’s Encrypt証明書を利用します。
今まで何気に正規の証明書を作成して検証することが少なかったので、今更ながらLet’s Encryptで証明書を作成する方法をまとめました。

# 今更わざわざLet's Encryptを使って証明書を発行する記事を書くのはなんでなの？
<font color="Red">**Windowsで任意のFQDNをDNS-01と言われるDNSチャレンジ(ドメインのテキストレコードに任意の文字列を入力し、証明書登録者がドメインの正規の保持者であることを認証する方法)が検索しても出てこなかった**</font>(私が見つけられなかっただけかもしれませんが・・・)ので手法をまとめてみます。
Let's Encryptで証明書を発行するツールがWebサイトも含めると複数あり、Linuxを使うとデフォルトでインストールされていたり、WindowsでもIIS環境でそのまま利用できるように自身のFQDNを登録してhttp-01(httpチャレンジ)のディレクトリに自動配置したり、様々な機能を使ったサイトはなんぼでも見つかるのですが、**今回はSMB over QUIC環境を構築するため、インターネットに公開されているWebサイトでの証明書利用ではないのでIISは動いていませんし、http-01での認証を前提とした自動配置の機能も不要です**

**SMB over QUICを構築する際に利用する証明書を考えた場合、<font color="Red">DNS-01で最低限ドメインの保持者が証明書の発行者であることが証明されれば十分</font>です。**
ドメイン保持者の証明のためにインターネット公開されているWebサーバを準備することは管理上無駄であるため不採用としました。

他にもDockerを使ったりWSL使ったりという手法は出てきたのですが、素のWindowsでやってる方法がなかなか見つかりませんでした。
私はDockerに関してはお恥ずかしながら使ったことがなく、WSLは業務で使っていましたが自前のPCでは使っていませんでしたので、一般的なWindows PCを持っていればDockerやWSL、インターネットに公開されているWebサーバなどの事前準備が不要という意味で一番簡単と思われる素のWindows Client OS、今回はWindows 10 Proでやってみました。

また前置きが長くなっちゃいましたね。

# 証明書作成の事前準備
事前準備不要で一番簡単と言いましたが、Let's Encryptで証明書を発行する専用のツール、certbot.exeをインストールする必要があります。
ではさっそく実施してきましょう。
まずはコマンドプロンプトを管理者権限で開き、```winget install certbot```というコマンドを実行します。
一応コピー用に
```certbot_install.bat
winget install certbot
```
この形式で記載しておきます。
これでLet's Encryptの証明書を作成する専用ツール、certbot.exeとその関連ファイルがインストールされます。

# 証明書発行
```certbot.exe```をインストールすると、デフォルトで```C:\Program Files\Certbot\bin```に```certbot.exe```が配置されます。
パスを通すことも考えたのですが、ごちゃごたしたくなかったのでパスを通さずこのまま使います。
今後も使うのであればこのディレクトリ構造を忘れてしまうと面倒なのでパスを通しておきましょう。
実際にLet's Encryptでエンタープライズユーザーの利用に耐えられる環境を構築するかわかりませんが、仮に構築するのであれば証明書の更新作業が発生しますので、パスを通しておいた方が良いと思います。
```証明書発行_サンプル.bat
cd C:\Program Files\Certbot\bin
certbot.exe certonly -d [FQDN] --manual  --preferred-challenges dns
```
[FQDN]の部分は皆さまの環境に合わせて変更してください。
私が利用するSMB over QUICのファイルサーバのFQDNが```win2k25-03.sh-style.info```なので、実際に実行するコマンドは
```証明書発行.bat
cd C:\Program Files\Certbot\bin
certbot.exe certonly -d win2k25-03.sh-style.info --manual  --preferred-challenges dns
```
となります。

## 簡単にオプションの説明

```certonly```が証明書発行のみというオプションになります。
```-d```は発行する証明書のFQDNの指定です。
```--manual```はドメインの保持者の認証を手動で行う、というオプションになり、次のオプションとセットで利用します。
```--preferred-challenges dns```は先のオプション、```--manual ```と合わせて使うことでDNS-01認証を行う、ということになります。

最終的にはこのオプションが知りたかっただけなんですよね。

# 発行された証明書を取り出す
```C:\Certbot\archive\[FQDN]```というフォルダが自動生成され、ここに```cert1.pem```、```chain1.pem```、```fullchain1.pem```、```privkey1.pem```という4つのファイルが生成されます。
これら4つのファイルを今度はSMB over QUICが動作するWindows Server 2025にインストールできる形式、pfx形式に変換します。

# pfxに変換する
私が調べた限り、Windowsのネイティブの機能では実施できなさそうでした。
```certutil```があるのでこれで変換可能かな？軽く考えていたのですが、```certutil```を使ってpfxからpemへの変換はできても、逆のpemからPFXへの変換はできないようです。
なのでopensslでやります。
opensslのインストールはWindowsにやっても良いんですが、手元にUbuntuサーバがあるのでこれて変換しちゃいます。
Let's Encryptだとこういう手間が発生しますが、エンタープライズ環境だと有料の証明書発行サービスを使うでしょうから、こういう手間は発生しないと思います。(お客様にも依るかもしれませんが・・・)

はい。
またしても前置きが長くなっちゃったのでさっさとコマンド紹介ます。
先のpemファイルのうち、```fullchain1.pem```、```privkey1.pem```の2つのファイルをUnbutuの任意のディレクトリに配置し、以下のコマンドを実行します。
```pfx_exchange_sample.sh
openssl pkcs12 -export -in fullchain1.pem -inkey privkey1.pem -out [pfxのファイル名]
```
[pfxのファイル名]は各自の環境に合わせてください。
私は「名は体を表す」のが好き(単に命名を考えるのが面倒)なので、以下のようにしました。
```pfx_exchange.sh
openssl pkcs12 -export -in fullchain1.pem -inkey privkey1.pem -out win2k25-03.sh-style.info.pfx
```
はい。
わかりやすいですね。

これでpfxファイルに変換できたので事前準備は終わりです。

本日はここまで。