Sử dụng javax.xml.crypto.dsig, làm cách nào để hủy hợp nhất và xác thực XMLSignature mà không chỉ định khóa công khai? Khóa công khai dường như nằm trong xml đã ký, nhưng tôi không thể tìm ra cách để lấy nó.Xác thực javax.xml.crypto.dsig bằng cách sử dụng khóa công khai trong xml
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
Theo như tôi có thể nói cần thiết phải chuyển KeySelector thay vì khóa cho DOMValidateContext. Tuy nhiên, tôi không thể tìm ra cách để thực hiện một KeySelector.
Dưới đây là ví dụ duy nhất tôi đã tìm thấy về làm thế nào để thực hiện một KeySelector: http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
Đáng tiếc là nó không hoạt động. Trong quá trình thực hiện, nó thực hiện như sau nhưng luôn thất bại vì không có các phần tử KeyValue (có vẻ như thay vì các phần tử KeyValue chúng là các phần tử org.jcp.xml.dsig.internal.dom.DOMX509Data không có cách để định vị từ họ).
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!");
Vì vậy, có cách nào để thực hiện việc này không? Tôi muốn có thể xác nhận chữ ký của tệp xml mà không cần phải có khóa công khai. Tôi chỉ muốn lấy khóa công khai từ xml.
Lưu ý rằng lớp 'X509Certificate' ở đây cần phải là' java.security.cert .X509Certificate' và không phải 'javax.security.cert.X509Certificate'. –