【问题标题】:javax.xml.crypto.dsig validation using the public key in the xml使用 xml 中的公钥进行 javax.xml.crypto.dsig 验证
【发布时间】:2011-01-13 01:13:12
【问题描述】:

使用 javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证 XMLSignature?公钥似乎在签名的 xml 中,但我无法找到获取它的方法。

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

据我所知,有必要将 KeySelector 而不是 Key 传递给 DOMValidateContext。但是,我不知道如何实现 KeySelector。

这是我发现的关于如何实现 KeySelector 的唯一示例: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

不幸的是,它不起作用。在该实现中,它执行以下操作但总是失败,因为没有 KeyValue 元素(似乎它们是 org.jcp.xml.dsig.internal.dom.DOMX509Data 元素而不是 KeyValue 元素,它们没有办法获取他们的钥匙)。

List list = keyInfo.getContent();

for (int i = 0; i < list.size(); i++) {
    XMLStructure xs = (XMLStructure) list.get(i);
    if(xs instanceof KeyValue) {
        PublicKey pk = null;
        try {
            pk = ((KeyValue) xs).getPublicKey();
        } catch (KeyException ke) {
            throw new KeySelectorException(ke);
        }
        // make sure algorithm is compatible with method
        if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
            return new SimpleKeySelectorResult(pk);
        }
    }
}
throw new KeySelectorException("No KeyValue element found!");

那么,有没有办法做到这一点?我希望能够验证 xml 文件的签名而不必拥有公钥。我只想从 xml 中获取公钥。

【问题讨论】:

    标签: java xml-signature


    【解决方案1】:

    扩展您检查 xs 是否为 KeyValue 的实例的 if () 条件,同时检查 X509Data 的实例,如下所示:

    else if (xs instanceof X509Data) {
         for (Object data : ((X509Data) xs).getContent()) {
              if (data instanceof X509Certificate) {
                  pk = ((X509Certificate) data).getPublicKey();
              }
         }
    }
    

    【讨论】:

    • 注意这里的X509Certificate类必须是java.security.cert.X509Certificate而不是javax.security.cert.X509Certificate
    【解决方案2】:

    只需将 xmldsig.jar 包含到您的构建路径中并检查您的 JDK 是否为 1.5,您必须添加到您的构建路径中 对于 1.6,它们已内置,因此无需添加以供参考 http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多