WCF и сертификат X509
От: Аноним  
Дата: 07.03.14 06:34
Оценка:
Добрый день коллеги.

Сидел разбирался с WCF потихоньку и решил попробовать защитить канал связи с помощью сертификатов.
Но как бы я не бился и не пытался,не выходит(

создал сертификат с помощью команды :

makecert -r -pe -n "CN=test.company" -b 01/01/2005 -e 01/01/2016 -sky exchange -ss my C:\test01\sert.cer

установил на сервере и на клиенте сертификат

app.config сервиса
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NewBinding0" sendTimeout="04:00:59" closeTimeout="04:00:59" openTimeout="04:00:59" receiveTimeout="04:00:59" >
          <security mode="Transport">
            <transport clientCredentialType="Certificate">              
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="bname" name="ConsoleApplication23.StockServ">
        <endpoint address=""  binding="netTcpBinding" bindingConfiguration="NewBinding0"
          contract="ConsoleApplication23.IStockServ" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://192.168.1.11:8989/StockServ" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="bname" >
          <serviceCredentials>
            <serviceCertificate findValue="test.company" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
          </serviceCredentials>
          <serviceMetadata httpGetEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>



app.config клиента
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IStockServ" receiveTimeout="04:00:59"  closeTimeout="04:00:59" sendTimeout="04:00:59" openTimeout="04:00:59">
                  <security>
                    <transport  clientCredentialType="Certificate"  />
                  </security>
                </binding>
              </netTcpBinding>
            </bindings>
            <behaviors>
              <endpointBehaviors>
                <behavior name="crypto" >             
                  <clientCredentials>
                    <serviceCertificate>                      
                      <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck" />
                    </serviceCertificate>
                    <clientCertificate findValue="test.company" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
                  </clientCredentials>
                </behavior>
              </endpointBehaviors>
            </behaviors>

            <client>
              <endpoint   address="net.tcp://192.168.1.11:8989/StockServ" binding="netTcpBinding"
                  bindingConfiguration="NetTcpBinding_IStockServ"  behaviorConfiguration="crypto" contract="ServiceReference1.IStockServ"
                  name="NetTcpBinding_IStockServ">
                <identity>
                  <dns value="test.company" />
                </identity>
              </endpoint>
            </client>

          </system.serviceModel>
</configuration>


у меня пару вопросов.
1) почему когда я dns value устанавливаю — dns имя компьютера где расположен сервис и было все хорошо, пока не ввел работу с сертификатом (требует чтобы я указал test.company)
2) почему не работает,конфиги правильны на первый взгляд,
на стороне сервиса в окно дебага пишет

Первый этап обработки исключения типа "System.IdentityModel.Tokens.SecurityTokenValidationException" в System.IdentityModel.dll
Первый этап обработки исключения типа "System.Security.Authentication.AuthenticationException" в System.dll
Первый этап обработки исключения типа "System.Security.Authentication.AuthenticationException" в System.dll
Первый этап обработки исключения типа "System.ServiceModel.Security.SecurityNegotiationException" в System.ServiceModel.dll
Первый этап обработки исключения типа "System.ServiceModel.Security.SecurityNegotiationException" в System.ServiceModel.dll
Поток '<Без имени>' (0x20d8) завершился с кодом 0 (0x0).
Поток '<Без имени>' (0x2130) завершился с кодом 0 (0x0).

а на стороне клиента — ошибка или таймаут локального сокета или ошибкой обработки сообщения
(таймаута нету,ошибка из-за ошибки на стороне сервиса)

может я что не правильно сделал ?

Большое спасибо за потраченное время и любую помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.