2011-01-13 42 views
5

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.

Trả lời

5

Mở rộng if() điều kiện bạn đã kiểm tra để xem nếu xs là một thể hiện của KeyValue cũng để kiểm tra thể hiện của X509Data như sau:

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

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'. –

Các vấn đề liên quan