こんにちは
ALJの江口と申します。
最近は、SSLが必須となってきました。サーバーもデフォルトでSSLとなっているケースが多くなってきたと思います。
SSLの設定を外すのも面倒なので、ブラウザの警告画面を突破することが日常になってきています。
今回は、ホームサーバーを例にSSLの警告を出なくする方法として、Let’s Encryptでホームサーバーの証明書を取得するという方法について記載したいと思います。
プライベートIPで証明書エラーを回避するには、自己署名CA証明書をブラウザにインポートする、という方法があります。この方法の欠点は、全デバイスにCA配布必須という点で、それが問題なければ比較的採用しやすいと思います。
上記に比較し、DNS-01(Public CA 方式)は正式な公開 CA の証明書が発行される方法で、自分で Root CA を管理する必要がなく、新しく追加したデバイスでも証明書のインポートの必要がないというメリットがあります。
Public CA 方式をプライベートIPで実現するDNS-01
Let's Encryptは皆さんもよく利用していると思いますが、一般的にドメインの所有の確認に80番ポートのアクセスが利用されていると思います。
ホームサーバーの場合、80番ポートのアクセスができず、Let's Encryptの証明書が取得できないと思われがちですが、DNSのTXTレコードでも証明書が取得できます。それがDNS-01方式と呼ばれるものです。
Let's Encryptの要求に応じ、TXTレコードを更新する必要がありますが、CloudFlareでドメインを管理している場合、CloudFlareのAPIでTXTレコードの更新が可能なため、80番ポートをあける必要がありません。TXTレコードは証明書が取得できたらすぐに削除されます。
DNS-01は、DNSに任意のTXTレコードを書き込めることが必要で、利用しているDNSが自動化(ACME)に対応していることが問題になると思います。
例えば、お名前.com、StarDomain、さくらDNSなどの主要なDNSサービスはACME自動化を提供しているようです。利用されているDNSサーバーでACME自動化が可能か調べてみてください。
自分はCloudFlareを利用しているので、以降はCloudFlareのDNSを利用した設定方法で解説していきます。
DNS-01方式に必要なもの
本記事でDNS-01を構成するために必要な構成は以下の通りです。
| 項目 | 概要 | 本記事の構成 |
|---|---|---|
| ドメイン | 自分のドメインがあること | 所有しているドメイン |
| 外部DNSサービス | ACMEに対応していること | CloudFlare DNS |
| 宅内DNS | サーバーの名前解決に宅内DNSが必要 | OPNsense |
| DHCP | ホームルーターではDHCPでDNSを指定できないのでDHCPも起動 | OPNsense |
| ACME | 自動証明書管理環境(ACME)。SSL/TLSの取得と更新のプロセスを自動化。 | OPNsense |
| 証明書配布 | 各サーバーでACMEを実行せず証明書を各サーバーに配布の構成とした | OPNsense |
ドメインを所有していることが前提になりますが、ドメインを持っていれば外部からの接続などに利用できるので、もし、今回の記事に興味を持ち、ドメインをまだお持ちでないならドメインの取得を検討されてもいいのではと思います。
Cloudflare API Tokenの取得
CloudFlareのダッシュボードにアクセスし、以下に進みます。
「My Profile」 → 「API Tokens」
「トークンを作成する」ー「カスタム トークンを作成する」でカスタムトークンを作成します。
権限には以下の2つを追加します。アクセス権は対象のドメインに限定します。
上記でAPIキーを発行すれば、ホームサーバー側で証明書の取得が可能になります。
証明書をホームサーバーへ自動配布
ここまで読まれた方は、LANの知識があると思います。
各サーバーでACMEを実行し証明書を取得してもいいのですが、もうひと工夫として、ワイルドカード証明書を取得し、各サーバーへ配布するという構成を紹介します。
利用するのは、OPNsenseです。OPNsenseには、Let's EncryptのACMEと証明書配布のプラグインがあるので、これを利用します。
OPNsense → ACME ClientにLet's Encryptを登録
OPNsenseにACME Clientプラグインをインストールします。

ACME Clientがインストールできたら、「アカウント」を登録します。

「証明書」で、アカウントとChallenge Typesを紐づけます。

上記設定ができたら、証明書の右にある「Issue」ボタンを押すと、証明書取得プロセスが走ります。
設定に問題なければ、1分くらいで証明書が取得できます。

証明書の配布
取得したワイルドカード証明書を各サーバーに配布します。OPNsenseのACMEにあるAutomationで設定していきます。
配布は、Proxmoxサーバーへの配布を例に実行してみます。
OPNsenseのACMEのAutomationには、ProxmoxVEやProxmoxBackupのAPI経由の機能があるので、こちらを利用します。
配布にはProxmox側のAPIキーが必要なので、キーを払い出します。SSHの更新など権限が強いので、root@pamでAPIキーを作成します。
<設定例>
・root@pam
・Privilege separation:OFF
権限は以下の項目が必要なので、カスタムロールを作成しました。
・Sys.modify
・Sys.PowerMgmt
・VM.Audit
受け取り側の設定ができたら、再度、「証明書」を開き、証明書と配布先を紐づけます。

これで、配布の準備ができたので、証明書の「Issue」ボタンを押し、証明書を再度取得すると、Automation も起動し、配布まで実行されます。
配布ができたらブラウザでアクセスしてみる
アクセスはIPではなくドメイン名でする必要があります。
ブラウザが証明書をキャッシュしている場合もあるので、証明書が配布できているのに「保護されていない通信」と出る場合は、ブラウザを閉じたり、別のブラウザで接続したりしてみてください。
最後に
今回は、たまたま OPNsense があったので、OPNsense の機能を使いましたが、自動配布しなくても、Proxmox には ACME の機能が標準であるので、それを使う方がよいと思います。
OPNsense はネットワーク機器だけあり、機能が充実しているので、ルーターとしてではなく、DNS、DHCPなどのネットワークサービスとして利用するのもアリなのではないかと思いました。







