首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不含xades4j的KeyInfo验证

不含xades4j的KeyInfo验证
EN

Stack Overflow用户
提问于 2019-09-24 02:35:50
回答 1查看 526关注 0票数 0

我们公司使用Etokens通过https与服务器进行通信。如何在没有在KeyInfo中签名证书的情况下验证封装好的XML文件?

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<EDoc><NextMsg ID="Edoc">2019-09-23T16:20:53</NextMsg><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod>
<ds:Reference Id="xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1-ref0" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod>
<ds:DigestValue>IUdYs162QE1GdUEKUxqppoFmNvrYMLMBGnduWy6v3rc=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1-signedprops">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod>
<ds:DigestValue>Uw2b3fkLSJPm+yDeYwXQhJHZhWP+vUNBEeS55LcII00=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue Id="xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1-sigvalue">
eHOQcdUYRRhQa3DV+P5lWnXR32KXpO08n4QI/SIXvJxbjvz3roGNas53E/1hCui8MG3TkZulx4Fw&#xD;
W3N9qJ3FXciasReaqofrexHtbntyr6O/tzQh2akcJzo3TPH+j4PxozjFUxCxcaJRSqCE0hWdBtuI&#xD;
S8rn+EKpes7ohgtlsVg=
</ds:SignatureValue>
<ds:Object><xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1"><xades:SignedProperties xmlns:ns3="http://uri.etsi.org/01903/v1.4.1#" Id="xmldsig-5d0f41cd-6e98-488d-9415-28b6329b34d1-signedprops"><xades:SignedSignatureProperties><xades:SigningTime>2019-09-23T16:20:53+03:00</xades:SigningTime><xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod><ds:DigestValue>woG3fsImDUeqxznickzLkpeY9R4=</ds:DigestValue></xades:CertDigest><xades:IssuerSerial><ds:X509IssuerName>cn=LB-LITAS-CA,ou=MSD,o=Lietuvos bankas,l=Vilnius,c=LT</ds:X509IssuerName><ds:X509SerialNumber>105704079740755226136574</ds:X509SerialNumber></xades:IssuerSerial></xades:Cert></xades:SigningCertificate></xades:SignedSignatureProperties></xades:SignedProperties></xades:QualifyingProperties></ds:Object>
</ds:Signature></EDoc>

默认verify函数搜索KeyInfo

代码语言:javascript
复制
 public static void verifyBes(KeyStore ksaa, String path)
      throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXException,
          java.security.NoSuchAlgorithmException, xades4j.utils.XadesProfileResolutionException,
          xades4j.XAdES4jException, java.io.IOException, java.security.NoSuchProviderException,
          java.security.cert.CertificateException, java.security.cert.CRLException,
          java.security.cert.CertStoreException, java.security.KeyStoreException {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);

    Document doc = dbf.newDocumentBuilder().parse(new File(path));
    Element root = doc.getDocumentElement();

    Element idChild = (Element) root.getFirstChild();
    DOMHelper.useIdAsXmlId(idChild);

    String filename =
        System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
    FileInputStream is = new FileInputStream(filename);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    String password = "changeit";
    ks.load(is, password.toCharArray());

    X509Certificate validate_cert = null;

    FileSystemDirectoryCertStore fsCertStore = new FileSystemDirectoryCertStore("../certStore");
    Collection<? extends Certificate> allCerts = fsCertStore.getStore().getCertificates(null);
    // search for specific certificate to test agains
    for (Certificate c : allCerts) {
      X509Certificate pool_cert = (X509Certificate) c;
      System.out.println(pool_cert.getSubjectDN().getName());
      if (-1 != pool_cert.getSubjectDN().getName().indexOf("TEST CERTIFICATE"))
        validate_cert = pool_cert;
    }

    CertificateValidationProvider validationProviderMySigs =
        new PKIXCertificateValidationProvider(ks, false, fsCertStore.getStore());
    XadesVerificationProfile instance = new XadesVerificationProfile(validationProviderMySigs);
    XadesVerifier verifier = instance.newVerifier();
    Element sig = (Element) doc.getElementsByTagName("ds:Signature").item(0);
    XAdESVerificationResult r = verifier.verify(sig, null);
  }

xades4j.verification.InvalidKeyInfoDataException: No X509Data识别xades4j.verification.SignatureUtils.processKeyInfo(SignatureUtils.java:79) at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:184) at com.mycompany.app.App.verifyBes(App.java:993) at com.mycompany.app.App.main(App.java:460)的叶子证书

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 21:09:02

TL,DR;

目前,没有办法做到这一点。

原因

  • xadesj4j基于XAdES 1.4.1标准。在该标准上,SigningCertificate属性要求在属性中标识签名证书,但如果属性中有多个证书引用,则不说明哪个项对应于签名证书。xades4j试图使用KeyInfo上的数据来计算它。
  • xades4j首先执行核心的XML/加密验证(这需要唱歌的证书),并且只在检查每个合格属性之后。这意味着在试图标识证书时不考虑SigningCertificate属性。也许这是不同的,特别是如果属性中只有一个证书引用(前面提到的问题将不适用)。

Ideas

  1. 标识签名证书的目标是向X509CertSelector提供一个CertificateValidationProvider.validate()。如果没有其他更改,如果在KeyInfo不存在时提供了“空”证书选择器,这意味着CertificateValidationProvider需要知道如何标识签名证书。内置的PKIXCertificateValidationProvider将失败,这是不酷的。然而,由于这个场景目前失败了,这意味着这种改变不会破坏现有的应用程序。
  2. 当没有KeyInfo时,尝试查找SigningCertificate属性,如果它包含单个证书引用,则使用其中的颁发者/序列配置X509CertSelector。考虑到当前的体系结构,这会在核心签名验证之前访问属性数据。

我不喜欢任何选择。我还添加了关于创建在现有问题中对这个问题的提及X509CertSelector。我会再想一想的。可以自由地提出更多的想法或尝试实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58072336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档