2015-10-16 30 views
7

私はSOAPサーバーを持っています。サーバーで受信しているの石けつのリクエストには、というのセキュリティーヘッダーがあります。次に、リクエストXMLのメインノードを示します。X509証明書を使用してSOAPリクエストを確認する

  1. のBinarySecurityToken(X509PKIPathv1証明書)
  2. DigestMethod
  3. DigestValue
  4. SignatureValue
  5. SecurityTokenReference

  6. データ(SOAPボディに クライアントによって送信されたデータ)

私はに、クライアントが提供する証明書(.cerファイル)を使用して要求を確認する必要があります(要求の送信者)。

のリクエストを検証する手順は何ですか?私はグーグルだが、希望はない。このコンセプトを理解するのを助けてください。基本的な考え方は私を助けます。私はPHPの背景からです。これを行うためのライブラリはありません。長い研究の末、私はBinarySecurityTokenbase64_encode($certFile)を一致させることができます。$ certFileはリクエスタの証明書です。今私はどのようにDigestValueと一致させるために研究しています。

答えて

5

WS-Securityヘッダーは、以下で確認できます。私はそのためのユーティリティを書いています。それを見てみましょう。

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メッセージを提供する必要があります。どこかのXMLフォーマットや空きスペースを使ってはいけません。セキュリティが追加されたSOAPメッセージは非常に機密です。最後のスペースでもSOAPメッセージは無効になります。これが参考になることを願っています。

+0

'X509KeySelector'クラスのソースは何ですか? – janv8000

+0

@ janv8000 import java.security.cert.X509Certificate –

関連する問題