2009-12-20 11 views
15

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.

Antwort

27

Verarbeitung von XML-Signaturen nicht wirklich zu schwierig ist, wenn man sehr vertraut mit XML, aber es gibt viele Details, die absolut richtig sein müssen oder Dinge nicht funktionieren, also würde ich wahrscheinlich nicht versuchen, meine eigene Implementierung in dieser Situation zu schreiben (ich habe es teilweise implementiert, aber das war für eine anderer und spezieller Zweck, und überhaupt war es keine vollständige Implementierung).

Wie auch immer, ich weiß nicht viel über SAML, aber ich weiß über XML und XML-Signaturen, also kann ich Ihnen vielleicht einen Teil des Weges beschreiten, indem ich versuche, Ihre Fragen zu beantworten.

Ein Signature Element bezieht sich auf ein bestimmtes Teil eines XML-Dokuments, das in seinem SignedInfo untergeordneten Element digital signiert wurde. Das untergeordnete Element Reference (ich glaube, es gibt viele Reference Elemente, die verkettet werden, wenn die zu unterzeichnenden Bytes gebildet werden, aber ich erinnere mich nicht mehr sicher), zeigt auf den Inhalt durch das URI Attribut. Die Elemente Transform beschreiben Umwandlungen, die an dem Inhalt durchgeführt werden, auf den Bezug genommen wird, vor dem Hashing; Sie müssen sich die Spezifikationen ansehen, um herauszufinden, wie die Transformationsalgorithmen definiert sind. Das Element DigestMethod gibt den Hashalgorithmus an, der auf die Bytes angewendet werden soll, die das Ergebnis dieser Transformationsalgorithmen sind (beachten Sie, dass eine davon immer Kanonisierung ist, die XML in Bytes konvertiert), und DigestValue gibt das Ergebnis dieses Digestalgorithmus an.

Die eigentliche Signatur ist im SignatureValue Elemente und durch Anlegen des CanonicalizationMethod Element Kanonisierungsprobleme zu erzeugen, das Bytes und dann diese Bytes Signieren mit den SignatureMethod hergestellt. Das Element KeyInfo zeigt Ihnen, wie Sie den zu verwendenden Schlüssel finden.

Canonicalization, die ein paar Mal oben angezeigt wird, ist einfach eine Möglichkeit, ein XML-Dokument in Bytes zu konvertieren, so dass "äquivalente" XML-Dokumente die gleiche Sequenz von Bytes produzieren. Dies ist in einer digitalen Signatur erforderlich, da die Algorithmen an Bytes arbeiten und XML eine Anzahl von Vermittlern durchlaufen kann, die wahrscheinlich die ursprünglichen Bytes stören, aber die Äquivalenz beibehalten. Für unterschiedliche Situationen sind unterschiedliche Kanonisierungsmethoden erforderlich: Wenn Elemente aus Dokumenten extrahiert und in andere eingefügt werden, benötigen Sie eine exklusive Kanonisierung, die nicht benötigte Namespacedefinitionen entfernt, in anderen Fällen jedoch nicht ordnungsgemäß funktioniert. Daher benötigen Sie eine inklusive Kanonisierung behält alle Namespaces im Gültigkeitsbereich bei.

Dies sind nur die Grundlagen. Es gibt eine Reihe verschiedener Optionen für die Erstellung einer XML-Signatur. Wenn Sie einen funktionsfähigen Prüfer implementieren möchten, müssen Sie alle berücksichtigen. Da Sie XML im Allgemeinen neu sind, wiederhole ich einfach meinen Rat, etwas zu verwenden, das bereits existiert. Es ist eine interessante Lernerfahrung, eine Spezifikation zu implementieren, aber oft ist es Zeitverschwendung, wenn Implementierungen bereits verfügbar sind.

+0

Wenn Sie die ca Nichtisierungsalgorithmus im Element kanonization method des signierten info-Elements, warum sollten Sie es im transforms-Element erneut angeben? – Ashwin

+1

@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

+0

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

2

Es gibt ein Beispiel in xmlseclibs.php in . Es stützt sich auf das OpenSSL-Modul, um das Krypto zu machen.

ich ehrlich, dass lib oder Brücke zu java/tomcat verwenden würde, nur weil Interop-Probleme nach oben kommen könnte, dass potenziell getestet werden müssten,

Verwandte Themen