HP iLOにLet’s Encryptの証明書を設定してあげる。

説明する内容はこんな感じ

  • certbotのインストール
  • certbotでGoogle Cloud DNSをつかった証明書の取得
  • iLOでCSR発行
  • iLOに証明書設定

certbotはLet’s Encryptで証明書を取得したり更新したりするためのCLIね。
使い方覚えておくと便利です。

ちなみにこの手順はUbuntu 20.04について記載しています。

certbotのインストール

Google Cloud DNSでDNS認証するから、ついでにプラグインも入れますよ。

$ sudo apt install certbot python3-certbot-dns-google -y

snapパッケージもあるっぽいですね。

certbotでGoogle Cloud DNSをつかった証明書の取得

Let’s Encryptはテスト実行するための環境が備わっているので、しっかりテストしてから証明書を発行しましょう。
ガンガン申請しているとかなりあっさりバン喰らいます(しばらく申請できません)。

まず基本形のコマンドは下記のような感じです。

$ sudo certbot certonly \
    --agree-tos \
    --dns-google \
    --dns-google-credentials <Google CloudのAPI鍵.json> \
    --dns-google-propagation-seconds 120 \
    -d <取得したい証明書のドメイン>

追加で幾つかオプションを足しておきましょう。

  • -m <メールアドレス>
    証明書の有効期限が近づいたらこのメールアドレスに通知を飛ばしてくれます。
  • -d <取得したい証明書のドメイン>
    ドメインを並べていくと複数のドメインに対応した証明書が作れます。
    またワイルドカード付きの証明書も取れるのでサブドメインが多いときは便利です。
  • --keep-until-expiring
    証明書が既に申請済みの場合、更新を抑制しておくことができます。
    期限が近づくと(1ヶ月以内)更新がかかります。
    逆に期限が1ヶ月以上残っていても更新したい場合は代わりに--force-renewalを付けます。

これでとりあえず証明書が発行されます。

iLOでCSR発行

iLOにブラウザからログインします。

「管理」→「セキュリティ」→「SSL証明書」と進んでいきます。

「証明書のカスタマイズ」ボタンをクリックすると、「証明書署名リクエスト情報」なるフォームが出てきます。
(この時点でお察しの通り、秘密鍵とCSRはiLOで生成します。外から秘密鍵を設定できません)

あとは「CSRの作成」ボタンを押すとCSRが作成されます(やたら遅いです)。
しばらくするとPEM形式のテキストが出てくるので気長に待ちましょう。

iLOに証明書設定

さて先程certbotの使い方を書きましたが、CSRを投げ込む方法は書いていませんでした。
ので、下記の通り打ち込んでみてください。

$ sudo certbot certonly \
    --agree-tos \
    --dns-google \
    --dns-google-credentials <Google CloudのAPI鍵.json> \
    --dns-google-propagation-seconds 120 \
    --csr <さっきiLOで生成したCSR.pem>

んで実行すると下記のような出力がつらつら出てきます。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-google, Installer None
Performing the following challenges:
dns-01 challenge for <CSRに記載のCN>
Unsafe permissions on credentials configuration file: <Google CloudのAPI鍵.json>
URL being requested: GET https://www.googleapis.com/discovery/v1/apis/dns/v1/rest
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones?dnsName=<CSRに記載のCN>.&alt=json
Attempting refresh to obtain initial access_token
Refreshing access_token
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones?dnsName=**********.&alt=json
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones/*******************/rrsets?alt=json
URL being requested: POST https://dns.googleapis.com/dns/v1/projects/********/managedZones/*******************/changes?alt=json
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones/*******************/changes/84?alt=json
Waiting 120 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
URL being requested: GET https://www.googleapis.com/discovery/v1/apis/dns/v1/rest
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones?dnsName=<CSRに記載のCN>.&alt=json
Attempting refresh to obtain initial access_token
Refreshing access_token
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones?dnsName=**********.&alt=json
URL being requested: GET https://dns.googleapis.com/dns/v1/projects/********/managedZones/*******************/rrsets?alt=json
URL being requested: POST https://dns.googleapis.com/dns/v1/projects/********/managedZones/*******************/changes?alt=json
Server issued certificate; certificate written to <証明書の出力先>
Cert chain written to 12
Cert chain written to 13

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   <中間証明書の出力先>
   Your cert will expire on 2020-08-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

すると証明書が生成されている(はずな)ので、これをiLOの「証明書のインポート」で貼っつける感じです。

証明書の反映にはiLOのリセットが必要ですのでお気をつけください。
サーバー自体の再起動は不要です。