2017-02-07 29 views
0

我正在对XML文件进行一些数字签名,我想验证签署的XML。我使用的代码样本从Java XML数字签名API,但是当我去验证的XML签名我刚刚签署coreValidity是错误的。验证XML数字签名

coreValidity是假的和sigValValidity是真的

什么这两者之间的差别以及核心有效性为什么会是错误的?我可以注意什么?

由于

public void verifySignedXML(KeyPair keypair) throws Exception { 
     String signedFile = "src/test/resources/file.xml"; 


     // Instantiate the document to be validated 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     Document doc = dbf.newDocumentBuilder().parse(
       new FileInputStream(signedFile)); 

     // Find Signature element 
     NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, 
       "Signature"); 
     if (nl.getLength() == 0) { 
      throw new Exception("Cannot find Signature element"); 
     } 

     // Create a DOM XMLSignatureFactory that will be used to unmarshal the 
     // document containing the XMLSignature 
     XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 

     if (keypair.getPublic() == null) { 
      log.error("Public key is null"); 
      //TODO throw exception 
     } 

     PublicKey key = keypair.getPublic(); 

     // Create a DOMValidateContext and specify a KeyValue KeySelector 
     // and document context 
     DOMValidateContext valContext = new DOMValidateContext(
       key, nl.item(0)); 

     // unmarshal the XMLSignature 
     XMLSignature signature = fac.unmarshalXMLSignature(valContext); 

     // Validate the XMLSignature (generated above) 
     boolean coreValidity = signature.validate(valContext); 

     // Check core validation status 
     if (coreValidity == false) { 
      System.err.println("Signature failed core validation"); 
      boolean sv = signature.getSignatureValue().validate(valContext); 
      System.out.println("signature validation status: " + sv); 
      // check the validation status of each Reference 
      Iterator<?> i = signature.getSignedInfo().getReferences().iterator(); 
      for (int j = 0; i.hasNext(); j++) { 
       boolean refValid = ((Reference) i.next()).validate(valContext); 
       System.out.println("ref[" + j + "] validity status: " 
         + refValid); 
      } 
     } else { 
      System.out.println("Signature passed core validation"); 
     } 
    } 
+0

安置自己的代码。这是不可能知道你用的代码 – pedrofb

+0

更新问题在你应该看到类似“参考文献[I]有效性状态:假”的输出,其中i为参考,为指数验证失败。可能消化计算问题。 – user3520080

+0

命名为'coreValidity'和'sigValValidity' – Moez

回答

0

“核心验证”验证根据在XMLDsig standard

芯验证所需的步骤中定义的规则的完整签名包括(1)参考文献验证,的验证包含在SignedInfo中每个Reference中的摘要,以及(2)通过SignedInfo计算的签名的加密签名验证。

如果核心验证失败,那么在ReferenceSignatureValue上执行的至少一个验证失败。其余的验证方法给你的细节

但是,要小心。验证XML签名可能会因许多奇怪的原因而失败,即使使用有效的签名。实际上,标准本身对此提出警告

请注意,可能有一些签名应用程序无法验证的有效签名。其原因包括不执行本说明书中,不能或不愿意执行特定的算法,或不能或不愿意指定的URI解引用的可选部分(一些URI方案可能会导致不期望的副作用)等