SAML署名の基本
SAML ResponseはXML署名で守られています。ここでは署名の構造、検証時の注意点、証明書の運用で気をつけることを実務目線で整理します。
🔏 署名の構造
署名は ds:Signature 要素に入り、Assertion単体またはResponse全体に付与されます。検証にはIdPが渡す公開鍵証明書(X.509)を使います。
基本要素
- 📌 署名対象は Assertion または Response 本体のどちらか(両方の場合もある)
- 📌 署名は ds:Signature に格納され、検証にはX.509証明書を利用
- 📌 署名の範囲(Reference URI)がずれていると検証に失敗する
🛡️ 検証時の注意
署名が正しいかだけでなく、レスポンスの条件や証明書の状態も合わせて確認します。
よくあるチェックポイント
- ✅ サーバーの時刻ズレで NotBefore / NotOnOrAfter の検証が落ちていないか
- ✅ Audience が期待するEntityIDと一致しているか
- ✅ 署名対象が想定の要素(Assertion/Response)になっているか
- ✅ 証明書の有効期限切れ・フォーマット違いがないか
証明書運用のポイント
- 🔁 ローテーション時期を把握し、事前にメタデータを更新する
- 🔁 CRL/OCSPが提供されている場合は失効確認を行う
- 🔁 ピン留めしている公開鍵が変わる場合はデプロイ順序に注意
- 🔁 テスト環境と本番で証明書を取り違えないように分離管理する
🧯 よくあるエラーと対処
署名周りで失敗する典型パターンと、切り分けのヒントを押さえておくと復旧が早くなります。
典型例
- ⚠️ 署名検証エラー:証明書不一致、署名範囲ミス、改ざんの可能性
- ⚠️ XML解析エラー:Deflate展開やBase64デコードに失敗
- ⚠️ 条件不一致:時刻ズレやAudience不一致で無効になる
対処のヒント
- 🧭 エラーログに出るReference URIや証明書の指紋を確認する
- 🧭 時刻同期(NTP)とサーバータイムゾーンを確認する
- 🧭 IdP/ SP双方のメタデータを再インポートして差分を解消する
SubjectConfirmation / Conditions の確認
AssertionのSubjectConfirmation(特にBearer)やConditionsは検証必須です。Recipient/NotOnOrAfter/Audienceが合わないと正当な受信者とみなされません。
- SubjectConfirmationData の Recipient がACS URLと一致しているか
- NotBefore/NotOnOrAfter が現在時刻の範囲内か
- Conditions > AudienceRestriction が期待するEntityIDと一致しているか