0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ホームサーバーの自己署名証明書を Let’s Encrypt の DNS-01 に変更し、自動配布まで行う

Last updated at Posted at 2025-12-08

こんにちは
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レコードは証明書が取得できたらすぐに削除されます。

image.png

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つを追加します。アクセス権は対象のドメインに限定します。

image.png

上記でAPIキーを発行すれば、ホームサーバー側で証明書の取得が可能になります。

証明書をホームサーバーへ自動配布

ここまで読まれた方は、LANの知識があると思います。
各サーバーでACMEを実行し証明書を取得してもいいのですが、もうひと工夫として、ワイルドカード証明書を取得し、各サーバーへ配布するという構成を紹介します。

利用するのは、OPNsenseです。OPNsenseには、Let's EncryptのACMEと証明書配布のプラグインがあるので、これを利用します。

OPNsense → ACME ClientにLet's Encryptを登録

OPNsenseにACME Clientプラグインをインストールします。
image.png

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

「Challenge Type」でAPIキーを登録します。
image.png

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

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

証明書の配布

取得したワイルドカード証明書を各サーバーに配布します。OPNsenseのACMEにあるAutomationで設定していきます。

配布は、Proxmoxサーバーへの配布を例に実行してみます。
OPNsenseのACMEのAutomationには、ProxmoxVEやProxmoxBackupのAPI経由の機能があるので、こちらを利用します。

image.png

配布にはProxmox側のAPIキーが必要なので、キーを払い出します。SSHの更新など権限が強いので、root@pamでAPIキーを作成します。

<設定例>
・root@pam
・Privilege separation:OFF

image.png

権限は以下の項目が必要なので、カスタムロールを作成しました。
・Sys.modify
・Sys.PowerMgmt
・VM.Audit

image.png

受け取り側の設定ができたら、再度、「証明書」を開き、証明書と配布先を紐づけます。
image.png

これで、配布の準備ができたので、証明書の「Issue」ボタンを押し、証明書を再度取得すると、Automation も起動し、配布まで実行されます。

image.png

配布ができたらブラウザでアクセスしてみる

アクセスはIPではなくドメイン名でする必要があります。
ブラウザが証明書をキャッシュしている場合もあるので、証明書が配布できているのに「保護されていない通信」と出る場合は、ブラウザを閉じたり、別のブラウザで接続したりしてみてください。

image.png

最後に

今回は、たまたま OPNsense があったので、OPNsense の機能を使いましたが、自動配布しなくても、Proxmox には ACME の機能が標準であるので、それを使う方がよいと思います。
OPNsense はネットワーク機器だけあり、機能が充実しているので、ルーターとしてではなく、DNS、DHCPなどのネットワークサービスとして利用するのもアリなのではないかと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?