SAML暗号化(Encrypted Assertion)
Encrypted Assertionのポイントを実装者向けに整理します。鍵管理や証明書期限にも注意しましょう。
🔐 Encrypted Assertion(暗号化アサーション)
SAMLでは、Assertion全体を暗号化して送信することで、ネットワーク上での属性情報漏洩を防ぐことができます。
暗号化のメリット
- ✅ IdP→SP間の通信経路で属性情報の秘匿性を保てる
- ✅ 暗号化だけでは再送(リプレイ)を防げない。署名・宛先・期限・要求IDを検証し、Assertion IDの再利用を拒否する
- ✅ 企業間連携などでプライバシー保護が求められる場合に有効
復号に必要な情報
- 🔑 SP側の秘密鍵(private key)
- 🔑 IdPがSPの公開鍵を使って暗号化を行う必要がある
- 🔑 SPライブラリがEncryptedAssertionに対応しているか確認
暗号化レスポンスの例
暗号化部分の配置を示す模式図です。省略記号を含むため、そのまま送信・検証できません。実際にはIssueInstant、Status、暗号データ、署名と各検証条件が必要です。TLSも併用します。
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_res123" Version="2.0"
Destination="https://sp.example.com/acs" InResponseTo="_req123">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://idp.example.com/metadata</saml:Issuer>
<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
...暗号化されたAssertion本体...
</xenc:EncryptedData>
</saml:EncryptedAssertion>
</samlp:Response>
暗号化を許可するメタデータ例
SPメタデータの構造例です。省略部分と証明書の仮文字列は実値に置き換える必要があります。公開鍵証明書を掲載し、秘密鍵は配布しません。
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://sp.example.com/metadata">
<md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="encryption">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data><ds:X509Certificate>MIIC...(SP公開鍵)...</ds:X509Certificate></ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
...
</md:SPSSODescriptor>
</md:EntityDescriptor>