2015-10-16 18 views
7

Tôi có một máy chủ SO2 SOAP. Yêu cầu xà phòng đang nhận tại máy chủ có các tiêu đề bảo mật ws an toàn. Sau đây là các nút chính của XML yêu cầu.Xác minh yêu cầu SOAP bằng chứng chỉ X509

  1. BinarySecurityToken (X509PKIPathv1 chứng chỉ)
  2. DigestMethod
  3. DigestValue
  4. SignatureValue
  5. SecurityTokenReference

  6. dữ liệu (dữ liệu được gửi bởi khách hàng trong cơ thể SOAP)

Tôi phải xác minh yêu cầu bằng chứng chỉ (tệp .cer) do khách hàng cung cấp (người gửi yêu cầu).

Các bước để xác thực yêu cầu là gì? Tôi Googled nhưng không có hy vọng. Xin hãy giúp tôi hiểu khái niệm. Bắt một ý tưởng cơ bản sẽ giúp tôi. Tôi đến từ nền php. Không có thư viện nào để làm điều này. Sau một nghiên cứu dài, tôi có thể khớp với BinarySecurityToken với base64_encode($certFile) $ certFile là chứng nhận của người yêu cầu. Bây giờ tôi đang nghiên cứu làm thế nào để phù hợp với DigestValue với những gì.

Trả lời

5

Các tiêu đề WS-Security có thể được xác minh bằng những điều sau đây. Tôi đã viết một tiện ích cho điều đó. Có một cái nhìn vào nó.

import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.StringReader; 
import java.security.KeyStore; 
import java.security.Provider; 
import java.security.PublicKey; 
import java.security.cert.X509Certificate; 

import javax.xml.crypto.dsig.XMLSignature; 
import javax.xml.crypto.dsig.XMLSignatureFactory; 
import javax.xml.crypto.dsig.dom.DOMValidateContext; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.xml.sax.InputSource; 


public class WSUtil { 
    public static void main(String[] args) throws Exception { 

     String req = "SOAPMESSAGE"; 
     Document p = createXMLDocument(req); 
     InputStream inStream = new FileInputStream("certificate.p12"); //Provide your certificate file 

     KeyStore ks = KeyStore.getInstance("PKCS12"); 
     ks.load(inStream, "pass".toCharArray()); //Certificate password - pass 

     String alias = ks.aliases().nextElement(); 
     X509Certificate certificate = (X509Certificate) ks.getCertificate(alias); 

     validateSignature(p.getElementsByTagName("ds:Signature").item(0),p.getElementsByTagName("soapenv:Body").item(0),certificate.getPublicKey());//True if the message is valid 
    } 

    public static Document createXMLDocument(String xmlString) throws Exception { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     DocumentBuilder builder; 
     Document document = null; 
     try { 
      builder = factory.newDocumentBuilder(); 
      document = builder.parse(new InputSource(
        new StringReader(xmlString))); 
     } catch (Exception e) { 
      throw e; 
     } 
     return document; 
    } 

    private static boolean validateSignature(Node signatureNode, Node bodyTag, PublicKey publicKey) { 
     boolean signatureIsValid = false; 
     try { 
      // Create a DOM XMLSignatureFactory that will be used to unmarshal the 
      // document containing the XMLSignature 
      String providerName = System.getProperty 
        ("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI"); 
      XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", 
        (Provider) Class.forName(providerName).newInstance()); 

      // Create a DOMValidateContext and specify a KeyValue KeySelector 
      // and document context 
      DOMValidateContext valContext = new DOMValidateContext(new X509KeySelector(publicKey), signatureNode); 
      valContext.setIdAttributeNS((Element) bodyTag, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id"); 

      // Unmarshal the XMLSignature. 
      XMLSignature signature = fac.unmarshalXMLSignature(valContext); 
      // Validate the XMLSignature. 
      signatureIsValid = signature.validate(valContext); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return signatureIsValid; 
    } 
} 

Note Bạn cần phải cung cấp các thông điệp SOAP như nó được. Bạn không nên làm bất kỳ định dạng XML hoặc bất kỳ không gian trống nào đó. Thông báo SOAP được thêm vào an ninh rất nhạy cảm. Ngay cả một không gian ở cuối sẽ làm cho thông điệp SOAP là không hợp lệ. Hy vọng điều này là hữu ích.

+0

Nguồn của lớp 'X509KeySelector' là gì? – janv8000

+0

@ janv8000 nhập java.security.cert.X509Certificate –

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