SAML を機能させるには、XML 署名について何を知っておく必要がありますか?

StackOverflow https://stackoverflow.com/questions/1937297

質問

職場には、SAML によって検証されたシングル サインオンを使用して、別の会社の Web アプリと接続する必要がある Web アプリがあります。当社の Web アプリは PHP で書かれており、他の会社がどの言語を選択しているかは明らかに無関係です。それにもかかわらず、この他の会社が SAML リクエストを使用して SOAP リクエストを送信し、SAML レスポンスを生成できる単純な API を作成する必要がありました。私がゼロから書き始めた理由は次の 3 つです。 1) PHP で書かれた SAML インタラクションのオプションは、たとえ欲しかったとしてもあまり多くないようです。 2) 別のサードパーティコンポーネントの追加に伴うオーバーヘッドを制限します。 3) 何かをゼロから作成すると、通常、理解が大幅に深まり、必要に応じて将来的にそれを適応させる能力がはるかに高まります。

とにかく、私は SAML、SOAP、XML 標準全般についてはかなり初心者なので、勉強しながら独学しています。API は目的に応じてほぼ完成しましたが、唯一の例外として、他の会社が私たちの応答に証明書でデジタル署名する必要があると指定していることです (また、私たちが受け取るリクエストも同様にデジタル署名されます)。そこで、XML 署名を処理/生成する方法を見つけようとしましたが、W3C の仕様はそれほど読みやすいものではないため、正直に言って、すべてが少し混乱しています。

セクション 5.4.8 OASIS Security Markup Language (SAML) V1.1 のアサーションとプロトコル ドキュメント (他の会社が v1.1 を使用すると言っていたので、私がやめたドキュメント) には、署名されたアサーションを含む署名された応答の例が含まれています。参照のためにここに含めます。

<Response IssueInstant="2003-04-17T00:46:02Z" MajorVersion="1" MinorVersion="1"
 Recipient="www.opensaml.org" ResponseID="_c7055387-af61-4fce-8b98-e2927324b306"
 xmlns="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <ds:SignedInfo>
   <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
   <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
   <ds:Reference URI="#_c7055387-af61-4fce-8b98-e2927324b306">
    <ds:Transforms>
     <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
     <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
      <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
       xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
     </ds:Transform>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>TCDVSuG6grhyHbzhQFWFzGrxIPE=</ds:DigestValue>
   </ds:Reference>
  </ds:SignedInfo>
  <ds:SignatureValue>x/GyPbzmFEe85pGD3c1aXG4Vspb9V9jGCjwcRCKrtwPS6vdVNCcY5rHaFPYWkf+5EIYcPzx+pX1h43SmwviCqXRjRtMANWbHLhWAptaK1ywS7gFgsD01qjyen3CP+m3Dw6vKhaq1ed10BYyrIzb4KkHO4ahNyBVXbJwqv5pUaE4=</ds:SignatureValue>
  <ds:KeyInfo>
   <ds:X509Data>
    <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
   </ds:X509Data>
  </ds:KeyInfo>
 </ds:Signature>
 <Status><StatusCode Value="samlp:Success"/></Status>
 <Assertion AssertionID="_a75adf55-01d7-40cc-929f-dbd8372ebdfc"
  IssueInstant="2003-04-17T00:46:02Z" Issuer="www.opensaml.org"
  MajorVersion="1" MinorVersion="1" xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Conditions NotBefore="2003-04-17T00:46:02Z" NotOnOrAfter="2003-04-17T00:51:02Z">
   <AudienceRestrictionCondition>
    <Audience>http://www.opensaml.org</Audience>
   </AudienceRestrictionCondition>
  </Conditions>
  <AuthenticationStatement AuthenticationInstant="2003-04-17T00:46:00Z"
   AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password">
   <Subject>
    <NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">scott@example.org</NameIdentifier>
    <SubjectConfirmation>
     <ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</ConfirmationMethod>
    </SubjectConfirmation>
   </Subject>
   <SubjectLocality IPAddress="127.0.0.1"/>
  </AuthenticationStatement>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
   <ds:SignedInfo>
    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <ds:Reference URI="#_a75adf55-01d7-40cc-929f-dbd8372ebdfc">
     <ds:Transforms>
      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
       <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
        xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </ds:Transform>
     </ds:Transforms>
     <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
     <ds:DigestValue>Kclet6XcaOgOWXM4gty6/UNdviI=</ds:DigestValue>
    </ds:Reference>
   </ds:SignedInfo>
   <ds:SignatureValue>hq4zk+ZknjggCQgZm7ea8fI79gJEsRy3E8LHDpYXWQIgZpkJN9CMLG8ENR4Nrw+n7iyzixBvKXX8P53BTCT4VghPBWhFTSt9tHWu/AtJfOTh6qaAsNdeCyG86jmtp3TDMWuL/cBUj2OtBZOQMFn7jQ9YB7k1Iz3RqVL+wNmeWI4=</ds:SignatureValue>
   <ds:KeyInfo>
    <ds:X509Data>
     <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
    </ds:X509Data>
   </ds:KeyInfo>
  </ds:Signature>
 </Assertion>
</Response>

では、このようなものを生成するにはどうすればよいでしょうか?このようなものを受け取った場合、どうやってそれを検証すればよいでしょうか?また、誰がその内容についての基本的な概念的な概要だけを提供できますか? <ds:Signature> タグはここにありますか?2つあるようです <ds:Signature> タグ、メインに 1 つ <Response> そしてそのうちの1つ <Assertion>, 、それぞれに独自の内容が含まれています <ds:DigestValue>, <ds:SignatureValue>, 、 そして <ds:X509Certificate> (そしてそれぞれが異なる)。これらはどのようにして生成されるのでしょうか?これについてご意見をいただければ幸いです。チュートリアルやコード例はさらにありがたいです。しかし、現時点では、私を正しい方向に導いていただければ、私が本当に求めているのはそれだけです。今のところ、私にとってはまだすべてが大きなブラックボックスのように思えます。

ちなみに、これが役立つ場合は、SAML 1.1 仕様の他の場所で、SAML 実装では「排他的正規化」メソッド (Excl-C14N) のみを使用し、「エンベロープ変換」のみを使用する必要があると記載されています。それが何を意味するのかはまだ完全にはわかりません。

役に立ちましたか?

解決

XML に精通している場合、XML 署名の処理は実際にはそれほど難しくありませんが、完全に正しくなければ機能しない詳細がたくさんあるため、おそらくこれで独自の実装を作成しようとは思わないでしょう。 (一度部分的に実装しましたが、それは別の特別な目的のためであり、とにかく完全な実装ではありませんでした)。

いずれにせよ、私は SAML についてはあまり詳しくありませんが、XML と XML 署名については知っているので、質問に答えてみることである程度は分かるかもしれません。

Signature 要素は、デジタル署名された XML ドキュメントの特定の部分を参照します。 SignedInfo 子要素。の Reference その子要素 ​​(たくさんあると思います) Reference 署名されるバイトを形成するときに連結される要素ですが、もうはっきりとは覚えていません) を通じてコン​​テンツを指します。 URI 属性。の Transform 要素は、参照先のコンテンツをハッシュする前に実行される変換を記述します。変換アルゴリズムがどのように定義されているかを理解するには、仕様を確認する必要があります。の DigestMethod 要素は、これらの変換アルゴリズムの結果であるバイトに適用するハッシュ アルゴリズムを指定します (そのうちの 1 つは常に XML をバイトに変換する正規化であることに注意してください)。 DigestValue そのダイジェスト アルゴリズムの結果が得られます。

実際の署名は次のとおりです。 SignatureValue 要素を適用して生成されます。 CanonicalizationMethod 要素を正規化してバイトを生成し、これらのバイトに SignatureMethod. 。の KeyInfo 要素は、使用するキーを見つける方法を示します。

上で何度か登場した正規化は、XML ドキュメントをバイトに変換して、「同等の」XML ドキュメントが同じバイトのシーケンスを生成するようにする単純な方法です。アルゴリズムはバイトで動作し、XML は元のバイトを破壊する可能性があるが等価性を保持する多数の仲介者を通過できるため、デジタル署名ではこれが必要です。また、状況に応じて異なる正規化方法が必要になります。要素がドキュメントから抽出され、他の要素に配置される場合は、不要な名前空間定義を削除する排他的正規化が必要ですが、それが正しく機能しない場合もあるため、代わりにスコープ内のすべての名前空間を保持する包括的な正規化が必要になります。

これは単なる基本です。XML 署名を生成する方法にはさまざまなオプションがあり、機能するベリファイアを実装したい場合は、それらすべてを考慮する必要があります。XML については一般的には初心者なので、既存のものを使用するというアドバイスを繰り返します。仕様を実装するのは興味深い学習体験ですが、実装がすでに利用可能な場合は時間の無駄であることがよくあります。

W3Cもあるよ ドキュメンテーション サインについて。

他のヒント

xmlseclibs.php に例があります。 シンプルSAML. 。暗号化を行うには openssl モジュールに依存します。

正直に言うと、デバッグが必要になる可能性のある相互運用性の問題が発生する可能性があるため、そのライブラリまたは java/tomcat へのブリッジを使用します。

  1. この Java lib を参照して、SAML リクエストの例に署名できます。 https://github.com/jrowny/java-saml

  2. 署名を検証するには、SAML トレーサ アドオンをインストールする必要があります https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/

  3. ツールを使用できます https://www.samltool.com/validate_logout_req.php リクエストを検証または署名するには https://www.samltool.com/sign_logout_req.php

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top