使用javax.xml.crypto.dsig,如何在不指定公鑰的情況下解組並驗證XMLSignature?公鑰似乎在簽名的XML中,但我無法想出一個辦法來得到它。在xml中使用公鑰驗證javax.xml.crypto.dsig
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
據我可以告訴有必要通過一個KeySelector,而不是一鍵使用DOMValidateContext的。但是,我無法弄清楚如何實現一個KeySelector。
這裏是我發現如何實現一個KeySelector唯一的例子: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
遺憾的是它不工作。在那個實現中,它執行以下操作,但總是失敗,因爲沒有KeyValue元素(它看起來代替了KeyValue元素,它們是org.jcp.xml.dsig.internal.dom.DOMX509Data元素,它們沒有辦法通過從他們的關鍵)。
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獲取公鑰。
注意`X509Certificate`類在這裏需要`java.security.cert中.X509Certificate`而不是`javax.security.cert.X509Certificate`。 – 2015-09-17 16:19:47