سؤال

أنا توقيع رقميا على مستند XML والتحقق منه على جهازين مختلفين (قم بتوقيعه على جهاز واحد والتحقق في آخر).

أقوم بما يلي للتحقق من XML DSIG في csharp.net.

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(document);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

            // Load the <signature> node.  
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

في البداية كنت أحصل على استثناء إذار عندما يحاول تطبيق الويب الخاص بي الوصول إلى الحاوية الرئيسية. لكن لدي مؤقتا إضافة تطبيق المستخدم ومستخدم IIS إلى دور المسؤول وتوضيح وثال الامتثال لسياسة الأمان إلى تطبيق الويب الخاص بي باستخدام Caspol.

Q1: [سؤالي الأول هو ما هو أفضل طريقة لأكثر من انتهى الأمر ؟؟ أعلم تعيين تطبيق الويب الممتاز وإضافة المستخدم إلى دور المسؤول ليس فكرة مشرقة، على الرغم من أنه يعمل

سؤالي الثاني هو فيما يتعلق signedXml.CheckSignature(rsaKey); عودة كاذبة. الآن حسب فهمي، نظرا لأن مستند XML تم توقيعه رقميا على جهاز مختلف، يتم استخدام جهاز Mac المستخدمة في توقيعه على اسم الحاوية الرئيسية في الآلات "XML_DSIG_RSA_KEY"، ولكن عندما حاولت التحقق من التوقيع على الجهاز المضيف تم إنشاؤه وتخزينه في اسم الحاوية "XML_DSIG_RSA_KEY" على الجهاز المضيف، وبالتالي لم يتم التحقق من التوقيع الرقمي.

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

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

المحلول

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

لتنفيذ الحالة الأولى، يمكنك الاتصال ToXmlString(false) على المفتاح على الجانب المرسل، قم بتخزين النتيجة في ملف والحفاظ على هذا الملف على الجانب الاستقبال. ثم على الطرف المتلقي، اقرأ الملف والاتصال:

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

يمكن إجراء الحالة الثانية عن طريق الحصول على شهادة، وإضافةها إلى التوقيع على جانب التوقيع مثل هذا:

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

إذا كانت الشهادة موثوقة، يمكنك بعد ذلك التحقق من التوقيع على الجانب المستقبلي من خلال الاتصال فقط:

bool isDone = signedXml.CheckSignature();

للإجابة على سؤالك الأول: بمجرد عدم محاولة الوصول إلى مخزن المفتاح الخاص (الذي كنت تفعله عن طريق استدعاء RSICryptoserviceProvider-Britionor مثلك)، يجب أن تكون قادرا على تشغيل دون ثقة كاملة.

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