javax.xml.crypto.dsig使用XML中的公钥验证
-
10-10-2019 - |
题
使用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/
不隶属于 StackOverflow