Клиент WCF.Сертификат клиента.Первый вызов успешен, второй вызов не удался - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь подключиться к мыльному веб-сервису через https, используя soap11 и учетные данные сертификата клиента, используя c # .NET 4.5.Я использую инструмент vs, чтобы добавить ссылку на сервис, и он создает мыльный клиент для меня.

Я создал customBinding для выполнения https через soap11:

App.config

<system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="*****" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:05:00" sendTimeout="00:05:00">
          <textMessageEncoding messageVersion="Soap11"/>
          <httpsTransport useDefaultWebProxy="false" requireClientCertificate="true" allowCookies="false" />
        </binding>
      </customBinding>
    </bindings>
    <client>
        <endpoint address="******************"
            behaviorConfiguration="******************"
            binding="customBinding" bindingConfiguration="******************"
            contract="******************"
            name="******************" />
    </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="******************">
        <clientCredentials>
          <clientCertificate findValue="******************" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </clientCredentials>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>

c # код:

     var client = new IConsultService.ConsultServiceClient();
     client.consult("1"); 
     client.consult("1"); <!-- fail error 404 - there was not endpoint listening at

Если я отправляю сообщение без сертификата, получаю tomcat 404, если я отправляю сертификат клиента, он работает нормально с первого раза, и мне кажется, что ябыть перенаправленным.Проблема заключается в том, что по второму запросу сбой (404), также, если я создаю экземпляр клиента снова не удается.Работайте только тогда, когда остановите приложение и запустите его снова.Кажется, что-то кешируется в статическом стеке программы.

И поскольку 404, я предполагаю, что это что-то из сертификата клиента, если я запрашиваю без сертификата, ошибка та же,

Я попытался создать привязки программно, установив ClientBase.CacheSetting = CacheSetting.AlwaysOff без удачи.

Edit1: Использование System.Net.HttpWebRequest происходит так же, первый запрос в порядке, второй запрос 404.

Edit2: Похоже, что на рукопожатии что-то есть, первый запрос отправить «Сертификат, Обмен ключами клиента», а второй запрос «Изменить обмен ключами шифра»

, есть ли способ принудительно закрытьканал и всегда отправлять "сертификат, клиентский ключ обмена"?

enter image description hereenter image description here

Спасибо

1 Ответ

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

Во-первых, если мы аутентифицируем клиента с сертификатом X509, нам обычно необходимо установить доверительные отношения между сервером и клиентом, а именно, мы должны установить сертификат друг друга в доверенный корневой центр сертификации, а клиент должен предоставитьИдентификация для подтверждения личности сервера (обычно это открытый ключ сертификата сервера или имя хоста)

<endpoint address="net.tcp://10.157.13.69:4386/" binding="netTcpBinding"
    bindingConfiguration="NetTcpBinding_ITestService" contract="ServiceReference1.ITestService"
    name="NetTcpBinding_ITestService">
    <identity>
        <dns value="vabqia969VM" />
    </identity>
</endpoint>

Во-вторых, я подозреваю, что проблема вызвана версией TLS.Вы пытались обновить Dotnetframework этого проекта?по крайней мере, 4.6.2 выше.Пожалуйста, обратитесь к следующему документу.
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Не стесняйтесь сообщить мне, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...