職場では、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)のみを使用し、「エンベロープ変換」のみを使用する必要があると述べています。それが何を意味するのかまだ完全にはわかりません。