Site icon rpine lab Tech Blog

趣味のプログラミング(Web系・バックエンド)や自宅ラボ(Homelab)構築・マイコンを使った電子工作などを雑多に扱った技術ブログです。

Proxmox VEのWebUIにSSL証明書を設定する

はじめに

ProxmoxのWebUIにアクセスするたびに証明書エラーが出て煩わしいので、Let's Encryptの証明書を利用するようにProxmoxを設定したいと思います。

Proxmox VEはデフォルトで自己署名証明書を使用しているため、ブラウザで管理画面にアクセスする際に証明書の警告が表示されます。本記事では、Let's Encryptから証明書を自動で取得し、Proxmox VEのWebUIに適用する方法を解説します。

前提条件

pve01.home.example.comをProxmoxのホスト名として設定していると仮定して話を進めます。

このとき、以下の条件が必要です。

  • 取得した独自ドメイン(example.com)を使ったホスト名をProxmoxノードに対して設定していること
    • pve01.localpve01.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アカウントを作成します。

  1. Proxmox VEのWebUIにログイン
  2. Datacenter → ACMEを選択
  3. Accountsタブの「Add」ボタンをクリック
    Image in a image block
  4. アカウント設定を入力:
    画像はStaging(テスト用)の証明書を作る場合の設定
    画像はStaging(テスト用)の証明書を作る場合の設定
    • Account Name: default(任意の名前、何も入力しない場合はdefaultになる)
    • ACME Directory: Let's Encrypt V2
    • Contact: 自分のメールアドレス
    • Accept TOS: チェック(規約に同意)
  5. 「Register」をクリックしてアカウントを作成

DNSチャレンジプラグインの設定(Cloudflare DNS)

DNS-01チャレンジを使用して証明書を取得するため、DNSチャレンジプラグインを設定します。

ここでは独自ドメインにCloudflareのDNSを利用している前提で進めていきます。他の利用できるDNSサービスについてはacme.shのWikiを参照してください。

Cloudflare APIトークンの取得

チャレンジ用のDNSレコードを自動で作成するために、必要最低限の権限を割り当てた、Cloudflareアカウントに紐づいたAPIトークン(Account-owned Token)を作成します。

  1. Cloudflare Dashboard → Manage Account → Account API Tokens にアクセス
  2. 「Create Token」をクリック
  3. API token templates から「Edit zone DNS」のテンプレートをクリック
  4. 以下の設定でトークンを作成:
    • Token name: Proxmox ACME(適当に決定)
    • Permissions:
      • Zone > DNS > Edit
    • Zone Resources:
      • Include > Specific zone > 自分のドメインを指定
  5. 「Continue to summary」→「Create Token」でトークンを生成
  6. 生成されたトークンをコピーしておく(トークンはここの画面でしか表示されないため、このままページを閉じずに別のタブで次の作業をすることを推奨)

DNS APIプラグインの作成

  1. Datacenter → ACME タブを選択
  2. Challenge Pluginsタブの「Add」ボタンをクリック
    Image in a image block
  3. プラグイン設定を入力:
    Image in a image block
    • Plugin ID: cf-dns(任意の名前)
    • DNS API: Cloudflare Managed DNS
    • CF_Token: 先ほど取得したAPIトークン
    • CF_Account_ID: アカウントID
    • CF_Zone_ID: ゾーンID
    • CF_EmailCF_Keyは設定不要(従来のAPIキー用)
    💡
    アカウントIDとゾーンIDはCloudflare管理画面でゾーン(ドメイン)のOverviewタブから確認可能です。
  4. 「Add」をクリックしてプラグインを作成

SSL証明書の取得と設定

ドメイン設定の追加

  1. ノードをサイドバーから選択
  2. System → Certificates タブを選択
  3. ACMEタブの「Add」ボタンをクリック
    Image in a image block
  4. ドメイン設定を入力:
    Image in a image block
    • Challenge Type: DNS
    • Domain: pve01.home.example.com
    • Plugin: cf-dns(先ほど作成したプラグイン)
  5. 「Create」をクリック

証明書の取得

  1. 「Order Certificates Now」ボタンをクリック
    Image in a image block
  2. 証明書取得処理が終わるまで待つ(DNSレコードの反映待ち時間の関係で数分かかる)
    Image in a image block
  3. TASK OKと最後に表示されたら証明書取得完了

複数ノードがある場合

Proxmoxクラスター環境の場合、各ノードで「ドメイン設定の追加」以降の手順を実行して、それぞれのノードに証明書を設定します。

自動更新

Let's Encryptで発行した証明書は90日間で有効期限が切れるため、自動更新が必要です。

Proxmox VEには証明書の自動更新機能が組み込まれており、有効期限が30日以内の証明書に対して証明書の再発行が自動実行されます。

証明書の有効期限はWebUIから次の手順で確認できます。

  1. System → Certificates タブで、上の証明書一覧から「pveproxy-ssl.pem」を選択
  2. Expires欄に有効期限が表示
    Image in a image block

動作確認

証明書が実際に適用されているかブラウザーでアクセスして確認します。

  1. ブラウザでhttps://pve01.home.example.com:8006にアクセス
  2. 証明書エラーが表示されないことを確認
  3. ブラウザのアドレスバーで鍵アイコンをクリックして証明書情報を確認し、認証局が「Let's Encrypt」になっていることを確認(自己署名証明書ではなくなっている)
Image in a image block

まとめ

Proxmox VEのWebUIにLet's EncryptのSSL証明書を設定することで、証明書の警告が表示されなくなり、セキュアな管理環境を構築できました。

今後は、他のローカルネットワークで実行しているサービスにもSSL証明書を適用し、よりセキュアなホームラボ環境を構築していく予定です。

参考サイト

この記事が役に立ったら是非ご支援をお願いします!

支援する

※Squareの決済ページに移動します