Я работаю над заданием, в котором мне нужно использовать веб-сервис, подписав его цифровой подписью.Я сгенерировал клиент Web-сервиса, используя JAX-WS.Для подписания запроса мыла я реализовал обработчик SOAP, который подпишет конверт с помощью библиотеки APACHE wss4j перед отправкой его на сервер.У меня есть файл .pfx, который я загружаю в хранилище ключей и использую для подписи.
Все это работает нормально, когда я запускаю этот код из затмения и получаю правильный ответ от сервера.
Проблема в том, что я включил тот же код в свое веб-приложение и пытаюсь отправить оттуда запрос, но каким-то образом подпись не проверяется на стороне сервера и получает ответное мыло: Сервер 75275
Мой вопрос:wss4j работает для подписания запроса мыла на веб-сервере?Если нет, то каким еще способом я могу попытаться решить эту проблему.Любое направление к решению будет высоко оценено.
Код
Document doc = soapEnv.getOwnerDocument();
WSSecSignature builder = new WSSecSignature();
WSSecTimestamp timestamp = new WSSecTimestamp();
WSSecUsernameToken usernametoken = new WSSecUsernameToken();
usernametoken.setPasswordType(WSConstants.PASSWORD_TEXT);
usernametoken.setUserInfo(SOAP_USER, SOAP_USER_PASS);
usernametoken.addNonce();
usernametoken.addCreated();
WSSecHeader secHeader = new WSSecHeader();
// secHeader.setMustUnderstand(true);
secHeader.insertSecurityHeader(doc);
usernametoken.build(doc, secHeader);
timestamp.build(doc, secHeader);
builder.setUserInfo(KEYSTORE_ALIAS, KEYSTORE_PWD);
builder.setX509Certificate(cert);
builder.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
builder.setSignatureAlgorithm(WSConstants.RSA_SHA1);
builder.setSigCanonicalization(WSConstants.C14N_EXCL_OMIT_COMMENTS);
builder.setDigestAlgo(WSConstants.SHA1);
builder.setUseSingleCertificate(true);
builder.appendBSTElementToHeader(secHeader);
// Set message parts to sign
List<WSEncryptionPart> parts = new ArrayList<WSEncryptionPart>();
WSEncryptionPart bodyPart1 = new WSEncryptionPart("Body", WSConstants.URI_SOAP11_ENV, "Content");
bodyPart1.setElement(soapBody);
parts.add(bodyPart1);
builder.setParts(parts);
// Set keystore and sign the document
Properties properties = new Properties();
properties.setProperty("org.apache.wss4j.crypto.provider",
"class org.apache.ws.security.components.crypto.Merlin");
Merlin crypto = (Merlin) CryptoFactory.getInstance(properties);
crypto.setKeyStore(store);
doc = builder.build(doc, crypto, secHeader);
soapMsg.saveChanges();
// код для получения сертификата и хранения
// code to get cert and keystore
private boolean getX509Certificate() {
String keyAlias = "";
try {
Security.addProvider(new BouncyCastleProvider());
FileInputStream stream = new FileInputStream(KEYSTORE_FILE); //.pfx file
this.store = KeyStore.getInstance("PKCS12");
store.load(stream, KEYSTORE_PWD.toCharArray());
Enumeration<String> aliases = store.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
if (store.getCertificate(alias).getType().equals("X.509")) {
keyAlias = alias;
}
}
this.cert = (X509Certificate) store.getCertificate(keyAlias);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// исключение
soap: Server.75275 Значение ответа: soap: Server.75275 2018-05-11 18: 56: 17,977 ОШИБКА [WebService] (WFA: 132301310 - 152335722 Ассоциированный: 349730687 IE = 349730685) Исключение javax.xml.ws.soap.SOAPFaultException: 2018-05-11 18: 56: 17,978 ОШИБКА [WebService] (WFA: 132301310 - 152335722 Ассоциированный: 349730687 IE = 349730685) [org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallertil.createSystemException (MethodMarshallerUtils.java:1363) org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.demarshalFaultResponse (MethodMarshallerUtils.java:1089) org.apache.axis2.jaxwlsethomalFaldDocLitWrappedMinimalMethodMarshaller.java:684) org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.getFaultResponse (JAXWSProxyHandler.java:626) org.apache.axis2.jaxws.lient.proxy.JAXWSProxyHandler.createResponse (JAXWSProxyHandler.java:566) org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.java:213) com.sun.proxy. $ Proxy256.synchronousSendAndReceive (неизвестный источник)
Спасибо, Арун