W pracy mamy aplikację internetową, która będzie musiała być połączona z aplikacją internetową innej firmy za pomocą funkcji logowania jednokrotnego zatwierdzonej przez SAML. Nasze aplikacje internetowe są napisane w PHP i oczywiście nie ma znaczenia, jakiego wyboru języka używa druga firma. Niemniej jednak, musiałem napisać prosty interfejs API, aby ta druga firma mogła wysyłać żądania SOAP do żądań SAML i wygenerować odpowiedź SAML. Pisałem to od zera z trzech powodów: 1) tak naprawdę nie wydaje się, że istnieje wiele opcji interakcji SAML napisanych w PHP, nawet gdybym chciał, 2) to ogranicza obciążenie, które mogłoby być zaangażowane z dodawaniem kolejnego komponentu strony trzeciej i 3) tworzenie rzeczy od zera zwykle daje mi znacznie lepsze zrozumienie i czyni mnie znacznie bardziej zdolnym do adaptowania tego w przyszłości, jeśli jest to konieczne.Co muszę wiedzieć o podpisach XML, aby uzyskać działanie SAML?
W każdym razie, jestem całkiem nowy w standardach SAML, SOAP i XML w ogóle, więc w pewnym sensie uczyłem się samego siebie. Interfejs API jest prawie kompletny dla naszych celów, z jednym wyjątkiem, że druga firma określiła, że nasza odpowiedź będzie wymagać podpisu cyfrowego za pomocą certyfikatu (a otrzymane żądanie będzie również podpisane cyfrowo). Tak więc próbowałem dowiedzieć się, jak przetwarzać/generować podpisy XML, ale szczerze mówiąc, to wszystko jest trochę mylące, ponieważ specyfikacje W3C nie są dokładnie lekkim czytaniem.
W sekcji 5.4.8 dokumentu Assertions and Protocol for the OASIS Security Markup Language (SAML) V1.1 (dokument, który opisuję, jako że inne przedsiębiorstwo mówiło, że będzie używał wersji 1.1), znajduje się przykład podpisanej odpowiedzi zawierającej podpisany asercję, którą "tu zawrzeć:
<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>
Jak mogę wygenerować coś takiego? A jeśli otrzymam coś takiego, jak mogę to sprawdzić? Czy każdy może zaoferować tylko podstawowy przegląd pojęć związanych z tagami <ds:Signature>
? Wygląda na to, że istnieją dwa znaczniki <ds:Signature>
, jeden w głównym <Response>
i jeden w <Assertion>
, z których każdy zawiera własny <ds:DigestValue>
, <ds:SignatureValue>
i <ds:X509Certificate>
(i każdy inny). Jak są generowane? Każde światło, które można rzucić na ten temat, zostanie docenione. Ćwiczenia lub przykłady kodu byłyby jeszcze bardziej doceniane! Ale w tym momencie, jeśli możesz po prostu doprowadzić mnie na właściwą drogę, to wszystko, o co naprawdę proszę. Teraz wszystko wydaje mi się wielką czarną skrzynką.
Nawiasem mówiąc, jeśli to pomaga, w innym miejscu specyfikacji SAML 1.1 stwierdza się, że implementacje SAML powinny wykorzystywać tylko metodę "Ekskluzywnej kanonizacji" (Excl-C14N) i powinny używać tylko "transformacji kopertowej". Wciąż nie jestem do końca pewien, co to oznacza.
Po określeniu ca Algorytm nonikalizacji w elemencie metody kanonizacji podpisanego elementu informacyjnego, dlaczego powinieneś go ponownie podać w elemencie transforms? – Ashwin
@Ashwin: 'CanonicalizationMethod' w' SignedInfo' jest tym, co jest stosowane do elementu 'SignedInfo', jakakolwiek kanonizacja w transformacjach jest stosowana do odnośnej treści, więc mają one zastosowanie do różnych rzeczy, i dlatego potrzebujesz obu. Podpisana treść nie musi też być XML, więc kanonizacja niekoniecznie ma zastosowanie. – JaakkoK
dzięki za to :) Jest jeszcze jeden obszar, w którym utknąłem. Wymagane jest użycie xslt w elemencie transforms. Nie ma przykładu, jak go używać w Javie. Jeśli to możliwe, możesz podać przykładowy kod lub wskazać łącze, które używa xslt w podpisach xml z java. – Ashwin