vCenter Server 7.0 で CSR を生成してカスタム証明書に置き換える

Share on:

Table of contents

概要

vSphere 6.7 以降では vSphere Client から証明書の管理が可能になっています。カスタム証明書の CSR を vCenter Server で生成する手順について文言など多少混乱した点があったので、記録として残しておきたいと思います。

流れは一般的な証明書の発行と同じく以下の3つです。今回のケースでは手順1, 3 は vCenter Server 側、手順 2 は CA 側で実施する操作になります。

  1. 証明書署名要求 (CSR) の生成
  2. 署名済み証明書の発行
  3. 署名済み証明書のインポート

注意:カスタム証明書の置き換えに関する既知問題

vCenter Server 7.0 ではマシン SSL 証明書をカスタム証明書に置き換えると vCenter Server のサービスが起動に失敗する既知問題があります。vCenter Server 7.0 Update 1c で修正されていますが、それ以前のリリースで発生した場合のワークアラウンドは無いようです。

vCenter Server 7.0 fails to start after replacing VMCA certificates with CA-signed certificates. (82168)

私の環境では再現できませんでしたが修正リリース以降へのアップデートの実施が推奨されますので、カスタム証明書を使用する場合は事前に既知問題に該当する vCenter Server 7.0 リリースか確認するようにしましょう。

2021/03/28 追記:インポートする証明書の改行コードなどに起因する既知問題を観測したので、本記事の末尾に内容などを追記しました。

証明書署名要求 (CSR) の生成

vSphere Client の [ホーム] > [管理] > [証明書の管理] を開き、[アクション] から [証明書署名要求 (CSR) の生成] をクリックします。

[CSR の生成] のダイアログが表示されるので、証明書の各種フィールドを入力し [次へ] をクリックします。

CSR のテキストが表示されるので、[ダウンロード] をクリックしてファイルとしてダウンロードするか、テキストファイルにコピーしておきます。

署名済み証明書の発行

CSR が生成されたので CA に署名してもらい、署名済み証明書 (PEM 形式) を発行してもらいます。私の場合は KB2112014 のように Microsoft CA (AD CS) で証明書を発行しましたが、特にどの認証局で署名しろといった規定はありません。テスト環境であれば OpenSSL や cfssl で簡易的にプライベート認証局を立てるなどでも特に問題ないと思います。

Microsoft 認証局から vSphere 証明書を取得する (2112014)

なお、証明書のインポート時に CA 証明書チェーンも必要になるため用意しておきます。

署名済み証明書のインポート

vSphere Client の [ホーム] > [管理] > [証明書の管理] を開き、[アクション] から [証明書をインポートして置き換え] をクリックします。

[証明書の置き換え] のダイアログでは、vCenter Server で生成した CSR から証明書を発行した場合はマニュアルに沿って [vCenter Server で生成された証明書に置き換え]1 を選択します。

マシン SSL 証明書のファイルを [ファイルの参照] から選択します。CA 証明書チェーンも同様に選択してから [REPLACE] をクリックします。

このタイミングでサービスの再起動が行われますので、サービスの起動まで待ってから再度 [ホーム] > [管理] > [証明書の管理] にアクセスすると、更新されたマシン SSL 証明書とその CA 証明書が確認できます。

CSR / 証明書の秘密鍵について

一般に CSR を生成するには事前に秘密鍵を用意しておく必要がありますが、vCenter Server で CSR を生成する場合、vCenter Server が秘密鍵を生成して一時的に vCenter Server の証明書ストア (VECS) 内に格納し2、署名済み証明書のインポート時に改めてマシン SSL 証明書と秘密鍵のペアとして VECS 内に保存するようです。

vCenter Server で CSR の生成を行うごとに新しい秘密鍵も生成されるため、署名済み証明書を発行した後に vCenter Server 側で再度 CSR を生成(新しい秘密鍵を生成)してしまうと、署名済み証明書と vCenter Server 上の秘密鍵が対応しなくなりインポートに失敗しますので注意が必要です。

vCenter Server 外で生成した CSR を使用する場合

秘密鍵の生成から CA による署名済み証明書の発行まで一般的な証明書の発行手順 (OpenSSL や cfssl を使うなど) で実施した場合には、証明書のインポート時に [vCenter Server で生成された証明書に置き換え] でなく [外部 CA 証明書に置き換え(プライベート キーが必要)] を使用することになります。

この場合、マシン SSL 証明書と CA 証明書チェーンに加えて、証明書に対応する秘密鍵も必要になるためインポートを実施する前に用意しておきます。

2021/03/28 追記:改行コードなどに起因する既知問題

私の環境で vCenter Server の証明書の置き換え後に CPU 使用率が高い状態が継続したため調べてみたところ、以下の KB80803 の既知問題にヒットしていました。

vCenter Appliance /storage/log partition full due to excessive pod-startup.log files (80803)

既知問題の原因としてはマシン SSL 証明書が不正なフォーマットとして扱われた場合に発生するとのことで、改行コードの違いによっても発生してしまうようです。

Windows の場合は改行コードが CR+LF ですが Linux の場合は LF のため、インポートする際のマシン SSL 証明書に CR+LF の改行コードが含まれると vmware-pod サービスが適切な PEM フォーマットとして解釈できず、サービスの起動が繰り返し失敗することで KB の Symptom のようにログの大量出力(や CPU 使用率の高騰)が発生する状況を確認しました。top で見る限りはその他のサービスは問題なさそうだったので、おそらくは vmware-pod サービス周りの実装の問題じゃないかと推測しています。

ADCS で発行した証明書で実際に事象が発生した後、KB の Resolution のように vi で不正な文字を削除して修正したところ解消しました。

また、ADCS の証明書 Web 登録や certreq.exe で証明書を要求すると改行コードが CR+LF ですが、改行コードを CR+LF から LF に変換した証明書をインポートすれば、そもそも事象の発生自体を回避できました。


  1. vCenter Server で生成したのは CSR なので文言に違和感がありましたが、原文も “Replace with certificate generated from vCenter server” だったので割り切りました。 ↩︎

  2. CSR 生成後に vecs-cli で MACHINE_SSL_CERT ストアを見ると __MACHINE_CSR というエントリが存在していました。証明書のインポートが完了するとエントリは削除されるようです。 ↩︎