Bei der Arbeit haben wir eine Web-App, die wir mit der Web-App eines anderen Unternehmens verbinden müssen, indem wir Single Sign On verwenden, das von SAML validiert wurde. Unsere Web-Apps sind in PHP geschrieben, und es ist offensichtlich irrelevant, welche Sprachwahl das andere Unternehmen verwendet. Nichtsdestoweniger musste ich eine einfache API schreiben, mit der diese andere Firma SOAP-Anfragen an SAML-Anfragen senden kann, und eine SAML-Antwort zurückgeben. Ich habe es aus drei Gründen von Grund auf neu geschrieben: 1) dort scheinen nicht wirklich viele Optionen für SAML-Interaktionen geschrieben in PHP zu sein, auch wenn ich wollte, 2) es begrenzt den Aufwand, der beteiligt wäre mit dem Hinzufügen einer anderen Komponente von Drittanbietern, und 3) Dinge von Grund auf neu zu erstellen in der Regel verlässt mir mit einem deutlich besseren Verständnis und macht mich viel fähiger, das Ding in der Zukunft anzupassen, wenn nötig.Was muss ich über XML-Signaturen wissen, damit SAML funktioniert?
Wie auch immer, ich bin ziemlich neu zu SAML, SOAP und XML-Standards im Allgemeinen, also habe ich mich selbst unterrichtet, wie ich gehe. Ich habe die API ziemlich vollständig für unsere Zwecke, mit der einen Ausnahme, dass die andere Firma angegeben hat, dass unsere Antwort digital signiert werden muss (und die Anfrage, die wir erhalten, wird ebenfalls digital signiert). Also habe ich versucht, herauszufinden, wie man die XML-Signaturen verarbeitet/generiert, aber ehrlich gesagt ist alles ein wenig verwirrend, da W3C-Spezifikationen nicht gerade leicht lesbar sind.
Abschnitt 5.4.8 des Dokuments Assertions and Protocol for the OASIS Security Markup Language (SAML) V1.1 (das Dokument, das ich ausgehe, da das andere Unternehmen sagte, dass sie v1.1 verwenden werden) enthält ein Beispiel für eine signierte Antwort, die eine signierte Behauptung enthält, die ich werde hier zum referenzieren:
<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">[email protected]</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>
Also wie erzeuge ich sowas so? Und wenn ich so etwas erhalte, wie kann ich es bestätigen? Kann jemand auch nur einen grundlegenden begrifflichen Überblick über das anbieten, was die <ds:Signature>
Tags hier sind? Es scheint, gibt es zwei <ds:Signature>
Tags, eine in der Haupt <Response>
und eine in der <Assertion>
, die jeweils ihre eigenen <ds:DigestValue>
, <ds:SignatureValue>
, und <ds:X509Certificate>
(und jede einzelne). Wie werden diese generiert? Jedes Licht, das Sie auf dieses Licht werfen können, wird sehr geschätzt. Tutorials oder Codebeispiele würden noch mehr geschätzt werden! Aber an diesem Punkt, wenn Sie mich nur auf den richtigen Weg bringen können, ist das alles was ich wirklich wünsche. Im Moment scheint mir alles noch wie eine große Blackbox.
Wenn dies hilfreich ist, heißt es an anderer Stelle in der SAML 1.1-Spezifikation, dass SAML-Implementierungen nur die Methode "Exclusive Canonicalization" (Excl-C14N) verwenden und nur die "enveloped transform" verwenden sollen. Ich bin mir immer noch nicht ganz sicher, was das bedeutet.
Wenn Sie die ca Nichtisierungsalgorithmus im Element kanonization method des signierten info-Elements, warum sollten Sie es im transforms-Element erneut angeben? – Ashwin
@Ashwin: Die 'CanonicalizationMethod' in' SignedInfo' wird auf das 'SignedInfo'-Element angewendet. Jede Kanonisierung in den Transformationen wird auf den referenzierten Inhalt angewendet, sodass sie auf verschiedene Dinge angewendet werden. Deshalb benötigen Sie beide. Außerdem muss der signierte Inhalt nicht XML sein, sodass die Kanonisierung nicht unbedingt anwendbar ist. – JaakkoK
danke dafür :) Es gibt noch einen Bereich, in dem ich feststecke. Ich bin verpflichtet, xslt im transforms-Element zu verwenden. Es gibt kein Beispiel für die Verwendung in Java. Wenn möglich, können Sie einen Beispielcode angeben oder auf einen Link verweisen, der xslt in XML-Signaturen mit Java verwendet. – Ashwin