Java-клиент WCF для связи с сервером с wsHttpBinding, подписанным сертификатом - PullRequest
0 голосов
/ 24 мая 2019

Мне нужно создать клиент WCF на Java, который должен взаимодействовать с сервером WCF, который использует защиту сообщений с помощью wsHttpBinding и сертификатов.На данный момент мне нужно только подписать сообщение (поэтому шифрование не требуется).Мне удалось создать Java-клиент для связи с сервером, когда безопасность сообщений не была реализована, то есть, там, где не было сертификатов.Я не уверен, как сказать клиенту, какой сертификат использовать, но я могу установить хранилище ключей и хранилище доверенных сертификатов для Java.Ниже приведены шаги, которые я выполнил,

Создание службы: Сначала я создал сервер WCF в Visual studio.Вот wsHttpBinding

<bindings>
    <wsHttpBinding>
        <binding name ="wsMessage">
            <security mode ="Message">
                <message clientCredentialType ="None" negotiateServiceCredential="true"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

Служба подписана со следующей конфигурацией поведения:

<behaviors>
    <serviceBehaviors>
        <behavior>
            <serviceMetadata httpGetEnabled="True" httpsGetEnabled="False"/>
            <serviceDebug includeExceptionDetailInFaults="False" />

            <serviceCredentials>
                <serviceCertificate findValue="mySubjectName" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
            </serviceCredentials>

        </behavior>
    </serviceBehaviors>
</behaviors>

Служба затем развертывается в Azure.Все работает нормально, когда я создаю клиент веб-службы в Visual Studio, поэтому в самой службе не должно быть никаких проблем

Создание клиента:

1) Скачанные двоичные файлы Netbeans инкубатора из следующего зеркала https://www.apache.org/dyn/closer.cgi/incubator/netbeans/incubating-netbeans/incubating-11.0/incubating-netbeans-11.0-bin.zip

2) Я разархивировал все файлы 3) ИзменитьВерсия jdk до 1.8, как описано здесь: Как настроить запуск JDK Netbeans? 4) Открыть Netbeans через инкубацию-netbeans-11.0-bin \ netbeans \ bin \ netbeans64.exe 5) Создать новый веб-проектчерез файл / новый проект ... / веб-приложение Java /.Добавьте сервер GlashFish, выберите Java EE 7 Web.Потом закончил.6) Щелкните правой кнопкой мыши по проекту и выберите New / Other. 7) Введите «Клиент веб-службы» в фильтре.Нажмите кнопку "Далее.8) Введите WSDL в URL WSDL.9) Нажмите "Готово".

Я создал новый класс Java и добавил следующий код:

package MyCode;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.xml.ws.BindingProvider;

public class NewClass {
    public static void main(String in[]) {
        System.out.println("Start");

        setTrustStoreAndKeyStores();

        MyService.Service1 ss = new MyService.Service1();
        MyService.IService1 port = ss.getWSHttpBindingIService1();
        BindingProvider bport = (BindingProvider)port;
        Map<String, Object> requestContext = bport.getRequestContext();
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "...");

        int a = port.addNumbers(2, 7);
        System.out.println("Result: " + a);
    }

    private static void setTrustStoreAndKeyStores() {
        System.setProperty("javax.net.ssl.keyStore", Credentials.keystorePath);
        System.setProperty("javax.net.ssl.keyStorePassword", Credentials.keystorePassword); 
        System.setProperty("javax.net.ssl.trustStore", Credentials.truststorePath);
        System.setProperty("javax.net.ssl.trustStorePassword", Credentials.truststorePassword);

        File keystore = new File(Credentials.keystorePath);
        File truststore = new File(Credentials.truststorePath);
        System.out.println("Keystore exists: " + keystore.exists());
        System.out.println("Truststore exists: " + truststore.exists());


        PrintVariable("javax.net.ssl.trustStore");
        PrintVariable("javax.net.ssl.trustStorePassword");
        PrintVariable("javax.net.ssl.keyStore");
        PrintVariable("javax.net.ssl.keyStorePassword");
    }

    private static void PrintVariable(String key) {
        String value = System.getProperty(key);
        if (value == null) {
            System.out.println(key + " is not defined");
        } else {
            System.out.println(key + ": " + value);
        }
    }

    public static class Credentials {
        public static String keystorePath = "C:/temp/prxyclient.jks";
        public static String keystorePassword = "password";

        public static String keystoreFilename = "prxyclient.jks";
        public static String keystoreType = "pkcs12";
        public static String keystoreAlias = "password";

        public static String truststorePath = "C:/Program Files/Java/jdk1.8.0_161/jre/lib/security/cacerts";
        public static String truststorePassword = "changeit";


    }
}

Когда я запускаю код, я получаю следующий вывод

Keystore exists: true
Truststore exists: true
javax.net.ssl.trustStore: C:/Program Files/Java/jdk1.8.0_161/jre/lib/security/cacerts
javax.net.ssl.trustStorePassword: changeit
javax.net.ssl.keyStore: C:/temp/prxyclient.jks
javax.net.ssl.keyStorePassword: password

Далее следует ошибка:

maj 24, 2019 3:35:15 EM com.sun.xml.wss.impl.misc.DefaultCallbackHandler getDefaultCertificateFromTrustStore
SEVERE: WSS1511: An Error occurred while locating PEER Entity certificate in TrustStore.
maj 24, 2019 3:35:15 EM com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl getCertificate
SEVERE: WSS0216: An Error occurred using CallbackHandler for : EncryptionKeyCallback.AliasX509CertificateRequest
maj 24, 2019 3:35:15 EM com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl getCertificate
SEVERE: WSS0217: An Error occurred using CallbackHandler handle() Method.
java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.getDefaultCertificateFromTrustStore(DefaultCallbackHandler.java:1356)
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.handle(DefaultCallbackHandler.java:599)
    at com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl.getCertificate(DefaultSecurityEnvironmentImpl.java:390)
    at com.sun.xml.wss.impl.filter.SignatureFilter.process(SignatureFilter.java:496)
    at com.sun.xml.wss.impl.HarnessUtil.processWSSPolicy(HarnessUtil.java:69)
    at com.sun.xml.wss.impl.HarnessUtil.processDeep(HarnessUtil.java:248)
    at com.sun.xml.wss.impl.SecurityAnnotator.processMessagePolicy(SecurityAnnotator.java:164)
    at com.sun.xml.wss.impl.SecurityAnnotator.secureMessage(SecurityAnnotator.java:125)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:359)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:295)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.sendRequest(WSSCPlugin.java:373)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.process(WSSCPlugin.java:235)
    at com.sun.xml.ws.security.secconv.impl.client.SCTokenProviderImpl.issue(SCTokenProviderImpl.java:105)
    at com.sun.xml.ws.api.security.trust.client.IssuedTokenManager.getIssuedToken(IssuedTokenManager.java:53)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.invokeSCPlugin(SecurityClientTube.java:458)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:249)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:219)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847)
    at com.sun.xml.ws.client.Stub.process(Stub.java:433)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:131)
    at com.sun.proxy.$Proxy39.addNumbers(Unknown Source)
    at MyCode.NewClass.main(NewClass.java:32)

maj 24, 2019 3:35:15 EM com.sun.xml.wss.impl.filter.SignatureFilter process
SEVERE: WSS1413: Error extracting certificate
com.sun.xml.wss.XWSSecurityException: java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl.getCertificate(DefaultSecurityEnvironmentImpl.java:395)
    at com.sun.xml.wss.impl.filter.SignatureFilter.process(SignatureFilter.java:496)
    at com.sun.xml.wss.impl.HarnessUtil.processWSSPolicy(HarnessUtil.java:69)
    at com.sun.xml.wss.impl.HarnessUtil.processDeep(HarnessUtil.java:248)
    at com.sun.xml.wss.impl.SecurityAnnotator.processMessagePolicy(SecurityAnnotator.java:164)
    at com.sun.xml.wss.impl.SecurityAnnotator.secureMessage(SecurityAnnotator.java:125)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:359)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:295)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.sendRequest(WSSCPlugin.java:373)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.process(WSSCPlugin.java:235)
    at com.sun.xml.ws.security.secconv.impl.client.SCTokenProviderImpl.issue(SCTokenProviderImpl.java:105)
    at com.sun.xml.ws.api.security.trust.client.IssuedTokenManager.getIssuedToken(IssuedTokenManager.java:53)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.invokeSCPlugin(SecurityClientTube.java:458)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:249)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:219)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847)
    at com.sun.xml.ws.client.Stub.process(Stub.java:433)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:131)
    at com.sun.proxy.$Proxy39.addNumbers(Unknown Source)
    at MyCode.NewClass.main(NewClass.java:32)
Caused by: java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.getDefaultCertificateFromTrustStore(DefaultCallbackHandler.java:1356)
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.handle(DefaultCallbackHandler.java:599)
    at com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl.getCertificate(DefaultSecurityEnvironmentImpl.java:390)
    ... 25 more

maj 24, 2019 3:35:15 EM com.sun.xml.wss.jaxws.impl.SecurityTubeBase secureOutboundMessage
SEVERE: WSSTUBE0024: Error in Securing Outbound Message.
com.sun.xml.wss.XWSSecurityException: com.sun.xml.wss.XWSSecurityException: java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.filter.SignatureFilter.process(SignatureFilter.java:502)
    at com.sun.xml.wss.impl.HarnessUtil.processWSSPolicy(HarnessUtil.java:69)
    at com.sun.xml.wss.impl.HarnessUtil.processDeep(HarnessUtil.java:248)
    at com.sun.xml.wss.impl.SecurityAnnotator.processMessagePolicy(SecurityAnnotator.java:164)
    at com.sun.xml.wss.impl.SecurityAnnotator.secureMessage(SecurityAnnotator.java:125)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:359)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:295)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.sendRequest(WSSCPlugin.java:373)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.process(WSSCPlugin.java:235)
    at com.sun.xml.ws.security.secconv.impl.client.SCTokenProviderImpl.issue(SCTokenProviderImpl.java:105)
    at com.sun.xml.ws.api.security.trust.client.IssuedTokenManager.getIssuedToken(IssuedTokenManager.java:53)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.invokeSCPlugin(SecurityClientTube.java:458)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:249)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:219)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847)
    at com.sun.xml.ws.client.Stub.process(Stub.java:433)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:131)
    at com.sun.proxy.$Proxy39.addNumbers(Unknown Source)
    at MyCode.NewClass.main(NewClass.java:32)
Caused by: com.sun.xml.wss.XWSSecurityException: java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl.getCertificate(DefaultSecurityEnvironmentImpl.java:395)
    at com.sun.xml.wss.impl.filter.SignatureFilter.process(SignatureFilter.java:496)
    ... 24 more
Caused by: java.lang.RuntimeException: An Error occurred while locating PEER Entity certificate in TrustStore
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.getDefaultCertificateFromTrustStore(DefaultCallbackHandler.java:1356)
    at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.handle(DefaultCallbackHandler.java:599)
    at com.sun.xml.wss.impl.misc.DefaultSecurityEnvironmentImpl.getCertificate(DefaultSecurityEnvironmentImpl.java:390)
    ... 25 more

maj 24, 2019 3:35:15 EM com.sun.xml.wss.jaxws.impl.SecurityClientTube processClientRequestPacket
SEVERE: WSSTUBE0024: Error in Securing Outbound Message.
com.sun.xml.wss.impl.WssSoapFaultException: Invalid Security Header
    at com.sun.xml.wss.impl.SecurableSoapMessage.newSOAPFaultException(SecurableSoapMessage.java:319)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:365)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:295)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.sendRequest(WSSCPlugin.java:373)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.process(WSSCPlugin.java:235)
    at com.sun.xml.ws.security.secconv.impl.client.SCTokenProviderImpl.issue(SCTokenProviderImpl.java:105)
    at com.sun.xml.ws.api.security.trust.client.IssuedTokenManager.getIssuedToken(IssuedTokenManager.java:53)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.invokeSCPlugin(SecurityClientTube.java:458)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:249)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:219)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847)
    at com.sun.xml.ws.client.Stub.process(Stub.java:433)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:131)
    at com.sun.proxy.$Proxy39.addNumbers(Unknown Source)
    at MyCode.NewClass.main(NewClass.java:32)

Exception in thread "main" javax.xml.ws.WebServiceException: WSSTUBE0024: Error in Securing Outbound Message.
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:301)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.sendRequest(WSSCPlugin.java:373)
    at com.sun.xml.ws.security.secconv.WSSCPlugin.process(WSSCPlugin.java:235)
    at com.sun.xml.ws.security.secconv.impl.client.SCTokenProviderImpl.issue(SCTokenProviderImpl.java:105)
    at com.sun.xml.ws.api.security.trust.client.IssuedTokenManager.getIssuedToken(IssuedTokenManager.java:53)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.invokeSCPlugin(SecurityClientTube.java:458)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:249)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest(SecurityClientTube.java:219)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847)
    at com.sun.xml.ws.client.Stub.process(Stub.java:433)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:131)
    at com.sun.proxy.$Proxy39.addNumbers(Unknown Source)
    at MyCode.NewClass.main(NewClass.java:32)
Caused by: javax.xml.ws.soap.SOAPFaultException: Invalid Security Header
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.getSOAPFaultException(SecurityTubeBase.java:686)
    ... 19 more
Caused by: com.sun.xml.wss.impl.WssSoapFaultException: Invalid Security Header
    at com.sun.xml.wss.impl.SecurableSoapMessage.newSOAPFaultException(SecurableSoapMessage.java:319)
    at com.sun.xml.wss.jaxws.impl.SecurityTubeBase.secureOutboundMessage(SecurityTubeBase.java:365)
    at com.sun.xml.wss.jaxws.impl.SecurityClientTube.processClientRequestPacket(SecurityClientTube.java:295)
    ... 18 more
C:\Users\jeslun\AppData\Local\NetBeans\Cache\11.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\jeslun\AppData\Local\NetBeans\Cache\11.0\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 2 seconds)

Я думаю, что NetBeans использует Metro 2.0 и Glashfish.Кажется, ошибка в том, что он не может найти правильный сертификат.

Ранее я пытался создать Java-клиент в Eclipse как с CXF, так и с Axis2, но, вероятно, поместил это в другой поток.Я потратил много времени, пытаясь заставить это работать, и читал много статей, блогов и т. Д. Но любая помощь приветствуется.

1 Ответ

0 голосов
/ 20 июня 2019

После двух изменений я наконец-то заработал.

Первое: Netbeans немного глючит. После долгих поисков я обнаружил следующее.
1) В представлении проектов слева разверните «Ссылки на веб-службы»,
2) Щелкните правой кнопкой мыши службу WCF и выберите «Изменить атрибут веб-службы».
3) На вкладке «Качество обслуживания» установите флажок для использования значений по умолчанию.
4) Мы не хотим ставить этот флажок, но в моем случае это вызвало NetBeans, чтобы сообщить мне, что Metro не был загружен, и спросить, нужно ли его загружать.
5) После того, как он был загружен и загружен в NetBeans, я получил возможность выбрать хранилище ключей в разделе «Качество обслуживания».

Второе, На сервере, который содержит WCF, необходимо добавить сертификат клиента доверенным лицам следующим образом:
1) Нажмите «Пуск» и введите «mmc», а затем «Ввод». Это запустит консоль управления Microsoft.
2) Нажмите Файл / Добавить / Удалить оснастку ...
3) Нажмите Сертификаты на левой стороне, а затем «Добавить>»
4) Выберите учетную запись компьютера, а затем следующий
5) Выберите локальный компьютер и затем закончите
6) Нажмите ОК.
7) Развернуть Сертификаты (локальный компьютер) / Доверенные люди /
8) Щелкните правой кнопкой мыши на Сертификаты (в разделе Доверенные люди), выберите Все задачи / Импорт
9) Следуйте инструкциям и импортируйте клиентский сертификат

...