2017-02-07 6 views
0

私はXMLファイルでデジタル署名をいくつか行い、私が署名したXMLを検証したいと思います。私は、Java XMLデジタル署名APIからのコードサンプルを使用していますが、私はXMLの署名を検証するために行くとき、私はちょうどcoreValidityはfalseです。 XMLデジタル署名を確認してください

coreValidityがfalseに署名しましたし、sigValValidityは何だ

真でありますこれらの違いと、なぜcoreValidityがfalseになるのでしょうか?私は何を目にすることができますか?

おかげ

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

。 'coreValidity'と' sigValValidity'の名前を知ることはできません – pedrofb

+0

コードで更新された質問 – user3520080

+0

出力には、 "ref [i] validity status:false"のようなものがあります。検証に失敗しました。おそらくダイジェスト計算の問題です。 – Moez

答えて

0

「コア検証が」コア検証のXMLDsig standard

必要なステップで定義されたルールに従って完全署名を検証し、(1)基準の検証の検証SignedInfo内の各Referenceに含まれるダイジェスト、および(2)SignedInfo上で計算された署名の暗号署名検証。

ReferenceまたはSignatureValueで実行された検証の少なくとも1つが失敗しました。検証方法の残りの部分はあなたに詳細を与える

しかし、それを慎重に取る。 XML署名の検証は、有効な署名があっても何らかの理由で失敗する可能性があります。実際には、標準自体に警告があります。

有効なシグネチャは、署名アプリケーションによっては検証できない場合があります。これには、この仕様のオプション部分の実装、指定されたアルゴリズムの実行不能または不快さ、または指定されたURIの参照を拒否できないこと(望ましくない副作用を引き起こす可能性のあるURIスキームなど)などが含まれます。

関連する問題