SAML: हस्ताक्षर के भीतर प्रमाण पत्र क्यों है?


103

मुझे अपनी कंपनी की वेबसाइट (निर्भर पार्टी के रूप में) के लिए एसएसएल को एसएसएल के साथ लागू करना होगा। एक अनिवार्य हिस्सा ऑफ कोर्स हस्ताक्षर का सत्यापन है। यहाँ एक नमूना नमूना का हिस्सा है जो हमारी सहयोगी कंपनी (पार्टी का दावा करते हुए) से है:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
 <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
  <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
  <ds:Reference URI="#_2152811999472b94a0e9644dbc932cc3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
   <ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
     <ec:InclusiveNamespaces PrefixList="ds saml samlp xs" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    </ds:Transform>
   </ds:Transforms>
   <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
   <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">bW1Os7+WykqRt5h0mdv9o3ZF0JI=</ds:DigestValue>
  </ds:Reference>
 </ds:SignedInfo>
 <ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
cgrAN4T/UmobhrkkTi3miiRfbo0Z7aakSZjXuTWlZlu9jDptxPNbOFw8ZbYKZYyuW544wQqgqpnG
gr5GBWILSngURjf2N45/GDv7HMrv/NRMsRMrgVfFsKbcAovQdLAs24O0Q9CH5UdADai1QtDro3jx
nl4x7HaWIo9F8Gp/H1c=
 </ds:SignatureValue>
 <ds:KeyInfo>
  <ds:X509Data>
   <ds:X509Certificate>MIIElzCCA3+gAwIBAgIQNT2i6HKJtCXFUFRB8qYsZjANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
    EwJGUjEOMAwGA1UEBxMFUGFyaXMxDDAKBgNVBAoTA3BzYTEgMB4GA1UECxMXY2VydGlmaWNhdGUg
    YXV0aG9yaXRpZXMxKDAmBgNVBAMTH0FDIFBTQSBQZXVnZW90IENpdHJvZW4gUHJvZ3JhbXMwHhcN
    MDkwODE5MDcxNTE4WhcNMTEwODE5MDcxNTE5WjCBhjELMAkGA1UEBhMCZnIxHzAdBgkqhkiG9w0B
    CQEWEHBhc3NleHRAbXBzYS5jb20xGDAWBgoJkiaJk/IsZAEBEwhtZGVtb2IwMDEMMAoGA1UEChMD
    cHNhMREwDwYDVQQLEwhwcm9ncmFtczEbMBkGA1UEAxMSVGVzdCAtIFBBU1NFWFQgREVWMIGfMA0G
    CSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuY1nrepgACvDSTLWk5A1cFOJSwDbl6CWfYp3cNYR0K3YV
    e07MDZn+Rv4jo3SusHVFds+mzKX2f8AeZjkA3Me/0yiS9UpS9LQZu9mnhFlZRhmUlDDoIZxovLXN
    aOv/YHmPeTQMQmJZu5TjqraUq7La1c187AoJuNfpxt227N1vOQIDAQABo4IBkTCCAY0wDgYDVR0P
    AQH/BAQDAgWgMB8GA1UdIwQYMBaAFLceWtTfVeRuVCTDQWkmwO4U01X/MAwGA1UdEwEB/wQCMAAw
    gbYGA1UdIASBrjCBqzCBqAYKKoF6ARfOEAEBBDCBmTBBBggrBgEFBQcCARY1aHR0cDovL3JldW5p
    cy5pbmV0cHNhLmNvbS9hdXRvcml0ZS9QQy1BQy1Qcm9ncmFtcy5wZGYwVAYIKwYBBQUHAgIwSDAK
    FgNwc2EwAwIBARo6UG9saXRpcXVlIGRlIENlcnRpZmljYXRpb24gQUMgUFNBIFBldWdlb3QgQ2l0
    cm9lbiBQcm9ncmFtczBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vaW5mb2NlcnQucHNhLXBldWdl
    b3QtY2l0cm9lbi5jb20vQUMtUFNBLVBldWdlb3QtQ2l0cm9lbi1Qcm9ncmFtcy5jcmwwHQYDVR0l
    BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBYGA1UdDgQPBA1BVVRPX0dFTkVSQVRFMA0GCSqGSIb3
    DQEBBQUAA4IBAQCvRtP6bFkOUEHcqc6yUX0Q1Gk2WaAcx4ziUB0tw2GR9I0276JRJR0EGuJ/N6Fn
    3FhLQrSPmS97Xvc9XmiI66fQUdg64g9YqBecdiQlUkR20VLgI6Nq8pldQlWjU2iYlkP15U7VF4Qr
    0Pb2QiIljZUCKdv3qdED2Ri33za46LfykrlwZB0uhTVUxI/AEtjkKVFaZaqanJg+vJyZI5b30z7g
    Ff8L3ht4Z7SFKdmY3IQSGzElIAAUfduzTJX0cwnGSU9D4BJu1BS8hWnYPwhk+nBJ7OFhXdwYQFWq
    fhpBLq+ciJti9OMhcdCSIi0PbrOqzqtX7hZUQOvfShhCTJnl5TJJ</ds:X509Certificate>
  </ds:X509Data>
 </ds:KeyInfo>
</ds:Signature>

मुझे जो समझ में नहीं आ रहा है, वह हस्ताक्षर के भीतर प्रमाण पत्र क्यों है?

मेरा मतलब है कि आमतौर पर मुझे कंपनी से सुरक्षित तरीके से प्रमाण पत्र मिलता है, इसलिए मुझे पता है कि प्रमाण पत्र उन्हीं का है। और जब हस्ताक्षर का सत्यापन सफल हो जाता है, मुझे पता है कि हमारी साझेदार कंपनी ने इस पर हस्ताक्षर किए हैं।

लेकिन जब प्रमाणपत्र एसएएमएल-रिस्पांस के हस्ताक्षर के भीतर है, तो कोई भी इसे भेज सकता है! केवल एक चीज मुझे पता है कि प्रतिक्रिया को गलत नहीं ठहराया गया है। लेकिन बात यह है कि मुझे कोई अंदाजा नहीं है कि एसएएमएल ने किसे भेजा है।

क्या कोई मुझे समझा सकता है, कैसे काम करता है?

जवाबों:


66

एसएएमएल प्रतिक्रियाएं एक हस्ताक्षर और उस हस्ताक्षर के लिए एक सार्वजनिक कुंजी के साथ आती हैं।

आप सार्वजनिक कुंजी का उपयोग यह सत्यापित करने के लिए कर सकते हैं कि एसएएमएल प्रतिक्रिया की सामग्री कुंजी से मेल खाती है - दूसरे शब्दों में - यह प्रतिक्रिया निश्चित रूप से किसी ऐसे व्यक्ति से आई है जिसके पास संदेश में सार्वजनिक कुंजी के लिए मिलान निजी कुंजी है, और प्रतिक्रिया नहीं हुई है साथ छेड़छाड़।

मुझे नहीं पता कि आप किस तकनीक के साथ काम कर रहे हैं, लेकिन। नेट में आप इसे इस तरह से देख सकते हैं:

// load a new XML document
var assertion = new XmlDocument { PreserveWhitespace = true };
assertion.LoadXml("The SAML XML that you were sent");

// use a namespace manager to avoid the worst of xpaths
var ns = new XmlNamespaceManager(assertion.NameTable);
ns.AddNamespace("samlp", @"urn:oasis:names:tc:SAML:2.0:protocol");
ns.AddNamespace("asrt", @"urn:oasis:names:tc:SAML:2.0:assertion");
ns.AddNamespace("dsig", @"http://www.w3.org/2000/09/xmldsig#");

// get nodes down to the signature
var responseNode = assertion.SelectSingleNode("/samlp:Response", ns);
var assertionNode = responseNode.SelectSingleNode("asrt:Assertion", ns);
var signNode = assertionNode.SelectSingleNode("dsig:Signature", ns);

// load the XML signature
var signedXml = new SignedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode as XmlElement);

// get the certificate, basically:
//     signedXml.KeyInfo[0].Certificates[0]
// ...but with added casting
var certificate = GetFirstX509Certificate(signedXml);

// check the key and signature match
bool isSigned = signedXml.CheckSignature(certificate, true);

यह सिर्फ यह जाँचता है कि संदेश यह है कि यह किससे कहता है। आपको एक अतिरिक्त जांच की आवश्यकता है कि संदेश किसी ऐसे व्यक्ति से आया है जिस पर आप भरोसा करते हैं, और यह जांच धीमी है - इसमें निरसन को शामिल करने की आवश्यकता है और प्रमाणपत्रों की एक पूरी श्रृंखला को सत्यापित करने की आवश्यकता हो सकती है।

आम तौर पर यह सार्वजनिक कुंजी की सूची होगी जिसे आप एसएएमएल प्रतिक्रियाओं से स्वीकार करेंगे।

फिर आप देख सकते हैं कि इस संदेश के साथ छेड़छाड़ नहीं की गई है, और किसी ऐसे व्यक्ति से है जिस पर आपको भरोसा है, इसलिए आप आपूर्ति की गई SAML विशेषताओं में दिए गए उपयोगकर्ता विवरण को अधिकृत कर सकते हैं।

आप हो सकता है पहले से ही सार्वजनिक कुंजी है, जिसका अर्थ है कि हस्ताक्षर सार्वजनिक कुंजी फिर से शामिल करने की ज़रूरत नहीं होना चाहिए, लेकिन आप एक से अधिक संभव ज्ञात प्रेषकों, या यहाँ तक जाना जाता प्रेषकों की एक श्रृंखला हो सकता था।

उदाहरण के लिए, आपके पास दो विश्वसनीय प्रदाता हो सकते हैं - या तो मामले में आप यह जाँच लें कि संदेश को जाँचने से पहले छेड़छाड़ नहीं की गई है कि आप प्रदाता पर भरोसा करते हैं या नहीं। यदि कुंजी हस्ताक्षर में नहीं है, तो अभिकथन थोड़ा छोटा हो सकता है, लेकिन अब आपको पहले से पता होना चाहिए कि कौन सा पहचान प्रदाता से आया है।

तो, वास्तव में, सार्वजनिक कुंजी हस्ताक्षर में दो मुख्य कारण हैं:

  1. छेड़छाड़ की पहचान पहचान की जाँच की तुलना में तेज है, और सार्वजनिक कुंजी ज्ञात होने पर अलग किया जा सकता है।
  2. यदि मुखरता में है तो एकाधिक पहचानों का समर्थन करना बहुत आसान है।

2
SAML दावा @svlada को स्वयं एन्क्रिप्शन की आवश्यकता नहीं है, क्योंकि पाठ को SSL पर ही भेजा जा सकता है - पूरे उपयोगकर्ता सत्र को HTTPS होना चाहिए। उस सत्यापन को देखते हुए कि ज्ञात, विश्वसनीय प्रेषक ने दावे पर हस्ताक्षर किए हैं और यह छेड़छाड़ नहीं की गई है, पर्याप्त है।
कीथ

5
@svlada कोई HTTP- आधारित प्रमाणीकरण (किसी भी तरह का) कभी भी SSL के बिना नहीं होना चाहिए। प्रमाण पत्र को एन्क्रिप्ट करने से एक आदमी बीच में (MitM) इसे पढ़ने से रोक देगा, लेकिन यह कुकी आधारित मिटम हमले के समान इसे फिर से उपयोग करने से नहीं रोकेगा।
कीथ

8
एसएएमएल प्रतिक्रियाओं को उस हस्ताक्षर के लिए सार्वजनिक कुंजी को शामिल करने की आवश्यकता नहीं होती है। SAML2 युक्ति की धारा 5.4.5 में कहा गया है "XML सिग्नेचर <ds: KeyInfo> तत्व का उपयोग परिभाषित करता है। SAML को <ds: KeyInfo> के उपयोग की आवश्यकता नहीं है, न ही इसके उपयोग पर कोई प्रतिबंध लगाता है। इसलिए, <ds : KeyInfo> MAY अनुपस्थित रहें। " यदि आप SAML उपभोक्ता को लागू करने से पहले अपने स्थानीय प्रमाणपत्र स्टोर में संग्रहीत अन्य साधनों के माध्यम से सार्वजनिक कुंजी प्रदान की गई है, तो आप हस्ताक्षर को सत्यापित कर सकते हैं।
सैम रूबी

2
@ सैम.रुबी आह, मैं इसे सही करूंगा। मेरे द्वारा देखे गए प्रत्येक कार्यान्वयन में कुंजी शामिल है।
कीथ

5
@ इस पूरे प्रोटोकॉल नरक के रूप में भ्रमित है। मूल रूप से दावा स्वयं निहित है - आप जांच सकते हैं कि निजी कुंजी द्वारा हस्ताक्षर किए जाने के बाद से इसमें छेड़छाड़ नहीं की गई है। आप स्वयं उस सार्वजनिक कुंजी के बिना ऐसा कर सकते हैं (इसलिए मुझे पता है कि यह दावा डेव से आया है, और डेव ने इस पर हस्ताक्षर करने के बाद से किसी ने इसके साथ छेड़छाड़ नहीं की है, लेकिन मुझे नहीं पता कि डेव कौन है या मैं उस पर भरोसा कर सकता हूं)। फिर, यह सत्यापित करने के बाद, मैं सार्वजनिक कुंजी की जांच कर सकता हूं, जिस पर मुझे भरोसा है। मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि उस अंतिम जांच में देरी हो सकती है (जब मैं कार्यालय के बारे में पूछूं कि क्या किसी को डेव पता है)
कीथ

41

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

उदाहरण के लिए, मुखर पार्टी के लिए आपके मेटाडेटा में यह हो सकता है:

        <KeyDescriptor>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>
BQUAMCMxITAfBgNVBAMTGGlkcDEudGFuZ29oZWFsdGhkZW1vLmNvbTAeFw0xMzA1
...snip...
ttHq2Wi5J7img1M2zo28hH5DK78S+XerfXHK2HEZYZs=
                </ds:X509Certificate>
            </ds:X509Data>
            <ds:X509Data>
                <ds:X509Certificate>
H24a88h7zlq+pnAxQm0CAwEAAaN3MHUwVAYDVR0RBE0wS4IYaWRwMS50YW5nb2hl
...snip...
mg1M2zo28hH5DK78=
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </KeyDescriptor>

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


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

5
मुझे लगता है कि यह सबसे अच्छा जवाब है, ऐसा लगता है कि अन्य लोग इस बात को याद कर रहे हैं कि संदेश की कुंजी के खिलाफ संदेश की जाँच करना स्वयं आपको कोई सुरक्षा नहीं दे रहा है ... आपको अभी भी संदेश में कुंजी की जांच करनी चाहिए सही है! (इस मामले में, आपको यह सुनिश्चित करना चाहिए कि यह विश्वसनीय मेटाडेटा में है)।
rchampourlier

3
उपरोक्त टिप्पणियों से पूरी तरह सहमत हैं - संदेश में पारित प्रमाण पत्र अपने आप में बेकार है क्योंकि हस्ताक्षर करने का पूरा बिंदु यह सत्यापित करना है कि संदेश विश्वसनीय है। यदि संदेश विश्वसनीय नहीं है, तो न तो बंडल किए गए प्रमाण पत्र हैं।
Jez

@jbindel - धन्यवाद! यदि संभव हो तो मेरे पास एक नया प्रश्न है: क्या इस एसएएमएल प्रमाणपत्र को वर्तमान भौतिक प्रमाण पत्र से मेल खाना है, या क्या इसका उपयोग केवल मेटाडेटा मैच प्राप्त करने के लिए किया जाता है? मैं यह पूछता हूं क्योंकि मैं अपने प्रमाणपत्र को फिर से जारी करने वाले एक ईडीपी के परिचालन प्रभाव के बारे में चिंतित हूं - जिस बिंदु पर यह मेटाडेटा कुंजी के साथ सिंक से बाहर हो जाता है। यदि 2 बंधे हैं, तो मैं फिर से चिंतित हूं। परिचालन प्रभाव यानी। जब तक कि SP और IdP दोनों ने SAML2 कुंजी को मैन्युअल रूप से अपडेट नहीं किया है, तब तक सभी SSO विफल हो जाएंगे, और यदि तकनीकी खामी आती है तो SSO उपयोगकर्ताओं पर परिणामी प्रभाव पड़ेगा। (क्षमा याचना अगर बेवकूफी भरा सवाल है)
पंचो

SP मेटाडेटा में प्रमाणपत्र शामिल होना चाहिए, लेकिन SP मेटाडेटा पुराने और नए दोनों IdP प्रमाणपत्र निर्दिष्ट कर सकता है। यदि IdP अपना प्रमाणपत्र अपडेट कर रहा है, तो उसे SP मेटाडेटा में जोड़ा जा सकता है। एक बार जब पुराने प्रमाण पत्र का उपयोग करके आईडीपी माना जाता है, तो आप इसे एसपी मेटाडेटा से हटा सकते हैं। क्या वह पता जो आप पूछ रहे हैं? मुझे पता है कि यह शिब्बोलेथ एसपी पर पूरी तरह से काम करता है। एसपी मेटाडेटा फ़ाइल के लिए बस <KeyDescriptor use="signing">उन IdP प्रमाणपत्रों के लिए तत्वों की आवश्यकता होती है जिन्हें SP द्वारा स्वीकार किया जाएगा।
jbindel

8

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

तथ्य यह है कि यह XML डिजिटल हस्ताक्षर चश्मे का एक हिस्सा है, यह वास्तव में कुछ भी विशिष्ट नहीं है। प्रमाण पत्र के बिना आप कैसे बता सकते हैं कि टोकन कहाँ से आया है, और आप इसे कैसे मान्य कर सकते हैं?

XmlDSig अन्य विधियों को निर्दिष्ट करता है, आप साइनिंग कुंजी को किसी विषय, क्रम संख्या, हैश इत्यादि द्वारा पहचान सकते हैं, लेकिन यह मानते हैं कि प्राप्त पार्टी के पास सार्वजनिक प्रमाण पत्र है। एसएएमएल के लिए यह मामला नहीं हो सकता है, इसलिए X509 सर्टिफिकेट के सार्वजनिक भाग की एम्बेडिंग।


1
"प्रमाण पत्र के बिना आप कैसे बता सकते हैं कि टोकन कहाँ से आया है, और आप इसे कैसे मान्य कर सकते हैं?" - तुम किस बारे में बात कर रहे हो? एक एसएएमएल संदेश में हस्ताक्षर पर भरोसा करने के लिए, आपके पास पहले से ही विश्वसनीय सार्वजनिक प्रमाणपत्रों की एक सूची होनी चाहिए । आप Issuerतत्व और उस जारीकर्ता के प्रमाण पत्र को उस के खिलाफ संग्रहीत कर सकते हैं , और उस प्रमाण पत्र को चुन सकते हैं जिसके खिलाफ इस संदेश के लिए हस्ताक्षर की जाँच करें।
Jez

2
सभी Jez पर सच नहीं है। आप एक प्रमाण पत्र जारीकर्ता पर भरोसा कर सकते हैं, सीए की तरह, व्यक्तिगत प्रमाण पत्रों पर भरोसा किए बिना यह जारी करता है और हर प्रमाण पत्र की स्थानीय प्रतियां रखने के लिए बिना।
ब्लर्डार्ट

3
ब्लर्डार्ट यानि कि आप सीए द्वारा जारी किए गए किसी अन्य वैध प्रमाण पत्र पर हस्ताक्षर किए गए saml टोकन पर भरोसा कर रहे हैं। एक खरीदना असंभव नहीं है! यह सुनिश्चित करने के लिए कि आपका टोकन सही स्रोत से आ रहा है क्योंकि @ जज़ ने उल्लेख किया है कि आपके पास पहले से ही विश्वसनीय सार्वजनिक प्रमाणपत्रों की एक सूची होनी चाहिए।
सूर्य

2
@ सुन, गलत है। अगर वेल्स फ़ार्गो का कहना है कि अगर वे एक ही सीए हैं, तो वे बैंक ऑफ़ अमेरिका को लागू कर सकते हैं। X509 प्रमाणपत्र में एक विषय DN होता है जिसे सही पहचान के लिए मान्य किया जा सकता है।
पॉल ड्रेपर

+1 विशेष रूप से यह पहचानने के लिए कि यह एक्सएमएल डिजिटल सिग्नेचर स्पेसिफिकेशन का हिस्सा है, कुछ ऐसा जो किसी नौसिखिए के लिए स्पष्ट से कम है और यह समझने के लिए महत्वपूर्ण है कि संदेशों को वास्तव में कैसे संसाधित किया जाता है, क्योंकि प्रत्येक एसएएमएल कार्यान्वयन बहुत कुछ एक्सएमएल लाइब्रेरी पर निर्भर करता है। भार उठाना।
ब्रायकन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.