سؤال

في العمل لدينا ويب التطبيق الذي سوف تحتاج إلى واجهة مع شركة أخرى تطبيق ويب باستخدام علامة واحدة على صحتها من قبل SAML.لدينا تطبيقات الويب هي مكتوبة في PHP, و من الواضح أنها غير ذات صلة بما اختيار لغة أخرى تستخدمها الشركة.ومع ذلك, كنت بحاجة لكتابة API بسيط أن هذه الشركة الأخرى يمكن إرسال الصابون الطلبات مع SAML طلبات تولد مرة أخرى استجابة SAML.لقد تم كتابة من الصفر لثلاثة أسباب: 1) هناك لا يبدو أن يكون العديد من الخيارات SAML التفاعلات مكتوب في PHP حتى لو أردت واحدة ، 2) أنه يحد من النفقات العامة التي ستشارك مع إضافة طرف ثالث آخر عنصر ، 3) خلق الأشياء من الصفر وعادة ما يترك لي أفضل بكثير فهم و يجعلني أكثر قدرة على التكيف الشيء في المستقبل إذا لزم الأمر.

على أي حال, أنا جديدة إلى حد ما إلى SAML, الصابون, و XML المعايير العامة ، حتى لقد كان نوعا من التدريس في نفسي أذهب.لدي API كاملة الى حد كبير لأغراضنا ، مع استثناء واحد أن شركة أخرى قد حددت أن ردنا سيكون مطلوبا أن تكون موقعة رقميا مع الشهادة (على طلب ونحن سوف تتلقى وبالمثل يكون رقميا).إذا كنت في محاولة لمعرفة كيفية عملية/إنشاء XML التوقيعات ولكن بصراحة كل مربكا بعض الشيء كما W3C المواصفات ليست بالضبط ضوء القراءة.

القسم 5.4.8 من تأكيدات بروتوكول واحة الأمن Markup Language (SAML) V1.1 الوثيقة (وثيقة لقد تم الخروج ، أخرى قالت الشركة أنها سوف تستخدم v1.1) يشمل مثال وقعت الاستجابة التي تحتوي على وقع تأكيد, والتي سوف تشمل هنا الإشارة إلى:

<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">scott@example.org</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:Signature> فئة واحدة في الرئيسية <Response> واحد في <Assertion>, تحتوي كل منها على الخاصة بهم <ds:DigestValue>, <ds:SignatureValue>, ، <ds:X509Certificate> (وكل متميزة).كيف هي هذه ولدت ؟ أي ضوء تسلط على هذا سوف تكون محل تقدير كبير.الدروس أو أمثلة التعليمات البرمجية سيكون أكثر تقدير!ولكن في هذه المرحلة يمكن أن تحصل لي على الطريق الصحيح, هذا كل ما أطلبه بشدة.الآن كل شيء لا يزال يبدو مثل مربع أسود كبير لي.

بالمناسبة, إذا كان هذا يساعد يقول في مكان آخر في SAML 1.1 المواصفات التي SAML تطبيقات يجب استخدام "حصرية مشكة" الأسلوب فقط (بدون ضريبة القيمة المضافة-C14N) و يجب استخدام "يلفها تحويل" فقط.ما زلت غير متأكد تماما ماذا يعني ذلك.

هل كانت مفيدة؟

المحلول

معالجة XML التوقيعات ليست حقا من الصعب جدا ، إن كنت معتادا جدا مع XML, ولكن هناك الكثير من التفاصيل التي يجب أن تكون على حق أو أشياء لا تعمل لذا ربما لن محاولة كتابة بلدي التنفيذ في هذه الحالة (لم تنفذ جزئيا مرة واحدة ، ولكن كانت مختلفة لأغراض خاصة, و على أي حال لم يكن التنفيذ الكامل).

على أي حال, أنا لا أعرف الكثير عن SAML, ولكن أنا لا أعرف عن XML XML التوقيعات ، ربما يمكن أن تحصل على بعض من طريقة من خلال محاولة الإجابة على الأسئلة الخاصة بك.

A Signature عنصر يشير إلى قطعة معينة من مستند XML التي تم توقيعها رقميا ، SignedInfo عنصر الطفل.على Reference عنصر من أن (أعتقد أن يمكن أن يكون هناك العديد من Reference العناصر التي تحصل متصلا عند تشكيل بايت إلى أن وقعت ولكن لا أتذكر بالتأكيد بعد الآن) يشير إلى المحتوى من خلال URI السمة.على Transform عناصر وصف التحولات التي تجرى على ويشار إلى المحتوى قبل التجزئة ؛ سوف تحتاج إلى إلقاء نظرة على المواصفات لمعرفة كيف تحول الخوارزميات المحددة.على DigestMethod عنصر يعطي خوارزمية التجزئة لتطبيق وحدات البايت التي هي نتيجة هذه التحولات خوارزميات (لاحظ أن واحدا منهم هو دائما مشكة تحويل XML إلى بايت) ، DigestValue يعطي نتيجة هضم الخوارزمية.

التوقيع الفعلي هو في SignatureValue عنصر و يتم إنتاجها عن طريق تطبيق CanonicalizationMethod العنصر مشكة لإنتاج بايت ومن ثم توقيع هذه بايت مع SignatureMethod.على KeyInfo العنصر يقول لك كيفية العثور على مفتاح لاستخدام.

مشكة التي تظهر عدة مرات أعلاه هو مجرد وسيلة لتحويل مستند XML في بايت حتى أن "ما يعادل" مستندات XML تنتج نفس تسلسل بايت.هذا هو المطلوب في التوقيع الرقمي لأن خوارزميات تعمل على بايت و XML يمكن أن تمر من خلال عدد من الوسطاء التي ربما سوف يعطل الأصلي بايت ولكن ستحتفظ التكافؤ.و مختلفة مشكة هناك حاجة إلى أساليب لحالات مختلفة:إذا العناصر المستخرجة من الوثائق ووضعها في الآخرين ، تحتاج حصرية مشكة أن تجرد بعيدا لزوم لها مساحة تعريفات, ولكن في حالات أخرى قد لا تعمل بشكل صحيح ، لذلك تحتاج شاملة مشكة بدلا من ذلك الذي يحفظ كل في نطاق مساحات الأسماء.

هذه هي أساسيات فقط.هناك عدد من الخيارات المختلفة في كيفية إنتاج XML التوقيع و إذا كنت ترغب في تنفيذ عمل المدقق ، تحتاج إلى النظر في كل منهم.منذ كنت جديدا على XML بشكل عام, أنا فقط أكرر نصيحتي استخدام شيء موجود بالفعل.انها مثيرة للاهتمام تجربة التعلم في تنفيذ المواصفات ، ولكن في كثير من الأحيان انها مضيعة للوقت إذا تطبيقات متاحة بالفعل.

هناك W3C الوثائق عن التوقيعات.

نصائح أخرى

هناك مثال في xmlseclibs.php في SimpleSAML.لأنه يعتمد على بينسل وحدة للقيام التشفير.

أنا بصراحة استخدم هذا lib أو جسر java/هر ، فقط لأن إمكانية التشغيل المتداخل القضايا قد تأتي التي تحتاج إلى أن تكون تصحيحه ،

  1. يمكنك إلقاء نظرة على هذه جافا lib التوقيع على طلب 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 إلى vaalidate أو التوقيع على الطلب https://www.samltool.com/sign_logout_req.php

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top