ゆるテックノート

SAML暗号化(Encrypted Assertion)

Encrypted Assertionのポイントを実装者向けに整理します。鍵管理や証明書期限にも注意しましょう。

🔐 Encrypted Assertion(暗号化アサーション)

SAMLでは、Assertion全体を暗号化して送信することで、ネットワーク上での属性情報漏洩を防ぐことができます。

暗号化のメリット

  • IdP→SP間の通信経路で属性情報の秘匿性を保てる
  • 外部からのリプレイ攻撃や盗聴対策になる
  • 企業間連携などでプライバシー保護が求められる場合に有効

復号に必要な情報

  • 🔑 SP側の秘密鍵(private key)
  • 🔑 IdPがSPの公開鍵を使って暗号化を行う必要がある
  • 🔑 SPライブラリがEncryptedAssertionに対応しているか確認

暗号化レスポンスの例

Assertion部分を暗号化したシンプルな例(署名省略・短縮表記)。XMLが途中で傍受されても、Assertionが暗号化されているため機密情報は保護される。

<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メタデータに暗号化用KeyDescriptorを載せることで、IdPがこの鍵でAssertionを暗号化できます。

<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>