19

職場では、SAMLによって検証されたシングルサインオンを使用して他社のWebアプリとインターフェイスする必要があるWebアプリがあります。私たちのウェブアプリはPHPで書かれており、他社が使用している言語の選択とは明らかに無関係です。それでも、この他社がSAMLリクエストを使用してSOAPリクエストを送信し、SAMLレスポンスを生成できる単純なAPIを作成する必要がありました。私は3つの理由でゼロから作成してきました:1) PHPで記述されたSAMLインタラクションには、必要なオプションがあまりないようです。2)さらに3分の1を追加するためのオーバーヘッドが制限されます。 -パーティコンポーネント、および3)ゼロから物を作成することは、通常、私に非常に良い理解を残し、必要に応じて将来的に物を適応させる能力をはるかに高めます。

とにかく、私は一般的にSAML、SOAP、およびXML標準にかなり慣れていないので、私は自分自身を少しずつ教えてきました。私たちの目的のためにAPIはほぼ完成していますが、他の会社が、私たちの応答は証明書を使用してデジタル署名する必要があると指定していることを除いて(そして私たちが受け取るリクエストも同様にデジタル署名されます)。だから私はXML署名を処理/生成する方法を理解しようとしてきましたが、正直なところ、W3Cの仕様は正確に読みにくいので、少し混乱しています。

OASISセキュリティマークアップ言語(SAML)V1.1ドキュメントのアサーションとプロトコルのセクション5.4.8 (他の会社が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)のみを使用し、「エンベロープ変換」のみを使用する必要があると述べています。それが何を意味するのかまだ完全にはわかりません。

4

3 に答える 3

34

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

とにかく、私はSAMLについてはあまり知りませんが、XMLとXML署名については知っているので、質問に答えることで、いくつかの方法を得ることができるかもしれません。

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

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

上記で数回表示される正規化は、XMLドキュメントをバイトに変換する方法であり、「同等の」XMLドキュメントが同じバイトシーケンスを生成するようにします。これはデジタル署名で必要です。アルゴリズムはバイトで機能し、XMLは元のバイトを混乱させる可能性があるが、同等性を保持する多くの中間体を通過できるためです。また、さまざまな状況でさまざまな正規化方法が必要です。要素がドキュメントから抽出されて他の要素に配置される場合は、不要な名前空間定義を取り除く排他的な正規化が必要ですが、それ以外の場合は正しく機能しない可能性があるため、代わりに包括的正規化が必要です。スコープ内のすべての名前空間を保持します。

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

署名に関するW3Cのドキュメントがあります。

于 2009-12-20T22:53:56.677 に答える
2

SimpleSAMLのxmlseclibs.phpに例があります。暗号化を行うためにopensslモジュールに依存しています。

デバッグが必要になる可能性のある相互運用の問題が発生する可能性があるという理由だけで、私は正直にそのlibまたはjava/tomcatへのブリッジを使用します。

于 2009-12-20T22:43:38.763 に答える
0
  1. このJavaライブラリを見て、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

于 2016-07-16T22:42:31.987 に答える