2014-09-02 88 views
0

我必須簽名,然後簽名一些xml簽名。這是我的代碼:計數器簽名無效(xades4j)

private String singXadesEnveloped(String mode, Document document, Certificate[] certificateChain, PrivateKey signingKey, String mimeType, String encoding) 
     throws XAdES4jException, ClassCastException, UnsupportedEncodingException, ClassNotFoundException, 
     InstantiationException, IllegalAccessException { 

    try { 
    DataObjectDesc desc = null; 
    KeyingDataProvider kp = new StaticKeyingDataProvider(certificateChain, signingKey); 
    BasicSignatureOptionsProvider bop=new BasicSignatureOptionsProvider() { 

     public boolean signSigningCertificate() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     public boolean includeSigningCertificate() { 
      // TODO Auto-generated method stub 
      return true; 
     } 

     public boolean includePublicKey() { 
      // TODO Auto-generated method stub 
      return true; 
     } 
    }; 
    //System.out.println("bop.includePublic="+bop.includePublicKey()); 
    XadesSigningProfile sp = new XadesBesSigningProfile(kp).withTimeStampTokenProvider(CertumFreeTimeStampProvider.class).withBasicSignatureOptionsProvider(bop); 
    XadesSigner signer = sp.newSigner(); 

    desc = new DataObjectReference("") 
    .withDataObjectFormat(new DataObjectFormatProperty(mimeType, encoding)) 
    .withTransform(new EnvelopedSignatureTransform()); 


    SignedDataObjects dataObjects = new SignedDataObjects(desc) 
    .withCommitmentType(AllDataObjsCommitmentTypeProperty.proofOfOrigin()); 

    Element el = document.getDocumentElement(); 
    //System.out.println("element="+el.getNodeName()); 
    XadesSignatureResult sign = signer.sign(dataObjects, el); 
    String signed_xml = serializeDocument(document); 
    //System.out.println("\n\nPodpisany xml:\n"+signed_xml+"\n\n"); 


    XadesSignatureFormatExtender extender = new XadesFormatExtenderProfile().getFormatExtender(); 
    Element sigElem = sign.getSignature().getElement(); 
    //System.out.println("\n\nTag do podpisu:"+sigElem.getNodeName()+"\n\n"); 
    XMLSignature sig = new XMLSignature(sigElem, sigElem.getOwnerDocument().getBaseURI()); 
    XadesSigningProfile profile = new XadesBesSigningProfile(kp).withTimeStampTokenProvider(CertumFreeTimeStampProvider.class).withBasicSignatureOptionsProvider(bop); 
    final XadesSigner counterSigner = profile.newSigner(); 


    // .withTransform(new ExclusiveCanonicalXMLWithoutComments()); 


    //System.out.println("\n\nNode sygnatury: "+sig.getElement().getNodeName()+"\n\n"); 


     Collection<UnsignedSignatureProperty> usp = new ArrayList(1); 
      usp.add(new CounterSignatureProperty(counterSigner)); 

      extender.enrichSignature(sig, new UnsignedProperties(usp)); 

    } catch (XMLSignatureException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (XMLSecurityException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    /*-----------------------------------------------------*/ 

    //alternatywny sposób realizowania podpisu 
    //new Enveloped(signer).sign(document.getDocumentElement()); 
    DOMSource domSource = new DOMSource(document); 
    StringWriter writer = new StringWriter(); 
    StreamResult result = new StreamResult(writer); 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer; 
    try { 
     transformer = tf.newTransformer(); 
     transformer.transform(domSource, result); 
    } catch (TransformerConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //System.out.println("\n\nsignXades signed before serializedocument: \n\n" + writer.toString()); 
    //return serializeDocument(signed_document); 
    return writer.toString(); 
} 

它簽署我的XML並添加計數器簽名。 不幸的是,當我驗證我的XML,簽名非常好,但計數器簽名不是(簽名的摘要與文件數據的摘要不相等)。

我的代碼有什麼問題?這是XML簽名具有與反簽名:

Signed and countersigned xml file

+0

該代碼似乎是正確的。您能否提供驗證簽名所需的證書以及包含的TS令牌,以便我可以嘗試重現問題? – lgoncalves 2014-09-02 21:21:21

+0

我在外部程序中驗證我簽名的XML,所以我真的不知道我應該發給你什麼(羞恥我......)。如果它可以幫助,這是鏈接到您可以下載程序的頁面(它也會在系統中安裝一些證書)。 [第一或頁面上第二個鏈接] [1] [1]:http://sigillum.pl/pliki_do_pobrania.html 我能得到怎樣 「TS包括令牌」 送他們到你? – Tomi 2014-09-03 05:46:28

+0

我只需要證書頒發機構證書來驗證簽名。也許他們是公開的? – lgoncalves 2014-09-03 15:12:04

回答

0

信息分散在評論中,所以我在這裏發佈最終答案。正在使用的第三方工具(可能是Sigilum Sign,您能否確認?)需要櫃檯簽名中主要ReferenceType上的http://uri.etsi.org/01903#CountersignedSignature值。 XAdES規範指出,此引用不是必需的上的此計數器簽名的用例,這意味着第三方工具應該接受它們。不過,最新版本的xades4j總是包含這個元素。

如果你在maven上得到最新版本的xades4j,這應該是固定的。如果你在xades4j網站的下載部分獲得了二進制文件,請重新安裝它們,因爲這個軟件包有一點不協調。

+0

這是很好的信息,因爲我使用1.3.0創建計數器簽名。我現在嘗試1.3.1 :-)實際上,經過10分鐘的工作(將1.3.1上傳到存儲庫並重新構建小程序),它...起作用(簽名和簽名驗證)!非常感謝Igoncalves! :-) – Tomi 2014-09-15 05:44:54

0

如果問題是「簽名的摘要是不是從文件數據摘要平等」,證書不幫忙。 但是,我使用其他軟件驗證了您的簽名。櫃檯簽名中的摘要和簽名值似乎沒問題。你能得到驗證應用程序中使用的散列值嗎?

在櫃檯簽名簽署的簽名值的散列斑點:

<ds:SignatureValue xmlns:adr="http://crd.gov.pl/xml/schematy/adres/2008/05/09/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:inst="http://crd.gov.pl/xml/schematy/instytucja/2008/05/09/" xmlns:iso639-2="http://lcweb.loc.gov/standards/iso639-2/" xmlns:meta="http://crd.gov.pl/xml/schematy/meta/2008/05/09/" xmlns:oso="http://crd.gov.pl/xml/schematy/osoba/2008/05/09/" xmlns:str="http://crd.gov.pl/xml/schematy/struktura/2008/05/09/" xmlns:wnio="http://epuap.gov.pl/FeResourceServlet/wzor_lokalny/twmud37012/Wniosek_odpowiedzi/" Id="xmldsig-2d270d0c-76d2-4638-9e5a-fc149b383552-sigvalue"> 
orHos56IR77hfwBp2bas3L9E9X4K/oVAyRCkW/00gxon5ZEKCmmT5GhT/Bty6AOC5MsMwDKSgFbe 
ysO7kqg5DuSOFPGocR3cBszH4w25Uoouk/0mxKU6BdTKl8Ud/N2RA/rUhvYBvH+JDjOrp+mtEmym 
skBfxHssfzecGXQFtzskJLCMaxIhBQIw8RIOkREzFNozCCEw8uo9GEuzyfRC3EypVy8hL1p/qG2z 
Ytf2lEJ4EastuCN5etHQSSVT4I9yeJulTj58e4d2IjtcVjJlpV1yetysv0R7E3cJ9YWaL4vH3Yhx 
DtVIepegelZa37omW3GMtvIEDa6bdBx8WyMJLA== 
</ds:SignatureValue> 

一個可能的原因與驗證應用的失敗在於你是不是在櫃檯簽名使用規範化算法。我對xades4J不熟悉,但我認爲它的API不允許向計數器簽名添加規範化算法。

+0

這是在我用來驗證我的會籤文件的應用程序中籤名的xml文件。當然,它驗證... [文件] [1] [1]:https://www.dropbox.com/s/uwjiiuy6ai7z489/02_09_test_sig_kontr%20%282%29.xades?dl=0 – Tomi 2014-09-03 12:23:50

+0

我使用的軟件將此第二個簽名視爲無效,我相信這是正確的。由主簽名簽名的引用(URI =「」)的散列無效。您的兩個簽名都是ENVELOPED(表示包含ds:Signature的完整XML文件已簽名)。第二個簽名包含與第一個簽名相同的哈希值;但是簽名的blob不一樣(在第一個文件中你有一個由簽名覆蓋的「<?xml-stylesheet」元素 – Moez 2014-09-03 14:05:14

+0

計數器簽名具有指定的規範化algortihms,即使它們不是,XML- DSIG定義了默認設置 – lgoncalves 2014-09-03 15:17:43