
はじめに
こんにちは。NetScaler 製品担当です。
今回も NetScaler と ACME に関する記事をお届けします。
本記事で紹介する内容は、製品のサポート範囲外となります。利用環境によっては、メーカーが提供するサービスだけでは証明書の自動更新を実現できない場合があります。
そこで今回は、そのようなケースにおける一つの対応案として、生成 AI を活用した自動化の仕組みをご紹介します。少々力技なアプローチではありますが、同様の課題をお持ちの方の参考になれば幸いです。
目的
サーバー証明書の有効期間短縮により、これまで以上に証明書更新作業の自動化が重要になっています。本記事では、ACME プロトコルを利用して NetScaler の証明書更新を自動化する仕組みを構築してみます。
背景
以前の記事でも紹介したように、NetScaler は NetScaler Console Service と連携することで、ACME を利用した証明書の自動更新ができます。
以前の記事:
ただし、利用できる認証局は、NetScaler Console Service が対応しているものに限られます。
一方、Certbot は、国内でサービスを提供している複数の認証局でも利用されています。
そこで今回は、Certbot と生成 AI を活用して、NetScaler の証明書を自動更新する仕組みを構築してみました。
記事の最後では、実際に使用したプロンプトや構築手順も紹介します。
なお、重要な注意点ですが、本構成はメーカー推奨ではなく、あくまで一つのアイデアを紹介してみた、という記事となっております。
実施内容
今回は、証明書の取得・更新を Certbot で行い、取得した証明書をスクリプトで NetScaler へアップロード、バインドする仕組みを構築します。
各処理を担う仕組みについて、NetScaler Console Service を利用した構成と比較すると、次のようになります。
| 項目 |
NetScaler Console Service 構成 |
Certbot 構成 |
|---|---|---|
| 証明書の取得・更新 | NetScaler Console Service | Certbot |
| DNS TXT レコードの登録と削除 | NetScaler Console Service | Certbot |
| NetScaler へアップロード・反映 | NetScaler Console Service | 作成スクリプト |
Certbot 構成動作フロー
Certbot 構成における証明書自動更新の動作フローです。cron から自動化スクリプト(renew_and_deploy.sh)を定期実行し、DNS-01 チャレンジによる証明書発行から NetScaler への反映までを制御します。証明書に変更があった場合のみ NetScaler へ反映し、変更がない場合は何もせず正常終了します。

証明書自動更新スクリプト 実行フロー
証明書自動更新スクリプト(renew_and_deploy.sh)の内部処理です。cron による定期実行後、Cloudflare 認証情報を tmpfs 上に一時復号して Certbot を実行し、証明書ハッシュの変化を判定します。変更があった場合のみ NetScaler パスワードを復号して deploy_cert_to_netscaler.sh を呼び出し、処理終了後は復号した機密情報を破棄してログを出力します。

実際の動作
定期的な実行ログ:

更新時の実行ログ:


*本作業で一番苦労した部分は、スクリプト作成ではなく、全体テスト時の実行です。Certbot は ACME の拡張機能である ARI に対応しており、たとえ毎日 cron で更新チェックを走らせても、Certbot は ARI によって受け取った推奨更新期間を優先するため、なかなか証明書の正常更新ログを取得することができませんでした。最終的には --force-renewal オプションで強制的に更新させることで、成功ログを取得しました。
AI 向け再現用プロンプト
なお、このプロンプトはあくまで骨子です。実際の実装方法や細かな設計判断については、作成者と AI との対話の中で決めていきます。
あなたはネットワーク/インフラエンジニア向けの技術アシスタントです。
以下の要件で、Ubuntu 環境上に Docker ベースの Certbot 環境を構築し、パブリック CA の SSL 証明書を取得して、NetScaler の SSL VPN vServer およびロードバランシング(LB)vServer の両方にバインドする手順を、ステップバイステップで案内してください。
【背景・目的】
- 製品が提供するサービスを利用しても、利用中のパブリック CA サービスがサポート対象外となるケースがある
- 証明書更新の自動化は必須のため、Certbot コンテナを用いた自動更新の仕組みを構築したい
- 目的は、人の手を介さない証明書の定期的な自動更新である
【前提環境】
- OS:Ubuntu(20.04 / 22.04 / 24.04 LTS 系)
- DNS:Cloudflare で管理しているドメイン(DNS-01 チャレンジを使用)
- 証明書のバインド先:NetScaler の SSL VPN vServer と LB vServer
- 対象 vServer は設定済み、証明書は未バインドであることを前提とする
【進め方のルール】
- 1 ステップずつ実施すること
- 実行コマンドには簡潔なコメントを付けること
- 実行結果を確認してから次のステップへ進むこと
- 機密情報は平文で記載しないこと
- NITRO API の仕様は可能な限り公式ドキュメントで確認すること
- 最終的に、手順・コマンド・スクリプト・フロー図を Markdown 形式で整理すること
- root 権限の cron で無人実行される前提とし、$HOME 等の環境依存パスに頼らないこと
- NetScaler への証明書ファイル転送は scp/shell アクセスではなく、NITRO API の systemfile リソース(HTTPS POST)を使うこと。NetScaler のコマンドポリシーは shell・sftp・scp を許可/拒否の単位でしか制御できず、細かい制限が組めないため、scp を使う限り専用ユーザーを作っても実質 nsroot 相当の権限になってしまう
- NetScaler 上の証明書ファイルは固定名で上書きせず、ファイル名に更新日時を付与するなどしてロールバック手段を確保すること
- 証明書の更新タイミングは CA 側の ARI(ACME Renewal Information、RFC 9773)によって制御される場合があり、ローカルの再更新期間設定(renew_before_expiry)だけでは早期更新をテストできないことがある。動作確認を急ぎたい場合は --force-renewal を使うこと
- 動作確認は対話シェル(sudo bash -c など)だけで済ませず、実際に cron 経由で発火させて確認すること(対話シェルと cron の実行環境の違いに起因する不具合があり得るため)
【含めてほしいステップ】
- Docker Engine のインストール
- Cloudflare API トークンを使った証明書取得(dry-run → 本番発行)
- NetScaler への証明書アップロード・バインドスクリプト作成(SSL VPN / LB を引数で選択できる形式、NITRO API の systemfile リソースでファイル転送、証明書オブジェクトが新規作成の場合のみバインドする冪等な設計)
- Cloudflare トークン・NetScaler 管理パスワードの暗号化保管の仕組み
- cron 定期実行用に、証明書更新チェックと NetScaler への反映を 1 本化したスクリプト作成(更新があった場合のみ反映する冪等な設計に)
- NetScaler 管理ユーザーの最小権限化(nsroot を使い続けず、証明書関連の操作だけを許可する専用システムユーザーを作成)
- 全体の処理フロー(誰が何をしているか)を示す図の提示
このプロンプトはあくまで骨子です。実際の実装方法・細かい設計判断は、作成者と使用する AI とのやり取りの中で決めていきます。
まず Step 1 から始めてください。
まとめ
皆さま、いかがでしたでしょうか。
本記事でご紹介した内容はメーカー推奨構成ではなく、あくまで自己責任の範囲で実施する一つのアイデアです。しかし、同様の課題をお持ちの方にとって、少しでも参考になれば幸いです。
今回は AI を活用することで、これまで私にとってハードルが高かったスクリプト作成やコンテナ操作にもつまずくことなく取り組むことができ、最後まで形にすることができました。技術的な検証はもちろんですが、個人的にも非常に楽しい時間となりました。
なお、NetScaler には Express ライセンスが用意されています。スループットに制限はあるものの、検証用途で利用するには十分な機能を備えています。VPX 専用ではありますが、最新 OS であればライセンス適用なしでデフォルトのまま利用を開始できます。
「まずは試してみたい」「検証環境を手軽に用意したい」という場合には、有力な選択肢になるかもしれません。
詳細については、以下の URL をご参照ください。
免責事項
本記事で紹介する構成およびスクリプトは、検証環境で動作を確認した一例です。メーカー推奨構成ではなく、一つのアイデアとして紹介するものです。導入・利用にあたっては、十分な検証を実施したうえでご判断ください。 ※本記事の内容は投稿時点の情報に基づくものであり、その後の製品アップデートや仕様変更等により、最新の情報と異なる場合があります。内容の正確性・完全性・最新性を保証するものではありませんので、あらかじめご了承ください。
本記事の情報を利用したことにより生じたいかなる損害についても、当社および執筆者は責任を負いかねます。実際の導入・設定にあたっては、必ずご自身の環境で検証のうえ、各製品の最新の公式情報をご確認ください。