はじめに
go-spiffe v2.8.1 で検証済み。コマンドは Go 1.24+ と稼働中の SPIFFE Workload API エンドポイント (SPIRE Agent) を想定。
前提
- Go 1.24 以降 (
go.modはgo 1.24.0を宣言)。 - 稼働中の SPIRE または他の SPIFFE Workload API 実装。対象ワークロードの登録エントリがあること。
- 環境変数
SPIFFE_ENDPOINT_SOCKETを Workload API アドレス (例:unix:///tmp/agent.sock) に設定。
インストール
go get github.com/spiffe/go-spiffe/v2最初の動く構成
mTLS への最短経路は spiffetls ヘルパである。Workload API から X509Source を構築し、SVID を提示し、ピアを検証する。
ライブラリに Workload API ソケットを指す。
bashexport SPIFFE_ENDPOINT_SOCKET=unix:///tmp/agent.sock任意の SPIFFE ピアを受け入れる mTLS サーバを起動する。
gopackage main import ( "context" "log" "github.com/spiffe/go-spiffe/v2/spiffetls" "github.com/spiffe/go-spiffe/v2/spiffetls/tlsconfig" ) func main() { ctx := context.Background() listener, err := spiffetls.Listen(ctx, "tcp", "127.0.0.1:8443", tlsconfig.AuthorizeAny()) if err != nil { log.Fatal(err) } defer listener.Close() log.Println("listening with a SPIFFE identity") }クライアントからダイヤルする。
goconn, err := spiffetls.Dial(ctx, "tcp", "127.0.0.1:8443", tlsconfig.AuthorizeAny())
両側が Workload API から X509-SVID と X.509 バンドルを取得して提示し、エージェントがローテーションするたびに更新し続ける (README.md:36-42)。
動作確認
接続は、両ピアが SVID を取得し、トラストバンドルに対して相手を検証できたときだけ成功する。任意のピアを受け入れる代わりに ID を固定するには、tlsconfig.AuthorizeAny() を tlsconfig.AuthorizeID(spiffeid.RequireFromString("spiffe://example.org/client")) に差し替える。これは同梱のサーバ例が行っていることである (examples/spiffe-tls/server/main.go:35-39)。ピア ID が一致しなければハンドシェイクは失敗する。
次に読むもの
examples ディレクトリ は gRPC クレデンシャル・JWT-SVID・フェデレーションを扱う。アテステーションポリシー・トラストドメインのフェデレーション・SVID ローテーションの調整といった本番運用は、SPIFFE standards と go-spiffe パッケージリファレンス を参照。