سؤال

هذا هو الكود الخاص بي لإنشاء توقيع XML:

DOMSignContext dsc = new DOMSignContext
  (prk, xmldoc.getDocumentElement());

XMLSignatureFactory fac = 
  XMLSignatureFactory.getInstance("DOM");   

  DigestMethod digestMethod = 
      fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null);
  C14NMethodParameterSpec spec = null;
  CanonicalizationMethod cm = fac.newCanonicalizationMethod(
      "http://www.w3.org/2001/10/xml-exc-c14n#",spec);
  SignatureMethod sm = fac.newSignatureMethod( 
      "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null);
  ArrayList transformList = new ArrayList();
  TransformParameterSpec transformSpec = null;
  Transform envTransform =   fac.newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec);
  Transform exc14nTransform = fac.newTransform(
      "http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec);
transformList.add(exc14nTransform); 
transformList.add(envTransform);

 Reference ref = fac.newReference("",digestMethod,transformList,null,null);
 ArrayList refList = new ArrayList();
 refList.add(ref);
 SignedInfo si =fac.newSignedInfo(cm,sm,refList);

وهذا يعطي التحقق من صحة المرجع على أنه خطأ وكذلك الصلاحية الأساسية على أنها خطأ.ولكن عندما أقوم بإزالة envTrasnform متغير أي fac.new Transform("http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec) وتنفيذها بالكود التالي:

DOMSignContext dsc = new DOMSignContext
  (prk, xmldoc.getDocumentElement());

XMLSignatureFactory fac = 
  XMLSignatureFactory.getInstance("DOM");   

  DigestMethod digestMethod = 
      fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null);
  C14NMethodParameterSpec spec = null;
  CanonicalizationMethod cm = fac.newCanonicalizationMethod(
      "http://www.w3.org/2001/10/xml-exc-c14n#",spec);
  SignatureMethod sm = fac.newSignatureMethod( 
      "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null);
  ArrayList transformList = new ArrayList();
  TransformParameterSpec transformSpec = null;
  Transform envTransform = fac.newTransform(
      "http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec);
 transformList.add(envTransform);
 Reference ref = fac.newReference("",digestMethod,transformList,null,null);
 ArrayList refList = new ArrayList();
 refList.add(ref);
 SignedInfo si =fac.newSignedInfo(cm,sm,refList);

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

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

المحلول

في الواقع يجب إجراء تحويل c14n بعد تحويل التوقيع المغلف.يجب أن يتم تحديده بشكل أساسي بعد استخراج المستند المراد توقيعه (يحتوي المستند حاليًا على عنصر التوقيع أيضًا.لذلك يجب فصله قبل تحديد الجزء الفعلي المراد التوقيع عليه).يجب أن يكون الترتيب بهذه الطريقة:

transformList.add(envTransform);
 transformList.add(exc14nTransform);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top