web-dev-qa-db-ja.com

署名されたAuthNRequestを作成するにはどうすればよいですか?

IDPとインターフェイスしており、基本的なAuthNRequestを次のように作成しています。

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="IDTest1" 
  Version="2.0"
  IssueInstant="2013-03-04T09:21:59"
  AssertionConsumerServiceIndex="0"
  AttributeConsumingServiceIndex="0">
  <saml:Issuer>https://myapp.com/saml2/sp</saml:Issuer> 
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>     

IDPは、署名されたとおりにリクエストを送信することを望んでいます。私の質問は次のとおりです。

  1. ダイジェスト値を設定するにはどうすればよいですか?
  2. 署名値を設定するにはどうすればよいですか?
  3. X509証明書の場合、アプリの公開鍵を設定しました。正しい?
  4. 値の計算に使用されるデータは何ですか?署名要素のない元の認証リクエストですか?
11
gbhakta

これの多くはドキュメントでカバーされていることに注意してください:

SAMLメタデータ

リクエストに署名するには、次のようなものを追加する必要があります(通常はsp.xmlにあります)。

<SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">

署名キーは次のようになります。

<KeyDescriptor use="signing">
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:X509Data>
                    <ds:X509Certificate>      MIIDWTC...CAkGgAwIBAgIEe+a+/uaSZCp5g2z+hRWRV+DyfQc9nO
                    </ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </KeyDescriptor>

ここで、MII ...は公開鍵です。

@Stefanによると、ライブラリを使用する方がはるかに簡単です。

6
nzpcmad

SAML認証リクエストはXMLドキュメントです。他のXMLドキュメントに署名するのと同じように、SAML認証要求に署名できます。ただし、いくつかの制限があります。

  1. 署名はエンベロープ署名である必要があります。
  2. ダイジェストされる前に、SAML認証要求はエンベロープ署名変換と排他的正規化変換以外の方法で変換してはなりません。
  3. Signature要素には、Reference要素を1つだけ含める必要があります。
  4. 唯一の参照要素のURIには、署名されたSAML認証要求のID属性の値が含まれている必要があります。
  5. 署名する前に、SignedInfo要素を排他的な正規化メソッドを使用して正規化する必要があります。

SAMLアサーションとプロトコルの仕様( http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf )の詳細については、セクション5。

5
fajarkoe

あなたの質問は不十分です!

送信しているAuthRequestは[〜#〜] redirect [〜#〜]リクエストのようですが、ダイジェスト、署名、証明書は表示されません。これらの詳細はすべて、パラメーターとしてURLに含まれます。

POST SSOリクエストを使用してみてください。ここでは、SAMLリクエストにダイジェスト、署名、証明書が表示されます。

ポイントのいくつか:

一般

  • IdPとSPの両方がMetadataを共有する必要があります。これには、ID、署名アルゴリズム、ハッシュ方法、公開鍵などの基本構成が含まれます。
  • したがって、IdP間の契約に基づいて、希望するプログラミング言語でリクエストをハッシュして署名する必要があります。

SP:

  • 公開鍵を使用して暗号化する必要があります。
  • 秘密鍵を使用して署名する必要があります。
  • Base64を使用してリクエストをエンコードする必要があります。

IdP:

  • リクエストの公開鍵を使用して識別します。
  • 暗号化および署名されたXMLで応答します。
  • 応答を復号化して署名を解除する必要があります。

クイックリンク

  1. SAML 2.0に関する公式ドキュメント

  2. OneLoginによるSAMLオンラインツール

3
Aravin

より大きなフレームワークを使用せずに独自のリクエストを作成する場合は、OpenSAMLをお勧めします。 SAMLメッセージの作成を支援するライブラリです。

私の本 OpenSAMLのガイド では、これ以上のことが詳細に説明されています。

編集私は 本の新版 をリリースしました。OpenSAMLV3をカバーしています

ここ はSAMLメッセージの署名について書いた例です

そして1つ AuthnRequestsをディスパッチする方法について。

3

セキュリティに関することは決して簡単ではありません... @ nzpcmadによってリンクされたドキュメントと SAML2プロファイル (WB SSO-Webブラウザのシングルサインオンを探してください)を確実に確認する必要があります。

Java OpenSamlは、確かに最も簡単なソリューションの1つです。

2
Erwin

落とし穴は、HTTPリダイレクトバインディングでは、署名が追加のURLパラメータによって転送され、SAMLRequest値の一部ではないことです。 https://my-idp.com/login?SAMLRequest=nVNN...%3D&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=QZ64 ...%3D%3D

1
axelrose