駄文。

プログラマーの日常でつまずいたこと・気づいたことなどの記録です

vCenterにLet's Encryptの証明書を適用する - その1

VMWareを導入してはや数年。

だいぶ使ってきて機能的にはほぼ満足ではあるのであるが、使っていてどうしても改善したいことがある。 それは、vCenterなどのWEB系の管理画面でHTTPSの証明書エラーが出てしまうことである。

デフォルトではオレオレ証明書なので、ページを開くとセキュリティ関係のメッセージが出てうるさく、 ちょっと気に入らなかったのである。 とはいえ、まぁ、このメッセージページがでるだけで、それ以外の副作用はほとんどないのでわずかな手間を惜しんでいるだけですが。

で、これを改善するにはちゃんとした証明書をvCenterに登録すれば良いわけですが、さてこの証明書は 一般的には有償なのですが、最近は Let's Encryptという機関が無償で提供してくれている。

ただ、このLet's Encryptの証明書はセキュリティ的な観点で有効期限が90日と短期間のため証明書入れ替えが 度々発生するのでこの点も考慮しておかないとうまくいかないのである。(有償のものは一年なので、まぁ 我慢できる範囲になりそうなのですが)

とはいえ、やってみないと始まらないということで早速チャレンジしてみた。

更新方法としては調べていくと、3種類見つかった。

A. WEB UIから更新

vCenterの管理画面から 管理 - 証明書の管理 - マシンSSL証明書 - アクション - 証明書をインポートして置き換え

B. vCenterにSSHでログインしてCUIコマンドで更新

/usr/lib/vmware-vmca/bin/certificate-managerを実行

  1. 1. Replace Machine SSL certificate with Custom Certificateを選択

  2. 管理ユーザのログイン (例えば Administrator@vsphere.localなど)

  3. 2. Import custom certificate(s) and key(s) to replace existing Machine SSL certificateを選択

  4. Please provide valid custom certificate for Machine SSL.

    Let's Encryptで生成した、cert.pemを指定

  5. Please provide valid custom key for Machine SSL.

    Let's Encryptで生成した、privkey.pemを指定

  6. Please provide the signing certificate of the Machine SSL certificate

    Let's Encryptで生成した、fullchain.pemを指定

  7. You are going to replace Machine SSL cert using custom cert

    Yを入力

  8. うまくいけば、以下のメッセージが出力される。

       Command Output: /root/1/cert.pem: OK
    
       Status : 100% Completed [All tasks completed successfully]         
    

    うまくいかなかった場合のログの例(これに限らないとは思うが一例として)

      Unable to validate the chain of trust for the provided SSL certificate and Root. 
      Status : 0% Completed [Operation failed, performing automatic rollback]
    
      Error while replacing Machine SSL Cert, please see /var/log/vmware/vmcad/certificate-manager.log for more information.
    
      Performing rollback of Machine SSL Cert...
      Rollback Status : 100% Completed [Rollback completed successfully]    
    

C. WEB APIで更新

vSphere Automation API*1を用いることでWebAPIで証明書を更新可能

  1. セッション作成

    vCenterの証明書がオレオレ証明書のままの場合に、サーバ証明書検証でエラーになるのでcurl のオプション-kを追加して検証をスキップ指定を行う

       curl [-k] -X POST -H "Authorization: Basic `echo -n 'Administrator@vsphare.local:password'| base64`" https://vcenter.local/api/session
    

    Administrator@vsphare.local:passwordは管理者のIDとパスワードを指定する

    復帰情報がセッションIDになるので、これを用いて以後のAPI操作を行う

  2. 現在のSSL証明書情報を取得

      curl [-k] -X GET -H "vmware-api-session-id: {vmware api セッションID}" https://vcenter.ryokai.jp/api/vcenter/certificate-management/vcenter/tls | jq .
    
  3. SSL証明書の更新

       curl -X PUT -H "vmware-api-session-id: $VMWARE_API_SESSION_ID" -H "Content-Type: application/json" -d @cert.json https://vcenter.local/api/vcenter/certificate-management/vcenter/tls
    

    ここで指定しているcert.pemの内容は以下のようなものになる

       {
           "cert": "Let's Encryptで取得したfullchain.pemの内容",
           "key": "Let's Encryptで取得したprivkey.pemの内容"
       }
    

    証明書の内容は改行を\nに置き換えて1行にしたものを設定する。

とまぁ、ここまで更新方法を書いてきたが、実はこれだけではうまくいかず色々試行錯誤したのだが それについてはちょっと長くなったの次回の記事のお話とします。

参考情報について