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

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

据我所知,有必要通过Keyselector而不是Domvalidatecontext的钥匙。但是,我不知道如何实现按键器。

这是我发现如何实现按键器的唯一示例: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/xmldsig/xmldigitalsignature.html

不幸的是,它行不通。在该实现中,它可以执行以下操作,但始终失败,因为没有密钥值元素(看来,它们是org.jcp.xml.dsig.internal.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获取公钥。

有帮助吗?

解决方案

扩展您已检查的IF()条件,以查看XS是否是KeyValue的实例,还可以检查X509DATA的实例,如下所示:

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

其他提示

只需将xmldsig.jar包括在您的构建路径中,并检查您的JDK的1.5您必须添加到1.6的构建路径中,它们内置了它,因此无需添加参考http://java.sun.com/developer/TechnicalArtsicles/xml/dig_signature_api/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top