我的错误是:
org.apache.cxf.enterceptor.Fault:消息部分{http://www.w3.org/2001/04/xmlenc#}无法识别EncryptedData。(它存在于服务WSDL中吗?(
这是由于设置了解码加密数据的属性。我的问题是,我在如何使用apachecxf(Timestamp和Signature工作正常(时遇到了问题。
这是我的代码部分:
公共WSS4JStaxInInterceptor ws4JStax InIntercepter((引发异常{
WSSSecurityProperties inProperties = new WSSSecurityProperties();
//inProperties.addAction(WSSConstants.USERNAMETOKEN);
inProperties.addAction(WSSConstants.TIMESTAMP);
inProperties.addAction(WSSConstants.SIGNATURE);
inProperties.addAction(WSSConstants.ENCRYPTION);
inProperties.setEncryptionUser("xxx");
inProperties.loadDecryptionKeystore(this.getClass().getClassLoader().getResource(""C:\\Users\\miha_\\OneDrive\\Dokumenti\\Job\\Lj\\Spring\\demo\\src\\main\\resources\\xxxx.jks"),"xxx".toCharArray());;
inProperties.setMustUnderstand(false);
inProperties.loadSignatureKeyStore(this.getClass().getClassLoader().getResource(""C:\\Users\\miha_\\OneDrive\\Dokumenti\\Job\\Lj\\Spring\\demo\\src\\main\\resources\\xxxx.jks"),"xxx".toCharArray());
inProperties.setSignatureUser("cbd");
//inProperties.setSignatureVerificationCryptoProperties(wss4jInProperties());
//inProperties.setUsernameTokenPasswordType(WSSConstants.UsernameTokenPasswordType.PASSWORD_DIGEST);
inProperties.setCallbackHandler(new ClientKeystorePasswordCallback());
WSS4JStaxInInterceptor wss4JStaxInInterceptor = new WSS4JStaxInInterceptor(inProperties);
return wss4JStaxInInterceptor;
}
所以我定义";loadDecryptionKeystore";我在其中获得密钥库。但是,我在哪里定义要使用哪个证书(使用setEncryptionUser("xxx"(;?(在证书中访问私钥的密码在哪里?我应该如何定义其他东西?
ps.:这是接收请求时服务器部分的配置
谢谢
您可以通过调用setEncryptionUser
来定义要获取的证书。
私钥的密码应由您通过调用setCallbackHandler
定义的CallbackHandler
提供
当需要私钥的密码时,框架将通过使用WSPasswordCallback
实例调用回调处理程序来请求它(有关详细信息,请参阅有关WSPasswordCallback标识符的文档部分(。
回调处理程序的一个简单示例:
/**
* @see <a href="https://github.com/gmazza/blog-samples/blob/master/cxf_x509_profile/client/src/main/java/client/ClientKeystorePasswordCallback.java">ClientKeystorePasswordCallback</a>
*/
public class ClientKeystorePasswordCallback implements CallbackHandler {
private Map<String, String> passwords =
new HashMap<String, String>();
public ClientKeystorePasswordCallback() {
passwords.put("myclientkey", "ckpass");
}
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
String pass = passwords.get(pc.getIdentifier());
if (pass != null) {
pc.setPassword(pass);
return;
}
}
}
}