SAML署名の基本
SAML ResponseはXML署名で守られています。ここでは署名の構造、検証時の注意点、証明書の運用で気をつけることを実務目線で整理します。
🔏 署名の構造
署名は ds:Signature 要素に入り、Assertion単体またはResponse全体に付与されます。検証には事前に信頼を確立したIdPの公開鍵を使います。受信XMLに含まれる証明書だけを信頼してはいけません。
基本要素
- 📌 署名対象は Assertion または Response 本体のどちらか(両方の場合もある)
- 📌 署名は ds:Signature に格納され、検証にはX.509証明書を利用
- 📌 検証に成功した署名対象の要素を、そのまま認証判断に使う。別の未署名Assertionを読み取ると署名ラッピング攻撃につながる
🛡️ 検証時の注意
署名が正しいかだけでなく、レスポンスの条件や証明書の状態も合わせて確認します。
よくあるチェックポイント
- ✅ サーバーの時刻ズレで NotBefore / NotOnOrAfter の検証が落ちていないか
- ✅ Audience が期待するEntityIDと一致しているか
- ✅ 署名対象が想定の要素(Assertion/Response)になっているか
- ✅ 登録鍵・証明書形式と、採用する信頼モデルに応じた期限ポリシーを確認する
証明書運用のポイント
- 🔁 ローテーション時期を把握し、事前にメタデータを更新する
- 🔁 鍵の失効・期限の扱いは証明書の信頼モデルに従う
- 🔁 ピン留めしている公開鍵が変わる場合はデプロイ順序に注意
- 🔁 テスト環境と本番で証明書を取り違えないように分離管理する
🧯 よくあるエラーと対処
署名周りで失敗する典型パターンと、切り分けのヒントを押さえておくと復旧が早くなります。
典型例
- ⚠️ 署名検証エラー:証明書不一致、署名範囲ミス、改ざんの可能性
- ⚠️ XML解析エラー:Deflate展開やBase64デコードに失敗
- ⚠️ 条件不一致:時刻ズレやAudience不一致で無効になる
対処のヒント
- 🧭 エラーログに出るReference URIや証明書の指紋を確認する
- 🧭 時刻同期とUTC日時の解釈を確認する。表示タイムゾーンの違いだけで時刻ずれとは判断しない
- 🧭 信頼できる配布元のメタデータと差分を照合し、変更内容を確認して更新する
SubjectConfirmation / Conditions の確認
AssertionのSubjectConfirmation(特にBearer)やConditionsは検証必須です。Recipient/NotOnOrAfter/Audienceが合わないと正当な受信者とみなされません。
- SubjectConfirmationData の Recipient がACS URLと一致しているか
- ConditionsのNotBeforeとNotOnOrAfter、BearerのSubjectConfirmationDataのNotOnOrAfterを検証する。SP起点ではInResponseToを未使用の要求IDと照合し、Assertion IDの再利用も拒否する
- Conditions > AudienceRestriction が期待するEntityIDと一致しているか
仕様と関連する解説
OASIS SAML profiles / OASIS Metadata Interoperability Profile / OWASP SAML Security Cheat Sheet
関連するSAML解説