我有一个wcf web服务,其ws-security策略是用c#编写的。此服务对x509证书使用加密和签名策略。
此外,我还使用ApacheCXF用java编写了一个客户机。我的客户端代码如下所示:
URL wsdlURL = Service.WSDL_LOCATION;
if (args.length > 0 && args[0] != null && !"".equals(args[0])) {
File wsdlFile = new File(args[0]);
try {
if (wsdlFile.exists()) {
wsdlURL = wsdlFile.toURI().toURL();
} else {
wsdlURL = new URL(args[0]);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put("action", "Timestamp Signature Encrypt");
outProps.put("passwordType", "PasswordDigest");
outProps.put("signatureUser", "user1");
outProps.put("passwordCallbackClass", "cxfSign.PasswordCallback");
outProps.put("encryptionUser", "user2");
outProps.put("encryptionPropFile", "Client_Encrypt.properties");
outProps.put("encryptionKeyIssuerSerial", "serial");
/* I don't know how to set this part */
outProps.put("encryptionParts", "???");
outProps.put("signaturePropFile", "Client_Sign.properties");
outProps.put("signatureKeyIssuerSerial", "serial2");
/* I don't know how to set this part */
outProps.put("signatureParts", "???");
outProps.put("encryptionKeyTransportAlgorithm",
"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p");
outProps.put("signatureAlgorithm", "http://www.w3.org/2000/09/xmldsig#rsa-sha1");
Map<String, Object> inProps = new HashMap<String, Object>();
inProps.put("action", "Timestamp Signature Encrypt");
inProps.put("passwordType", "PasswordText");
inProps.put("passwordCallbackClass", "cxfSign.PasswordCallback");
inProps.put("decryptionPropFile", "Client_Sign.properties");
inProps.put("encryptionKeyIssuerSerial", "7ee54c1e1474ce64429fd47d24bf294c3422b7dd");
inProps.put("signaturePropFile", "Client_Encrypt.properties");
inProps.put("signatureKeyIssuerSerial", "6f36d23c8d8ad90b62380d465ca70099d4762201");
inProps.put("encryptionKeyTransportAlgorithm",
"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p");
inProps.put("signatureAlgorithm", "http://www.w3.org/2000/09/xmldsig#rsa-sha1");
DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();
coverageChecker.setSignBody(true);
coverageChecker.setSignTimestamp(true);
coverageChecker.setEncryptBody(true);
Service ss = new Service(wsdlURL, SERVICE_NAME);
IService port = ss.getCustomBindingIService();
Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new WSS4JInInterceptor(inProps));
client.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
client.getInInterceptors().add(coverageChecker);
{
// calling the method
}
我已尝试正确设置signatureparts和encryptionparts。我需要签署正文和一些标题属性,并加密整个正文。我尝试了一些模式,但出现以下错误:
General security error (WSEncryptBody/WSSignEnvelope: Element to encrypt/sign not found: http://schemas.xmlsoap.org/soap/envelope/, Body)
有人知道如何解决这个问题吗?
暂无答案!
目前还没有任何答案,快来回答吧!