WCF - SSL - Проверка подлинности клиента - Невозможно реализовать в Windows 7, а в Windows XP могу.

Я пытаюсь создать клиент и сервер wcf (самостоятельно) с SSL (транспортная безопасность) в обоих направлениях - сертификат сервера и сертификат клиента.

В Windows XP все работает, но в Windows 7 не удалось получить сертификат клиента. Если сервер на winXp, а клиент на win7 - сработает, наоборот - не сработает.

Вот app.config сервера:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>         
        </behavior>
        <behavior name="NewBehavior1">
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="ServerCert" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine" />
            </clientCertificate>
            <windowsAuthentication allowAnonymousLogons="True"/>
          </serviceCredentials>

        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
           <transport clientCredentialType="Certificate" proxyCredentialType="None" realm=""/>
          </security>
        </binding>
      </basicHttpBinding>

    </bindings>
    <services>
      <service behaviorConfiguration="NewBehavior1"
            name="Service.Calc">
        <endpoint
          address="https://172.18.96.116:8413/MyCalcService1"
          binding="basicHttpBinding"
          bindingConfiguration="Binding1"
          name="TestWCFService.Http"
          contract="Contarcts.ICalc" />
        <host>
          <baseAddresses>
            <add baseAddress="https://172.18.96.116:8413/MyCalcService1" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

</configuration>

Клиент:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="clientBehavior1">
          <clientCredentials>
            <clientCertificate findValue="ClientCert"
                 storeLocation="LocalMachine"
                 storeName="My"
                 x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="TestWCFService.Http1">
          <security mode="Transport">
          <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://172.18.96.116:8413/MyCalcService1"
      binding="basicHttpBinding"
      bindingConfiguration="TestWCFService.Http1"
      contract="CalcProxy.ICalc"
      name="TestWCFService.WSHttp1"
      behaviorConfiguration="clientBehavior1"
      />
    </client>
  </system.serviceModel>

Код сервера:

ServiceHost calcHost = new ServiceHost(typeof(Calc));
calcHost.Open();

Код клиента:

System.Net.ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);


CalcClient proxy = new CalcClient();
int res = proxy.Add(2, 4);

Мои команды makecert:

makecert -sv SignRoot.pvk -cy authority -r MyCA.cer -a sha1 -n "CN=MyCA" -ss my -sr localmachine

makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ClientCert" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

makecert -iv SignRoot.pvk -ic MyCA.cer -cy end -pe -n CN="ServerCert" -eku 1.3.6.1.5.5.7.3.2 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

Я также подтвердил, что CA находится в правильном месте (локальный компьютер - доверенный корневой центр сертификации), а сертификаты сервера / клиента также в нужном месте (локальный компьютер - личный).

Закрытые ключи можно экспортировать, и я подтвердил, что «Все» имеют разрешения на закрытые ключи (C: \ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys).

Работает через скрипач.


Ошибки, которые я получаю от SvcTraceViewer:

На стороне клиента: HTTP-запрос был запрещен с использованием схемы аутентификации клиента "Анонимный".

На стороне сервера - Требуется сертификат клиента. В запросе сертификат не найден.

Ошибка HTTP-трассировки: Попытка серверного приложения получить сертификат клиента завершилась неудачно со статусом: 0xC0000225.

Подобную проблему я обнаружил, но все же застрял: Приложению .NET не удается отправить сертификат клиента - Win 7 против Win XP?

Как заставить его работать в Windows 7?

Спасибо.


person programozo    schedule 06.12.2012    source источник


Ответы (1)


Я бы попробовал несколько вещей:

  1. Понятное имя сертификата должно совпадать с dns машины, на которой запущена служба. Если и сервер, и клиент работают на одном компьютере, используйте CN = localhost.

  2. По этой ссылке вы найдете подробную информацию о том, как создать и установить сертификаты.

  3. При самостоятельном хостинге вам необходимо вручную связать сертификат с портом. Используйте командную строку netsh. Проверьте это.

Надеюсь, эти шаги помогут ... Удачи

person Jaffi    schedule 15.01.2013