2017-02-07 4 views
0

XML 파일에서 일부 디지털 서명을하고 있으며 내가 서명 한 XML의 유효성을 검사하려고합니다. 나는 자바 XML 전자 서명 API에서 코드 샘플을 사용하고 있지만이 XML의 서명을 확인할 갈 때 난 그냥coreValidity가 false입니다. XML 디지털 서명 확인

coreValidity이 거짓을 체결 한과 sigValValidity은 무엇이야

사실이다 이것들과 coreValidity가 틀린 이유는 무엇입니까? 무엇을 볼 수 있습니까?

감사

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

포스트 코드 (일부 URI 체계가 바람직하지 않은 부작용을 일으킬 수 있음)이 규격, 무능력 또는 지정된 알고리즘을 실행하기를 꺼려하거나 URI를 지정 역 참조에 대한 무능력 또는 내키지의 옵션 부분을 구현하는 실패를 포함 . – pedrofb

+0

코드로 업데이트 된 질문 – user3520080

+0

출력에서 ​​"ref [i] validity status : false"와 같은 것을보아야합니다. 여기서 i는 Reference의 색인입니다. 유효성 검사에 실패했습니다. 아마 다이제스트 계산 문제. – Moez

답변

0

은 "코어 검증"코어 검증 XMLDsig standard

필요한 단계에 정의 된 규칙에 따라 전체 서명의 유효성을 검사 등 (1) 기준 검증의 검증 SignedInfo의 각 Reference에 포함 된 다이제스트 및 (2) SignedInfo를 통해 계산 된 서명의 암호화 서명 유효성 검사.

핵심 유효성 검사가 실패하면 Reference 또는 SignatureValue에서 수행 된 유효성 검사 중 하나 이상이 실패했습니다. 유효성 검사 방법의 나머지 부분은 세부 정보를 제공합니다.

그러나 신중하게 선택하십시오. XML 서명의 유효성 검사는 유효한 서명이 있더라도 여러 가지 이유로 인해 실패 할 수 있습니다. 실제로 표준 자체는 경고합니다.

일부 서명 응용 프로그램에서 유효성을 검사 할 수없는 유효한 서명이있을 수 있습니다. 이것에 대한 이유 등