2009-12-20 12 views
15

काम पर हमारे पास एक वेब ऐप है जिसे हमें एसएएमएल द्वारा मान्य सिंगल साइन ऑन का उपयोग करके किसी अन्य कंपनी के वेब ऐप के साथ इंटरफेस करने की आवश्यकता होगी। हमारे वेब ऐप्स PHP में लिखे गए हैं, और यह स्पष्ट रूप से अप्रासंगिक है कि दूसरी कंपनी किस भाषा पसंद का उपयोग कर रही है। फिर भी, मुझे एक साधारण एपीआई लिखने की आवश्यकता है कि यह अन्य कंपनी एसएएमएल अनुरोधों के साथ एसओएपी अनुरोध भेज सकती है, और एक एसएएमएल प्रतिक्रिया उत्पन्न कर सकती है। मैं इसे तीन कारणों से स्क्रैच से लिख रहा हूं: 1) वास्तव में PHP में लिखे गए SAML इंटरैक्शन के लिए कई विकल्प नहीं दिखते हैं, भले ही मैं एक चाहता हूं, 2) यह उस ओवरहेड को सीमित करता है जो शामिल होगा एक और तीसरे पक्ष के घटक जोड़ने के साथ, और 3) स्क्रैच से चीजें बनाने से आम तौर पर मुझे काफी बेहतर समझ मिलती है और यदि आवश्यक हो तो मुझे भविष्य में चीज़ को अनुकूलित करने में अधिक सक्षम बनाता है।SAML काम करने के लिए मुझे XML हस्ताक्षर के बारे में क्या जानने की आवश्यकता है?

वैसे भी, मैं सामान्य रूप से एसएएमएल, एसओएपी, और एक्सएमएल मानकों के लिए बिल्कुल नया हूं, इसलिए मैं खुद को पढ़ाने के लिए खुद को पढ़ रहा हूं। मुझे एपीआई हमारे उद्देश्यों के लिए बहुत अधिक पूर्ण मिला है, एक अपवाद के साथ कि दूसरी कंपनी ने यह निर्दिष्ट किया है कि हमारी प्रतिक्रिया को प्रमाण पत्र के साथ डिजिटल हस्ताक्षर करने की आवश्यकता होगी (और हमें प्राप्त अनुरोध को डिजिटल रूप से हस्ताक्षरित किया जाएगा)। तो मैं एक्सएमएल हस्ताक्षर को संसाधित/उत्पन्न करने का तरीका जानने का प्रयास कर रहा हूं, लेकिन ईमानदारी से यह थोड़ा उलझन में है क्योंकि डब्ल्यू 3 सी चश्मा बिल्कुल हल्के पढ़ने नहीं हैं।

Assertions and Protocol for the OASIS Security Markup Language (SAML) V1.1 दस्तावेज़ (जिस दस्तावेज़ को मैं बंद कर रहा हूं, जैसा कि अन्य कंपनी ने कहा है कि वे v1.1 का उपयोग करेंगे) के हस्ताक्षर 5.4.8 में हस्ताक्षर किए गए हस्ताक्षर वाले एक हस्ताक्षरित प्रतिक्रिया का एक उदाहरण शामिल है, जो मैं मैं संदर्भ में शामिल करने जा रहा हूं:

<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> 

तो मैं ऐसा कुछ कैसे उत्पन्न करूं? और अगर मुझे ऐसा कुछ मिलता है, तो मैं इसे कैसे सत्यापित करूं? साथ ही, क्या कोई भी <ds:Signature> टैग्स के बारे में केवल एक बुनियादी अवधारणात्मक अवलोकन प्रदान कर सकता है? अपने स्वयं के <ds:DigestValue>, <ds:SignatureValue>, और <ds:X509Certificate> (और प्रत्येक विशिष्ट) ऐसा लगता है वहाँ दो <ds:Signature> टैग, मुख्य <Response> में एक और एक <Assertion> में हैं, प्रत्येक युक्त। ये कैसे उत्पन्न होते हैं? इस पर प्रकाश डालने वाली कोई भी प्रकाश बहुत सराहना की जाएगी। ट्यूटोरियल या कोड उदाहरणों की और भी सराहना की जाएगी! लेकिन इस बिंदु पर, अगर आप मुझे सही रास्ते पर ले जा सकते हैं, तो मैं वास्तव में यही पूछ रहा हूं। अभी यह सब अभी भी मेरे लिए एक बड़ा काला बॉक्स जैसा लगता है।

वैसे, अगर यह मदद करता है, तो यह SAML 1.1 spec में कहीं और कहता है कि SAML कार्यान्वयन को केवल "एक्सक्लूसिव कैनोलिकलाइजेशन" विधि (एक्सेल-सी 14 एन) का उपयोग करना चाहिए और केवल "लिफाफा ट्रांसफॉर्म" का उपयोग करना चाहिए। मुझे अभी भी पूरी तरह से यकीन नहीं है कि इसका क्या अर्थ है।

उत्तर

27

प्रसंस्करण एक्सएमएल हस्ताक्षर, वास्तव में बहुत मुश्किल नहीं है अगर आप बहुत परिचित हैं एक्सएमएल के साथ, लेकिन बहुत सारे विवरण हैं जो बिल्कुल सही हैं या चीजें काम नहीं करती हैं, इसलिए शायद मैं इस स्थिति में अपना खुद का कार्यान्वयन लिखने की कोशिश नहीं करूंगा (मैंने इसे आंशिक रूप से एक बार लागू किया था, लेकिन यह एक के लिए था अलग और विशेष उद्देश्य, और वैसे भी यह एक पूर्ण कार्यान्वयन नहीं था)।

वैसे भी, मैं SAML बारे में ज्यादा पता नहीं है, लेकिन मैं एक्सएमएल और XML हस्ताक्षर के बारे में पता है, इसलिए हो सकता है मैं तुम्हें रास्ते से कुछ आपके सवालों के जवाब की कोशिश कर रहा द्वारा प्राप्त कर सकते हैं।

Signature तत्व एक XML दस्तावेज़ के एक विशिष्ट टुकड़े को संदर्भित करता है जिसे SignedInfo बाल तत्व में डिजिटल हस्ताक्षर किया गया है। Reference उस के बच्चे तत्व (मुझे लगता है कि कई Reference तत्व हो सकते हैं जो बाइट्स पर हस्ताक्षर किए जाने पर संयोजित होते हैं लेकिन मुझे अब और याद नहीं है) URI विशेषता के माध्यम से सामग्री को इंगित करता है। Transform तत्व इसे हैशिंग से पहले संदर्भित सामग्री पर किए गए परिवर्तनों का वर्णन करते हैं; परिवर्तन एल्गोरिदम को परिभाषित करने के तरीके के बारे में जानने के लिए आपको विनिर्देशों को देखने की आवश्यकता होगी। DigestMethod तत्व हैश एल्गोरिदम को बाइट्स पर लागू करने के लिए देता है जो इन परिवर्तन एल्गोरिदम के परिणाम हैं (ध्यान दें कि उनमें से एक हमेशा कैननिकलकरण है जो एक्सएमएल को बाइट्स में परिवर्तित करता है), और DigestValue उस पाचन एल्गोरिदम का परिणाम देता है।

वास्तविक हस्ताक्षर SignatureValue तत्व में है, और बाइट्स का उत्पादन करने के CanonicalizationMethod तत्व के कैनॉनिकलाइज़ेशन लागू करने और उसके बाद SignatureMethod के साथ इन बाइट्स पर हस्ताक्षर करने के द्वारा निर्मित है। KeyInfo तत्व आपको बताता है कि उपयोग करने के लिए कुंजी कैसे खोजें।

कैननिकलकरण, जो ऊपर दो बार दिखाई देता है, एक एक्सएमएल दस्तावेज़ को बाइट्स में परिवर्तित करने का एक तरीका है ताकि "समकक्ष" एक्सएमएल दस्तावेज़ बाइट्स के समान अनुक्रम उत्पन्न कर सकें। यह एक डिजिटल हस्ताक्षर में आवश्यक है क्योंकि बाइट्स और एक्सएमएल पर काम करने वाले एल्गोरिदम कई मध्यस्थों से गुजर सकते हैं जो शायद मूल बाइट्स को बाधित करेंगे लेकिन समकक्ष बनाए रखेंगे। और अलग-अलग स्थितियों के लिए अलग-अलग कैननिकलाइज़ेशन विधियों की आवश्यकता होती है: यदि तत्वों को दस्तावेजों से निकाला जाता है और दूसरों में रखा जाता है, तो आपको अनन्य कैनोनिकललाइजेशन की आवश्यकता होती है जो अनियंत्रित नामस्थान परिभाषाओं को दूर करता है, लेकिन अन्य मामलों में जो सही ढंग से काम नहीं कर सकता है, इसलिए आपको इसके बजाय समावेशी कैननिकलाइज़ेशन की आवश्यकता है, सभी इन-स्कोप नेमस्पेस को सुरक्षित रखता है।

यह सिर्फ मूल बातें है। XML हस्ताक्षर कैसे उत्पन्न करें, इसमें कई अलग-अलग विकल्प हैं, और यदि आप एक कार्यशील सत्यापनकर्ता को कार्यान्वित करना चाहते हैं, तो आपको उन सभी पर विचार करने की आवश्यकता है। चूंकि आप सामान्य रूप से एक्सएमएल के लिए नए हैं, इसलिए मैं पहले से मौजूद कुछ का उपयोग करने की मेरी सलाह दोहरा दूंगा। यह एक विनिर्देश लागू करने के लिए एक दिलचस्प सीखने का अनुभव है, लेकिन अक्सर कार्यान्वयन पहले से ही उपलब्ध होने पर यह समय बर्बाद है।

+0

जब आपने सीए निर्दिष्ट किया है हस्ताक्षरित जानकारी तत्व के canonicalization विधि तत्व में nonicalization एल्गोरिदम, आप इसे फिर से बदलने तत्व में क्यों निर्दिष्ट करना चाहिए? – Ashwin

+1

@Ashwin: 'SignedInfo' में' CanonicalizationMethod' 'साइनडइन्फो' तत्व पर लागू होता है, ट्रांसफॉर्म में किसी भी कैनोलिकलाइजेशन को संदर्भित सामग्री पर लागू किया जाता है, इसलिए वे अलग-अलग चीजों पर लागू होते हैं, और यही कारण है कि आपको दोनों की आवश्यकता है। साथ ही, हस्ताक्षरित सामग्री को एक्सएमएल होने की आवश्यकता नहीं है, इसलिए कैनोनिकललाइजेशन लागू नहीं है। – JaakkoK

+0

इसके लिए धन्यवाद :) एक और क्षेत्र है जहां मैं फंस गया हूं। मुझे ट्रांसफॉर्म तत्व में xslt का उपयोग करने की आवश्यकता है। जावा में इसका उपयोग करने का कोई उदाहरण नहीं है। यदि संभव हो तो आप एक नमूना कोड दे सकते हैं या जावा के साथ एक्सएमएल हस्ताक्षर में xslt का उपयोग करने वाले लिंक पर इंगित कर सकते हैं। – Ashwin

2

SimpleSAML में xmlseclibs.php में एक उदाहरण नहीं है। यह क्रिप्टो करने के लिए openssl मॉड्यूल पर निर्भर करता है।

मैं ईमानदारी से, जावा/बिल्ला करने के लिए कि lib या पुल का प्रयोग करेंगे सिर्फ इसलिए इंटरॉप मुद्दों आ सकता है कि संभावित डिबग करने की आवश्यकता होगी,

0
  1. आप 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 उपयोग कर सकते हैं की जरूरत है प्रमाणित करने के लिए हस्ताक्षर करने के लिए इस जावा lib पर देख सकते हैं अनुरोध को सत्यापित करने या हस्ताक्षर करने के लिए https://www.samltool.com/sign_logout_req.php

संबंधित मुद्दे

 संबंधित मुद्दे