2015-10-16 20 views
7

का उपयोग करके SOAP अनुरोध सत्यापित करें मेरे पास SOAP सर्वर है। साबुन अनुरोध जो सर्वर पर प्राप्त हो रहा है ws सुरक्षा शीर्षलेख है। अनुरोध एक्सएमएल के मुख्य नोड्स निम्नलिखित हैं।X509 प्रमाणपत्र

  1. BinarySecurityToken (X509PKIPathv1 प्रमाण पत्र)
  2. DigestMethod
  3. DigestValue
  4. SignatureValue
  5. SecurityTokenReference

  6. डेटा (डेटा है कि सोप शरीर में ग्राहक द्वारा भेज रहा है)

मुझे प्रमाण पत्र (.cer फ़ाइलें) का उपयोग कर अनुरोध सत्यापित करें जो क्लाइंट (अनुरोध के प्रेषक) द्वारा प्रदान किया गया है।

अनुरोधों को सत्यापित करने के लिए क्या कदम हैं? मैं गुगले लेकिन कोई उम्मीद नहीं। अवधारणा को समझने में मेरी मदद करें। एक बुनियादी विचार प्राप्त करने से मेरी मदद मिलेगी। मैं PHP पृष्ठभूमि से हूँ। ऐसा करने के लिए कोई पुस्तकालय उपलब्ध नहीं है। एक लंबे शोध के बाद मैं BinarySecurityToken से base64_encode($certFile) $ प्रमाणपत्र के साथ मिलान करने में सक्षम हूं प्रमाण पत्र अनुरोधकर्ता का प्रमाण पत्र है। अब मैं शोध कर रहा हूं कि DigestValue से मिलान कैसे करें।

उत्तर

5

डब्ल्यूएस-सुरक्षा शीर्षलेख निम्नलिखित द्वारा सत्यापित किए जा सकते हैं। मैंने इसके लिए एक उपयोगिता लिखी है। इस पर एक नज़र डालो।

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; 
    } 
} 

नोट आप सोप संदेश प्रदान करने के लिए के रूप में यह है। आपको कहीं भी कोई एक्सएमएल प्रारूप या खाली स्थान नहीं करना चाहिए। सुरक्षा जोड़ा गया SOAP संदेश बहुत संवेदनशील है। अंत में एक जगह भी एसओएपी संदेश को अमान्य बना देगा। उम्मीद है कि यह सहायक है।

+0

'X509KeySelector' कक्षा का स्रोत क्या है? – janv8000

+0

@ janv8000 आयात java.security.cert.X509 प्रमाण पत्र –

संबंधित मुद्दे