x/crypto/acme: support for acme profiles
要約
概要
x/crypto/acme パッケージに、ACMEプロトコルの新しい仕様である「ACME profiles」(証明書発行プロファイル)へのサポートを追加する提案です。Let's Encryptが提供する短命証明書やIPアドレス証明書などの発行時プロファイル選択機能を、Goの標準ACMEクライアントから利用できるようにします。
ステータス変更
active → likely_accept
提案レビュー会議(proposal review group)での議論の結果、この提案は「likely accept」と判定されました。当初はACME profilesがIETFのInternet-Draft段階に留まっており、標準への採用が不透明であることが懸念材料でしたが、2026年1月にLet's Encryptが短命証明書とIPアドレス証明書を一般提供(GA)したことで実用上の必要性が明確になり、また当該ドラフトがACME作業部会(WG)に正式採用されたことも後押しとなりました。レビューでは、提案されたAPI(ProfileNameという名前付き型の導入など)についてコアチームから軽微な改善提案があり、それが反映された上で承認方向となっています。
技術的背景
現状の問題点
現在の x/crypto/acme パッケージには、ACMEプロトコルの「発行プロファイル(issuance profile)」を指定する仕組みがありません。Let's Encryptは2025年以降、短命証明書(short-lived certificates)やパブリックIPアドレス向け証明書の発行に、ACME profiles機能(profile パラメータの指定)を要求するようになりました。既存のAPIではこれを実現できず、利用者は独自にHTTPリクエストを組み立てるなどのワークアラウンドが必要でした。実際、あるユーザーは x/crypto/acme/autocert にパッチを当てた独自PRを作成し、1ヶ月以上運用することで急場をしのいでいました。
提案された解決策
Directory 構造体に発行プロファイルの一覧を表す Profiles map[ProfileName]string フィールドを追加し(キーがプロファイル識別子、値が人間向けの説明文)、新しい名前付き型 ProfileName string を導入します。また Order 構造体に Profile ProfileName フィールドを追加し、新しい OrderOption として WithOrderIssuanceProfile(profile ProfileName) OrderOption を提供することで、証明書発注時にプロファイルを指定できるようにします。
これによって何ができるようになるか
Let's EncryptなどACME profilesに対応したCA(認証局)に対して、標準の x/crypto/acme クライアントから直接、短命証明書やIPアドレス証明書といった特定の発行プロファイルをリクエストできるようになります。これにより、独自パッチや低レイヤーのHTTPリクエスト操作を行わずに、公式APIの範囲内で最新のACME機能を利用できます。
想定される主なユースケースは次の3つです。
- パブリックIPアドレスに対する証明書取得(固定グローバルIPを持つが独自ドメインを持たないインフラ向けサーバー)
- セキュリティ強化のための短命証明書(shortlived profile)の自動更新運用
autocert.Managerを使った既存の自動証明書管理フローに、プロファイル指定を組み込む拡張
コード例
// Before: プロファイル指定機能がなく、パッチや独自実装が必要
manager := &autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.com"),
Cache: autocert.DirCache("secret-dir"),
// "shortlived" プロファイルを指定する手段がない
}
// After: Profile / WithOrderIssuanceProfile を使ってプロファイルを指定
client := &acme.Client{DirectoryURL: "https://acme-v02.api.letsencrypt.org/directory"}
dir, _ := client.Discover(ctx)
// dir.Profiles には利用可能なプロファイル一覧(例: "shortlived": "説明文")が入る
order, _ := client.AuthorizeOrder(ctx, ids,
acme.WithOrderIssuanceProfile(acme.ProfileName("shortlived")),
)
議論のハイライト
- タイミングの妥当性: 提案者は当初、ACME profilesがまだIETFドラフト段階であることを理由に採用を保留していましたが(@rolandshoemaker)、Let's Encryptによる短命証明書・IPアドレス証明書の一般提供(2026年1月)とACME WGへの正式採用により、実装の機が熟したと判断されました。
- 既存の実運用ニーズ:
golang/cryptoに対して既にIPアドレス証明書対応のPR(#336)が独自に提出・1ヶ月以上運用されており、実需の高さが裏付けとなりました。 - API設計の議論:
Profilesフィールドの型について、map[string]stringのままにするか、より構造化したmap[string]struct{ Doc string }や[]struct{ Name string; Doc string }にするかが議論されましたが、ドラフト仕様提案者自身の意見も踏まえ、シンプルなmap[string]string(ただしキーは名前付き型ProfileName)を採用する方針となりました。 - 設計哲学: 「このパッケージはACME仕様を完全実装することを目指しておらず、実用上必要な機能を現実的に取り込む」という方針がコメントで確認され、ドラフト段階の仕様であっても実用性を優先する判断材料となりました。
- レビュー会議での修正:
aclementsを含むレビューグループから、プロファイル名に文字列そのものではなく名前付き型ProfileNameを使うべきという指摘があり、提案者がこれを反映して最終的に likely accept となりました。