世界を動かす技術を、日本語で。

NginxがACMEプロトコルのネイティブサポートを導入

2025年8月14日原文(blog.nginx.org)

概要

  • NGINXACME プロトコルのプレビューリリースを発表
  • 新モジュール ngx_http_acme_module により証明書管理を自動化
  • Rustベース の動的モジュールとして提供
  • 外部ツール不要で SSL/TLS証明書 管理を簡素化
  • 今後の進化とユーザーからのフィードバック重視

NGINXにおけるACMEサポートの概要

  • NGINXACMEプロトコル のプレビューサポートを発表
  • 新モジュール ngx_http_acme_module により、証明書の発行・インストール・更新をNGINX設定から直接操作可能
  • NGINX-Rust SDK を活用したRust製動的モジュールとして提供
    • NGINX Open Sourceユーザー向け
    • NGINX One(NGINX Plus)エンタープライズ顧客向け
  • 外部ツール(例: Certbot)への依存排除によるワークフローの簡素化とセキュリティ向上
  • プラットフォーム依存性の低減および高い移植性・信頼性の実現

ACMEプロトコルとは

  • ACME(Automated Certificate Management Environment) は、証明書の発行・検証・更新・失効を自動化する通信プロトコル
  • Certificate Authority(CA) との自動連携を実現し、HTTPS化の手間を大幅削減
  • ISRG によるLet’s Encryptプロジェクトの一環として2015年に登場
  • ACME登場以前は、 TLS証明書の取得が手動・高コスト・エラー多発
  • ACMEv2 では新たなチャレンジ方式やワイルドカード証明書対応など機能強化

NGINX ACMEワークフロー

  • 4ステップ で構成される証明書管理プロセス
    • ACMEサーバー設定
    • 共有メモリの割り当て
    • チャレンジ方式の設定
    • 証明書の発行・更新

ACMEサーバーの設定

  • acme_issuer ディレクティブでACMEサーバーのディレクトリURLを指定
    • 例:
      acme_issuer letsencrypt {
        uri https://acme-v02.api.letsencrypt.org/directory;
        # contact admin@example.test;
        state_path /var/cache/nginx/acme-letsencrypt;
        accept_terms_of_service;
      }
      
  • クライアント連絡先やモジュールデータ保存先、利用規約同意なども設定可能

共有メモリの割り当て

  • acme_shared_zone ディレクティブで証明書・秘密鍵・チャレンジデータを保存
    • デフォルト256K、必要に応じて拡張可能
    • 例:
      acme_shared_zone zone=acme_shared:1M;
      

チャレンジ方式の設定

  • 現在は HTTP-01チャレンジ のみサポート
  • ポート80でリスナーを定義し、ACMEチャレンジを処理
    • 例:
      server {
        listen 80;
        location / {
          return 404;
        }
      }
      
  • 将来的に TLS-ALPNDNS-01 への対応を予定

証明書の発行・更新

  • acme_certificate ディレクティブで証明書の自動発行・更新
    • 対象ドメインは server_name で指定
    • 例:
      server {
        listen 443 ssl;
        server_name .example.com;
        acme_certificate letsencrypt;
        ssl_certificate $acme_certificate;
        ssl_certificate_key $acme_certificate_key;
        ssl_certificate_cache max=2;
      }
      
  • ワイルドカード・正規表現 は未対応
  • 証明書・秘密鍵情報は $acme_certificate$acme_certificate_key 変数で取得

ACMEサポートの意義

  • HTTPS普及 の加速に大きく貢献したACMEプロトコル
  • 証明書管理の自動化による コスト削減手作業の排除
  • IoT・エッジコンピューティング 分野でのセキュリティ自動化にも寄与
  • NGINXによるネイティブサポートで 将来のWebセキュリティ基盤 を強化
  • 継続的な機能進化と新たなセキュリティ要件への対応

導入方法・コミュニティへの呼びかけ

  • NGINX Open Source ユーザー向けに プリビルトパッケージ を提供
  • NGINX One(NGINX Plus) 利用者向けにはF5サポートの動的モジュールとして配布
  • 詳細は NGINX Docs 参照
  • フィードバック・機能要望 はGitHub Issuesで受付
  • ユーザーの声を反映し、今後も機能強化を推進

Hackerたちの意見

これはかなり大きいね。Caddyはずっと前からあったけど、みんなが使いたいわけじゃないからね。これでTraefikみたいなソフトのユーザーシェアが減るかも。

Caddyのいいところは、構文がわかりやすいところだね。実際にはnginx(nginxプロキシマネージャー経由)とTraefikを使ってるけど、最近Caddyでプロジェクトをやってみたらすごく良かった。将来的には自分のホスティング環境をCaddyに変える時間ができるかもしれないけど、たぶんpangolin [1]みたいなものにすると思う。Cloudflareトンネルの代替も提供してるしね。[1] https://github.com/fosrl/pangolin

確実にそうだね。家ではいくつかのことにTraefikを使ってるけど、今はそれを入れ替えるかも。

最近Caddyに切り替えた。Nginxのhttp 1のデシンク問題についての情報が全然なかったから。何かバカなことが起こるのを待つつもりはないし、監査人にNginxが答えない質問をされるのも嫌だ。CaddyはNginxよりずっと使いやすい。まず、主要なサービスとそのテストサービス、教育機関向けの特別なサービスをカバーするテンプレートがあるし。ログも良い感じ。証明書の扱いも完璧(少なくとも私のケースでは)。メトリクスも優れてる。だけど、Caddyにはレート制限がないし、Power BIのバグで一人のユーザーが特定の画像を300,000回もヒットさせることになるから、プラグインをどうにかしないといけない。それがちょっとした欠点だね。

現在のプレビュー実装では、クライアントのドメイン所有権を確認するためにHTTP-01チャレンジをサポートしています。DNS-01は、公開されていないnginxのユーザーにとって最も影響力があると思います(つまり、Nginx Proxy Manager経由)。DNS-01が実装されるのを本当に見たい!記録を更新するだけで、ホスティングしているものに直接結びつける必要がないから、すごくクリーンだと思ってる。

でも、DNS APIキーを読み込んでおかなきゃいけないし、多くのDNSプロバイダーはゾーンごとにAPIキーを許可してないんだよね。好きなんだけど、妥協がひどいことになるかもしれない。

DNSチャレンジを使わない理由がわからない。選択肢がないなら別だけど。面倒だし脆弱だと思ってたけど、今はネイティブのウェブサーバーサポートで少しはマシになったかも。ワイルドカードも使えないしね。

nginxがDNS-01チャレンジタイプをサポートする必要があるのはなぜ?nginxはプロセスのライフサイクル全体でHTTPサーバーを動かしてるから、.well-knownにアクセスできるし、DVをやるのに低レベルな方法を使う必要はないよね。それに、サーバー上に敏感なAPIトークンが必要になるから、最小権限の原則に違反してるように思える。

自宅ラボでcaddyとstep-caを使ってdns01やってるけど、めっちゃ楽しいよ。

TraefikのACMEの欠点の一つは、DNSプロバイダーごとに1つのAPIキーしか使えないことだね。ドメインにAPIキーを制限したい場合や、異なるアカウントに属するドメインを使いたい場合には問題だよ。Nginxには同じ制約がないことを願ってる。

DNS-01の実用的な問題は、各DNSプロバイダーが必要なTXTレコードを作成するためのAPIが異なることなんだ。Certbotは異なるプロバイダー用に10以上のプラグインがあって、リストは増えてる。これらのサードパーティAPIを追跡するのはnginxの仕事じゃないと思うし、DNS-01で証明書を取得するために、みんなにAWSやCloudflareみたいな大手にドメインを移すように言うのも無理があるよ。もう少し分散型のDNSが好きなんだ。

そうだね、ACME-DNSが欲しいな - https://github.com/joohoi/acme-dns Legoがサポートしてるよ。

Hacker Newsで議論の続きを見る