はじめに
ProxmoxのWebUIにアクセスするたびに証明書エラーが出て煩わしいので、Let's Encryptの証明書を利用するようにProxmoxを設定したいと思います。
Proxmox VEはデフォルトで自己署名証明書を使用しているため、ブラウザで管理画面にアクセスする際に証明書の警告が表示されます。本記事では、Let's Encryptから証明書を自動で取得し、Proxmox VEのWebUIに適用する方法を解説します。
前提条件
pve01.home.example.comをProxmoxのホスト名として設定していると仮定して話を進めます。
このとき、以下の条件が必要です。
- 取得した独自ドメイン(
example.com)を使ったホスト名をProxmoxノードに対して設定していることpve01.localやpve01.homeのようなものは使えない
- acme.shに対応したDNSサービス(Cloudflare DNSやAmazon Route 53など)を独自ドメインのパブリックDNSとして利用していること
- ドメインの認証(チャレンジ)の際にDNSレコードを自動で書き換える必要があるため
- Proxmoxの管理画面に
https://pve01.home.example.com:8006の形でアクセスできるようにしていること- ローカルネットワーク用のサブドメインとして
home.example.comを使用している - このときローカルDNS(unbound, dnsmasq, PowerDNS, etc.)などを使ってProxmoxノードのDNSレコードを登録してあり、ローカルネットワーク内でホスト名の名前解決ができていればOK
- ホスト名がグローバルで解決できる必要はない(パブリックDNSへのA/AAAAレコード登録は不要)
- ローカルネットワーク用のサブドメインとして
- Proxmoxノードがインターネットにアクセスできること(Let's EncryptのAPIサーバーにアクセスする必要があるため)
実行環境
- Proxmox VE 8.4.1
- Cloudflare DNS(ドメイン管理)
- Let's Encrypt(SSL証明書発行)
- acme.sh(Proxmoxが内部で証明書取得・更新に使用)
ACMEアカウントの作成
Proxmox VEでLet's Encryptを利用するためのACMEアカウントを作成します。
- Proxmox VEのWebUIにログイン
- Datacenter → ACMEを選択
- Accountsタブの「Add」ボタンをクリック

- アカウント設定を入力:
画像はStaging(テスト用)の証明書を作る場合の設定- Account Name:
default(任意の名前、何も入力しない場合はdefaultになる) - ACME Directory:
Let's Encrypt V2 - Contact: 自分のメールアドレス
- Accept TOS: チェック(規約に同意)
- Account Name:
- 「Register」をクリックしてアカウントを作成
DNSチャレンジプラグインの設定(Cloudflare DNS)
DNS-01チャレンジを使用して証明書を取得するため、DNSチャレンジプラグインを設定します。
ここでは独自ドメインにCloudflareのDNSを利用している前提で進めていきます。他の利用できるDNSサービスについてはacme.shのWikiを参照してください。
Cloudflare APIトークンの取得
チャレンジ用のDNSレコードを自動で作成するために、必要最低限の権限を割り当てた、Cloudflareアカウントに紐づいたAPIトークン(Account-owned Token)を作成します。
- Cloudflare Dashboard → Manage Account → Account API Tokens にアクセス
- 「Create Token」をクリック
- API token templates から「Edit zone DNS」のテンプレートをクリック
- 以下の設定でトークンを作成:
- Token name:
Proxmox ACME(適当に決定) - Permissions:
- Zone > DNS > Edit
- Zone Resources:
- Include > Specific zone >
自分のドメインを指定
- Include > Specific zone >
- Token name:
- 「Continue to summary」→「Create Token」でトークンを生成
- 生成されたトークンをコピーしておく(トークンはここの画面でしか表示されないため、このままページを閉じずに別のタブで次の作業をすることを推奨)
DNS APIプラグインの作成
- Datacenter → ACME タブを選択
- Challenge Pluginsタブの「Add」ボタンをクリック

- プラグイン設定を入力:

- Plugin ID:
cf-dns(任意の名前) - DNS API:
Cloudflare Managed DNS - CF_Token: 先ほど取得したAPIトークン
- CF_Account_ID: アカウントID
- CF_Zone_ID: ゾーンID
- CF_EmailとCF_Keyは設定不要(従来のAPIキー用)
💡アカウントIDとゾーンIDはCloudflare管理画面でゾーン(ドメイン)のOverviewタブから確認可能です。 - Plugin ID:
- 「Add」をクリックしてプラグインを作成
SSL証明書の取得と設定
ドメイン設定の追加
- ノードをサイドバーから選択
- System → Certificates タブを選択
- ACMEタブの「Add」ボタンをクリック

- ドメイン設定を入力:

- Challenge Type: DNS
- Domain:
pve01.home.example.com - Plugin:
cf-dns(先ほど作成したプラグイン)
- 「Create」をクリック
証明書の取得
複数ノードがある場合
Proxmoxクラスター環境の場合、各ノードで「ドメイン設定の追加」以降の手順を実行して、それぞれのノードに証明書を設定します。
自動更新
Let's Encryptで発行した証明書は90日間で有効期限が切れるため、自動更新が必要です。
Proxmox VEには証明書の自動更新機能が組み込まれており、有効期限が30日以内の証明書に対して証明書の再発行が自動実行されます。
証明書の有効期限はWebUIから次の手順で確認できます。
動作確認
証明書が実際に適用されているかブラウザーでアクセスして確認します。
- ブラウザで
https://pve01.home.example.com:8006にアクセス - 証明書エラーが表示されないことを確認
- ブラウザのアドレスバーで鍵アイコンをクリックして証明書情報を確認し、認証局が「Let's Encrypt」になっていることを確認(自己署名証明書ではなくなっている)

まとめ
Proxmox VEのWebUIにLet's EncryptのSSL証明書を設定することで、証明書の警告が表示されなくなり、セキュアな管理環境を構築できました。
今後は、他のローカルネットワークで実行しているサービスにもSSL証明書を適用し、よりセキュアなホームラボ環境を構築していく予定です。
参考サイト
- Certificate Management - Proxmox VE - Proxmox VE 公式Wiki 証明書管理
- acme.sh - How to use DNS API - acme.sh 公式Wiki DNS APIの設定方法
- Account owned tokens · Cloudflare Fundamentals docs - Cloudflare ドキュメント APIトークンに関して


