使用java密钥库的SOAP处理程序

使用java密钥库的SOAP处理程序,java,web-services,ssl,keystore,soaphandler,Java,Web Services,Ssl,Keystore,Soaphandler,我正在研究web服务安全性,尝试在服务器和客户端之间加密和签署SOAP消息。我使用了BouncyCastle、WSS4j和SOAP处理程序 为了测试我的工作,首先,我在服务器端和客户端使用了相同的密钥库文件。我在网上遵循了一些教程,它起了作用:一方发送的消息经过加密和签名,然后在另一方成功解密 但是现在我为服务器和客户机生成了不同的证书,并将客户机的证书导入服务器jks文件,反之亦然,我似乎不知道如何完成任务。它仍然在加密和签名,就好像它只有一个jks文件而没有导入的证书一样。代码如下: Cry

我正在研究web服务安全性,尝试在服务器和客户端之间加密和签署SOAP消息。我使用了BouncyCastle、WSS4j和SOAP处理程序

为了测试我的工作,首先,我在服务器端和客户端使用了相同的密钥库文件。我在网上遵循了一些教程,它起了作用:一方发送的消息经过加密和签名,然后在另一方成功解密

但是现在我为服务器和客户机生成了不同的证书,并将客户机的证书导入服务器jks文件,反之亦然,我似乎不知道如何完成任务。它仍然在加密和签名,就好像它只有一个jks文件而没有导入的证书一样。代码如下:

Crypt_handler.java
public class Crypt_handler implements SOAPHandler<SOAPMessageContext> , CallbackHandler{

public Properties prop;

public InputStream input= null;



public Crypt_handler ()  {


    try {
        prop=new Properties();
        input = new FileInputStream("config.properties");
        if(input==null){
            System.out.println("Sorry, unable to find " );
        return;}
        prop.load(input);

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

public boolean handleMessage(SOAPMessageContext messageContext) {

   try {
       // got the message from the context
       SOAPMessage msg = messageContext.getMessage();

      // is outgoing?
     Boolean isOutGoing = (Boolean) messageContext
               .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

       if (isOutGoing) {

           // if it is outgoing code and sign


           crypt.EncryptUtil.EncryptSOAPEnvelope(msg, prop);
           crypt.EncryptUtil.SignSOAPEnvelope(msg, prop);


       } else {

           // if it is incooming decode and check signature.
           crypt.EncryptUtil.CheckSignatureAndDecode(msg, this , prop);

       }

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

       throw new RuntimeException(ex.getMessage());
   }

   return true;




}

  public boolean handleFault(SOAPMessageContext context) {

    System.out.println("Server : handleFault()......");

    return true;
   }

 public void close(MessageContext context) {
    System.out.println("Server : close()......");
  }


 public Set<QName> getHeaders() {

Set<QName> HEADERS = new HashSet<QName>();

HEADERS.add(new QName(WSConstants.WSSE_NS, "Security"));
HEADERS.add(new QName(WSConstants.WSSE11_NS, "Security"));
HEADERS.add(new QName(WSConstants.ENC_NS, "EncryptedData"));

return HEADERS;

}

 private void generateSOAPErrMessage(SOAPMessage msg, String reason) {
   try {
      SOAPBody soapBody = msg.getSOAPPart().getEnvelope().getBody();
      SOAPFault soapFault = soapBody.addFault();
      soapFault.setFaultString(reason);
      throw new SOAPFaultException(soapFault); 
   }
   catch(SOAPException e) { }
  }

 @SuppressWarnings("deprecation")
 public void handle(Callback[] callbacks) throws IOException,

        UnsupportedCallbackException {

     String password;

     for (Callback cb : callbacks) {

         if (cb instanceof WSPasswordCallback) {

              WSPasswordCallback pc = (WSPasswordCallback) cb;

             try {

                 password = /*prop.getProperty("password")*/"password";

             } catch (Exception e) {


                 throw new UnsupportedCallbackException(pc,  "failure recovering the key in the properties");

             }

            if (pc.getIdentifer() != null) {

                 pc.setPassword(password);

             }

        }

       }

    }

 }
这是我的config.properties文件:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=password
org.apache.ws.security.crypto.merlin.keystore.alias=first
org.apache.ws.security.crypto.merlin.file=/home/user/workspace/crypt_server/keystore.jks
alias=first
password=password
任何帮助都将不胜感激。提前谢谢

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=password
org.apache.ws.security.crypto.merlin.keystore.alias=first
org.apache.ws.security.crypto.merlin.file=/home/user/workspace/crypt_server/keystore.jks
alias=first
password=password