سؤال

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

سأعطيك مثالا. هذا هو XML أحاول تسجيل الدخول:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

حصلت على بعض الرمز يعمل في PHP لتوقيعه باستخدام مزيج من المفاتيح العامة وشهادات المفتاح الخاص، ويبدو أن العمل. وأضافت <ds:Signature> عنصر مع كل الاشياء المناسبة، وبدا رائعا. ولكن بعد ذلك اختبرته من خلال محاولة التحقق من صحةه على الفور بعد توقيعه، مرة أخرى باستخدام Xmlseclibs (وشهادة المفتاح العام)، ولكن فشل التحقق من الصحة. لذلك فإن مكتبة التعليمات البرمجية بالضبط تقوم بالتوقيع والتحقق من الصحة، ولكن العمليات اثنين لا توافق على بعض الأسباب.

أضفت بعض رمز تصحيح الأخطاء إلى Xmlseclibs لمعرفة ما تفعله، وأدركت أن السبب في أن مفتاح التوقيع الذي يتعلق به ومفتاح التحقق من الصحة هو مختلفا لأنها كانت canonicalizes الأشياء بطريقة مختلفة في الحالتين. عندما أقول ذلك لتوقيع <samlp:Response> العنصر، هذا هو النموذج الكنسي الذي يوقعه (لقد أضفت خطوط نيو هناك من أجل قابلية القراءة):

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

ومع ذلك، عندما يذهب للتحقق من صحة التوقيع، فإن هذا هو النموذج الكنسي الذي يحاسبه على التحقق من صحة (مرة أخرى، لقد أضفت خطوط نيو هناك "

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

حتى ترى، هذا الإصدار يحمل xmlns:saml سمة من <samlp:Response> العنصر، في حين أن الأول لا. (لاحظ أن هذا يختلف عن xmlns:samlp السمة، التي يتم تضمينها في الاثنين. إذا تم حذف هذه السمة من خلال canonicalization الحصري؟ أو يجب أن تضم؟ أي واحد هو النموذج الكنسي الحصري الصحيح؟

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

المحلول

تقوم بإنشاء مستند DOM بشكل غير صحيح ومحاولة استخدام شجرة الذاكرة غير الصحيحة. إما تسلسل واستخدام النتيجة التسلسلية أو إنشاء تصريحات مساحة الاسم بشكل صحيح في الشجرة قبل محاولة التوقيع. انظر تقرير الأخطاء لمزيد من المعلومات: http://code.google.com/p/xmlseclibs/issues/detail؟id=6.

نصائح أخرى

لا هي النموذج القانوني الصحيح!

يحتوي توقيع XML على إعلان مساحة الاسم يأتي بعد سمات مساحة الاسم غير المسمدة، والذي يكسر قاعدة ترتيب المستند:

تتمتع العقد المسميرية في وضع ترتيب المستندات أقل من عقد السمة.

التحقق XML مفقود saml Namespace عقدة تماما. Canonicalisation لا يزيل عقد مساحة الاسم لمجرد عدم وجود محتوى للأطفال يشير إليه. يزيل فقط عقد مساحة الاسم الزائدة (أي أسماء الأسماء التي كانت موجودة بالفعل على الوالد).

لا أعرف ما يكفي من Xmlseclibs أن أقول لماذا يحدث هذا، لكنه من الخطأ بالتأكيد على كلا التهم. FWIW وظيفة C14N على دوم هنا يقول:

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"></samlp:StatusCode>
</samlp:Status>
</samlp:Response>

إيتا: نظرت للتو xmlseclibs.php في SVN، وليس هناك إصلاح سهل لهذا لأن نهجها الحالي هو معيب بشكل أساسي. يحاول إنشاء دوم "canonicalised" ثم تسلسله مع القديم العادي saveXML(). وبعد نظرا لوجود قواعد التسلسل C14N حول ترتيب السمة والشخصية التي يهرب ذلك saveXML لا يعد بمتابعة، لا توجد طريقة يمكن أن تعمل هذا.

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