Подпись XML становится недействительной при добавлении эксклюзивного преобразования c14n

StackOverflow https://stackoverflow.com//questions/10679722

Вопрос

Это мой код для создания подписи 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