【问题标题】:How to sign xml with XAdES4j, and reference URI (#DatosEmision)?如何使用 XAdES4j 对 xml 进行签名,并引用 URI (#DatosEmision)?
【发布时间】:2020-03-27 10:36:01
【问题描述】:

我正在使用此代码尝试使用签名 xades-bes 签署 xml:

// open file
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document doc1 = builder.parse(new File(xmlInPath));

Element elemToSign = doc1.getDocumentElement();
DOMHelper.useIdAsXmlId(elemToSign);

kp = new FileSystemKeyStoreKeyingDataProvider("pkcs12", keyPath, new 
FirstCertificateSelector(),
new DirectPasswordProvider(password), new 
DirectPasswordProvider(password), true);

DataObjectDesc obj = new 
DataObjectReference("#DatosEmision").withTransform(new 
EnvelopedSignatureTransform());
SignedDataObjects dataObjs = new 
SignedDataObjects().withSignedDataObject(obj);

XadesSigningProfile p = new XadesBesSigningProfile(kp);

XadesSigner signer = p.newSigner();

signer.sign(dataObjs, elemToSign);

这会返回关于未找到 ID 的错误:

xades4j.XAdES4jXMLSigException: Cannot resolve element with ID DatosEmision
at xades4j.production.SignerBES.sign(SignerBES.java:277)
at xades4j.production.SignerBES.sign(SignerBES.java:130)
at xadessignergt.Signer.sign(Signer.java:63)
at xadessignergt.Cli.main(Cli.java:24)
   Caused by: org.apache.xml.security.signature.ReferenceNotInitializedException: 
   Cannot resolve element with ID DatosEmision

提前感谢您的帮助

【问题讨论】:

  • 可以添加XML文件内容吗?确定根文档元素是具有该 ID 的元素吗?文档构建器工厂也应该知道命名空间。 (setNamespaceAware())
  • 是的,我在 XML 下方添加。谢谢。

标签: java xml sign xades4j xades


【解决方案1】:

includeSigningCertificate 标志控制添加到 KeyInfo 中的内容。这可能有点令人困惑,但是对于SigningCertificate,lib 添加了KeyingDataProvider 返回的所有证书。

因此,在您的情况下,您应该在FileSystemKeyStoreKeyingDataProvider 的最后一个参数中提供false(您的密钥库可能具有密钥条目中路径的两个证书)。

http://luisgoncalves.github.io/xades4j/javadocs/1.5.0/reference/xades4j/providers/impl/FileSystemKeyStoreKeyingDataProvider.html

【讨论】:

    【解决方案2】:

    没错,问题是root,我确实解决了这个问题,但我仍然缺少其他东西,xml 结果是向“object”节点添加了两个“certdigest”,而您只需添加第一个,也就是下面那个

    <xades: Cert>
    <xades: CertDigest>
    <ds: DigestMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#sha256" />
    <ds: DigestValue> bCkfbDWoqt1XCDnbu0uunEXhNYQTgwmA3kvi69fnBKI = </ ds: DigestValue>
    </ xades: CertDigest>
    <xades: IssuerSerial>
    <ds: X509IssuerName> c = GT, o = SAT, cn = FEL </ ds: X509IssuerName>
    <ds: X509SerialNumber> 2184761958499123161 </ ds: X509SerialNumber>
    </ xades: IssuerSerial>
    </ xades: Cert>
    

    不应该。

    我传递了代码和签名 xml 的一部分,您可以在其中看到我需要更正的对象:

    java代码:

            XadesSigningProfile p = new 
    XadesBesSigningProfile(kp);//.withBasicSignatureOptions(new 
    BasicSignatureOptions().includeSigningCertificate(SigningCertificateMode.NONE));
    
            XadesSigner signer = p.newSigner();
    
            DataObjectDesc dataObjects = new DataObjectReference("#" + 
    elemToSign.getAttribute("ID")).withTransform(new EnvelopedSignatureTransform()); 
            signer.sign(new SignedDataObjects(dataObjects), elemToSign2);    
    
            Transformer transformer = 
    TransformerFactory.newInstance().newTransformer();
            Result output = new StreamResult(xmlOutPath);
            Source input = new DOMSource(doc1);
    
            transformer.transform(input, output);
    

    签名的 xml:

    ds:Object>
    <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" 
    xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#" Target="#xmldsig- 
    d404515d- 
    303f-483f-a665-783618a354ce">
    <xades:SignedProperties Id="xmldsig-d404515d-303f-483f-a665-783618a354ce- 
    signedprops">
    <xades:SignedSignatureProperties>
    <xades:SigningTime>2019-12-04T08:23:24.757-06:00</xades:SigningTime>
    <xades:SigningCertificate>
    <xades:Cert>
    <xades:CertDigest>
    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
    <ds:DigestValue>jvQigb4Z3jwOpSU+snlj7p7vjERxAxRBWna5uAHob0s= 
    </ds:DigestValue>
    </xades:CertDigest>
    <xades:IssuerSerial>
    <ds:X509IssuerName>c=GT,o=SAT,cn=FEL</ds:X509IssuerName>
    <ds:X509SerialNumber>8490687699557173471</ds:X509SerialNumber>
    </xades:IssuerSerial>
    </xades:Cert>
    <xades:Cert>                /*this does not have to appear - begin*/
    <xades:CertDigest>
    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
    <ds:DigestValue>bCkfbDWoqt1XCDnbu0uunEXhNYQTgwmA3kvi69fnBKI= 
    </ds:DigestValue>
    </xades:CertDigest>
    <xades:IssuerSerial>
    <ds:X509IssuerName>c=GT,o=SAT,cn=FEL</ds:X509IssuerName>
    <ds:X509SerialNumber>2184761958499123161</ds:X509SerialNumber>
    </xades:IssuerSerial>
    </xades:Cert>                /*this does not have to appear - end*/
    </xades:SigningCertificate>
    </xades:SignedSignatureProperties>
    </xades:SignedProperties>
    </xades:QualifyingProperties>
    </ds:Object>
    

    提前感谢您的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-16
      • 2019-03-20
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多