メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#73101active

x/crypto/acme: support for acme profiles

新規提案

要約

AIによる要約であり、誤りを含む場合があります。

概要

x/crypto/acme パッケージに ACME プロファイル機能のサポートを追加する提案。ACME プロファイルとは、証明書の検証プロセスや証明書の内容(有効期間など)を指定するための仕組みで、Let's Encrypt がすでに本番環境で提供している機能。

ステータス変更

(新規)active
2026年1月に Let's Encrypt が短期間証明書(約6日)および IP アドレス向け TLS 証明書を一般提供開始したことを受け、@rolandshoemaker が「実装を検討する時機が来た」と判断。2026年6月24日の週次 Proposal Review Meeting で active ステータスに移行し、正式なレビュープロセスが始まった。

技術的背景

現状の問題点

x/crypto/acme は ACME プロトコル(RFC 8555)を実装しているが、IETF ACME WG が策定中の「ACME Profiles」Internet-Draft に対応していない。そのため、Let's Encrypt が提供する以下のプロファイルを指定した証明書取得ができない。

  • classic: 従来通りの90日有効期間の証明書
  • tlsserver: 45日有効期間、CA/Browser Forum の最新基準に準拠した小さな証明書
  • shortlived: 約6日有効期間。失効情報が不要になり、高頻度自動更新を前提とした構成に最適
  • tlsclient: TLS クライアント認証を含む証明書(2026年7月以降廃止予定)
    特に shortlived プロファイルは IP アドレス向け証明書の発行に必要であり、その需要が高まっている。

提案された解決策

@rolandshoemaker が提案したAPIの形状は以下の通り。

// Directory 構造体への追加
type Directory struct {
    // 既存フィールド省略...
    // Profiles は CA がサポートするプロファイル識別子とその説明のマップ。
    // 空の場合、CA は発行プロファイルをサポートしていない。
    Profiles map[string]string
}
// Order 構造体への追加
type Order struct {
    // 既存フィールド省略...
    // Profile は注文に使用するオプションの発行プロファイル。
    Profile string
}
// 新しい OrderOption 関数
// WithOrderIssuanceProfile は注文の profile フィールドを設定する。
// CA の Directory.Profiles に存在するプロファイルと共に使用する。
func WithOrderIssuanceProfile(profile string) OrderOption

これによって何ができるようになるか

ACME プロトコルを使った証明書発行時に、発行プロファイルを明示的に指定できるようになる。

コード例

// Before: プロファイル指定の手段がなく、CAのデフォルト証明書のみ取得可能
client := &acme.Client{Key: myKey}
order, err := client.AuthorizeOrder(ctx, ids)
// After: WithOrderIssuanceProfile でプロファイルを指定
client := &acme.Client{Key: myKey}
// まずディレクトリを確認し、サポートされているプロファイルを取得
dir, err := client.Discover(ctx)
// dir.Profiles == map[string]string{
//   "shortlived": "Certificates with ~6 day validity...",
//   "classic":    "Traditional 90-day certificates...",
// }
// shortlived プロファイルで注文を作成
order, err := client.AuthorizeOrder(ctx, ids,
    acme.WithOrderIssuanceProfile("shortlived"),
)

実践的なユースケース:

  • IP アドレス向け証明書の自動取得: Let's Encrypt の shortlived プロファイルを使って、IPアドレスに対する TLS 証明書を取得できる
  • 証明書の自動ローテーションシステム: 6日有効の短期証明書により、CRL(失効リスト)なしで安全な証明書管理が可能
  • モダンな証明書要件への対応: CA/Browser Forum の最新要件に準拠した45日有効証明書(tlsserver プロファイル)の取得

議論のハイライト

  • 早期採用への懸念: 当初 @seankhliao@rolandshoemaker は「Internet-Draft はまだドラフト段階であり時期尚早」と慎重な姿勢を示していた。過去に x/crypto/acme がドラフト段階の仕様を早期に取り込み、後から変更を強いられた経緯がある
  • タイミングの変化: 当該 Internet-Draft が IETF ACME WG に正式採択され、Let's Encrypt が短期証明書と IP 証明書を一般提供開始したことで状況が変わり、実装の機運が高まった
  • Profiles フィールドの型: map[string]string のままにするか、将来の仕様変更に備えてより複雑な型にするかが議論された。Let's Encrypt の担当者 @aarongablemap[string]string で問題ないと表明し、その方向で固まりつつある
  • 実装 CL: @sigmavirus24(提案者)が実装のプロトタイプを fork に公開し、その後 Gerrit に CL #788000 として提出。実際の実装が先行している状態でレビューが進んでいる
  • autocert パッケージへの影響: 関連 PR #336(golang/crypto)では autocert.ManagerProfile フィールドを追加する実装も示されており、高レベルAPIにも波及する

関連リンク