Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не удалось открыть безопасный канал, проблемы с WCF 
:(
    Опции темы
undelete
Дата 20.6.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2011

Репутация: нет
Всего: нет



Здравствуйте! 
Проблема такая, создал WCF сервис и клиент под него. Тестирую локально - все прекрасно работает. Публикую сервис на хостинг (uh.ua) , и при вызове метода выдает исключение:
"Необработанное исключение типа "System.ServiceModel.Security.SecurityNegotiationException" произошло в mscorlib.dll

Дополнительные сведения: Не удалось открыть безопасный канал, так как произошла ошибка при согласовании безопасности с удаленной стороной. Возможно, это связано с отсутствием или неправильным указанием EndpointIdentity в EndpointAddress, использованном для создания канала. Убедитесь, что EndpointIdentity, указанный или подразумеваемый в EndpointAddress, правильно идентифицирует удаленную сторону. 
"
Конфиг клиента:

Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="None" negotiateServiceCredential="true"
                            algorithmSuite="Default" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address=""
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                contract="ServiceReference1.IService1" name="WSHttpBinding_IService1">
                <identity>
                    <userPrincipalName value="WVS2\uh190117" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>



Конфиг сервиса:

Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- Во время развертывания проекта библиотеки служб содержимое файла конфигурации необходимо добавить к файлу 
  app.config на узле. Файлы конфигурации для библиотек не поддерживаются System.Configuration. -->
  <system.serviceModel>
    <client>
      <endpoint address=""
        binding="wsHttpBinding" bindingConfiguration="NewBindingTest"
        contract="WcfGetRadiostation.IService1" name="WSHttpBinding_IService1" />
    </client>
    <bindings>
      <wsHttpBinding>
        <binding name="NewBindingTest" maxBufferPoolSize="524288">
          <security>
            <transport clientCredentialType="None" />
            <message clientCredentialType="None" negotiateServiceCredential="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WcfGetRadiostation.Service1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfGetRadiostation/Service1/"   />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Если адрес не задан полностью, он является относительным к вышеуказанному базовому адресу -->
        <endpoint address=""  binding="wsHttpBinding" contract="WcfGetRadiostation.IService1">
          <!-- 
              После развертывания необходимо удалить или заменить указанный ниже элемент удостоверения, чтобы отображалось
              удостоверение, под которым выполняется развернутая служба. В случае удаления служба WCF автоматически определит соответствующее 
              удостоверение.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- Служба использует конечную точку Metadata Exchange для предоставления своего описания клиентам. --> 
        <!-- Эта конечная точка не использует безопасную привязку и должна быть защищена или удалена перед развертыванием -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Чтобы избежать разглашения сведений о метаданных, 
          установите ниже значение FALSE и удалите вышеуказанную конечную точку метаданных перед развертыванием -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- Чтобы получить сведения об исключениях в ошибках для отладки, 
          установите ниже значение TRUE. Перед развертыванием установите значение FALSE, 
           чтобы избежать разглашения сведений об исключении -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>



Помогите разобраться плиз!
 А то скину ядерную боеголовку на центральный офис мелкософта =)))


Это сообщение отредактировал(а) undelete - 20.6.2011, 19:34
PM MAIL   Вверх
Plamenk
Дата 5.7.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



В клиенте не указан адрес конечной точки:

Цитата

endpoint address=""


Пример настроенного конфига на сервер:

Код

  <system.serviceModel>
    <bindings>
        <wsHttpBinding>
        <binding name="ServerWS" sendTimeout="00:10:00" maxBufferPoolSize="1048576" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </wsHttpBinding>
    </bindings>
      <behaviors>
      <serviceBehaviors>
        <behavior name="ServerWS">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="ServerWS.ServerWS" behaviorConfiguration="ServerWS">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/ServerWS"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="ServerWS" contract="ServerWS.IServerWS" />
      </service>
    </services>
  </system.serviceModel>


Для клиента мона сгенерить через студию.

PM MAIL   Вверх
jonie
Дата 6.7.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Plamenk, ну и что что не указан? Если у вас IIS то она вообще плевать хотела на это указание.
Проблема тут как раз с идентификацией - для начала я бы включил трассировку wcf ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Plamenk
Дата 7.7.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Я говорил про конфиг клиента.
PM MAIL   Вверх
jonie
Дата 7.7.2011, 23:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Plamenk, ну и ничего в вашем примере работать не будет, т.к. вы используете WSHttpBinding который по умолчанию шифрует сообщения используя идентификацию на основе виндофс пользователей. ..... собственно в этом надо думать и есть проблема....

я могу, конечно, описать что да как надо делать в общем случае (применительно к этому биндингу)... если это кому-то надо... Там есть свои заморочки, в частности настройка http.sys драйвера (если вы делаете selfhosted сервис и хотите ssl шифрование канала)

Это сообщение отредактировал(а) jonie - 7.7.2011, 23:24


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Fitc
Дата 8.7.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.1.2010

Репутация: 1
Всего: 4



Цитата(jonie @ 7.7.2011,  23:22)
я могу, конечно, описать что да как надо делать в общем случае (применительно к этому биндингу)... если это кому-то надо... Там есть свои заморочки, в частности настройка http.sys драйвера (если вы делаете selfhosted сервис и хотите ssl шифрование канала)

Опиши пожалуйста!
PM MAIL   Вверх
jonie
Дата 8.7.2011, 10:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



0. Понимать что такое шифрование
1. Просмотреть доклады про безопасность WCF от Натальи Уфимцевой на techdays.ru


Итак, по-порядку.
Вы хотите защитить передаваемые данные от  модификации и\или прочтения? Наиболее стандартным мне кажется способом является использование SSL для шифрования всего потока - взгляните сами - везде в интренрент https используют. Способ позволяет шифровать весь канал, удостоверяясь в источнике и получателе сообщений.

Этот способ я и опишу как наиболее часто используемый.

Для начала нам надо создать сертификат, это можно сделать следующим спосбом:
Цитата

makecert -r -pe -n "CN=localhost" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

Это самоподписанный сертификат. Который будет установлен сразу в хранилище компьютера (а не пользователя).
Вы можете на него посмотреть сделав - пуск-выполнить-mmc.exe - добавить оснастку сертификаты - текущего компьютера.

Теперь  у нас есть сертификат который нам надо использовать на сервере. Вот полный конф сервера:
Код

<?xml version="1.0"?>
<configuration>
 
  <system.web>
    <compilation debug="true"/>
  </system.web>

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="SecuredBehavior" name="MYAPP.DataService.DataService">
        <endpoint address="" binding="netTcpContextBinding" bindingConfiguration="TransportSecurity" contract="MYAPP.DataService.IDataService"/>
        <endpoint address="" binding="mexHttpsBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8738/MYAPP.DataService/"/>
            <add baseAddress="https://localhost:8739/MYAPP.DataService/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

    <bindings>
      <netTcpContextBinding>
        <binding name="TransportSecurity" contextManagementEnabled="true">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="None"/>
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </netTcpContextBinding>
     
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="SecuredBehavior">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
            </clientCertificate>
            <serviceCertificate findValue="843351ee6b858bd792cf13ce7c61e1cf1b7a020d" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

</configuration>

я тут использую net.tcp, но роли это не играет.
Теперь важное замечание: IIS будет плевать на baseAddress-ы ну и на сертификатов путь - т.к.  у него всё свое имеется.
IIS: надо опубликовать сайт и навесить ему в свойствах наш сертификат - собственно это будет "пол конфига")..
Self-Hosted: конфиг полный выше - там есть поиск сертификата по "отпечатку" в хранилище LocalMachine\My (отпечаток посмотрите в оснастке управления).

Думали всё ? Да хрен там...
Начинаются пляски с бубном.

WCF вообще говоря не умеет SSL нормально поддерживать - это он возлагает на драйвер http.sys. Его надо настроить. В случае IIS настраивать не надо - т.к. за нас это делает iis. На разных версиях винды надо выполнить одну из коммнд:
Код

C:\Program Files\Support Tools>httpcfg set ssl -i 0.0.0.0:8739 -h 843351ee6b858bd792cf13ce7c61e1cf1b7a020d

-or-

C:\Windows\system32>netsh http add sslcert ipport=0.0.0.0:8739 certhash=843351ee6b858bd792cf13ce7c61e1cf1b7a020d appid={00112233-4455-6677-8899-AABBCCDDEEFF}

Это сделает биндинг ssl на указанный порт используя указанный сертификат.

Но и это еще не всё. Теперь надо побороть файрвол встроенный. Как-то так:
Код

C:\Windows\system32>netsh http add urlacl url=https://+:8739/EFTR.DataService/user=CompName\UserName

- or -

C:\Program Files\Support Tools>httpcfg.exe set urlacl /u http://myhost:8739/ /a "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)"

(see http://msdn.microsoft.com/en-us/library/ms733768.aspx)

где параметры вписать для юзера под кем запускается этот self-hosted сервис.

Эти все операции производить, конечно, для двух портов (у нас mex точка вынесена по https).


Далее можно запуститься и проверить в браузере что там выдает MEX по адресу в конфиге. Ну и wcftestclient. В случае ошибок ковырять логи, которые надо включить:
Код

 <configuration>
.........old stuff.......

     <system.diagnostics>
      <sources>
            <source name="System.ServiceModel" 
                    switchValue="All"
                    propagateActivity="true">
            <listeners>
               <add name="traceListener" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "Traces.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
   
 
</configuration>


лог можно просмотреть утилитой svctraceviewer.

Далее конфиг клиента очень простой:
Код

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpContextBinding>
        <binding name="NetTcpContextBinding_IDataService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="6553600" maxConnections="10" maxReceivedMessageSize="6553600" contextProtectionLevel="Sign">
          <readerQuotas maxDepth="32" maxStringContentLength="81920" maxArrayLength="163840" maxBytesPerRead="4096" maxNameTableCharCount="163840" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="None" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </netTcpContextBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:8738/MYAPP.DataService/" binding="netTcpContextBinding" bindingConfiguration="NetTcpContextBinding_IDataService" contract="ServiceProxy.IDataService" name="NetTcpContextBinding_IDataService" behaviorConfiguration="IgnoreSSLErrors">
        <identity>
          <dns value="адрес_машины_где_стоит_сервер (мы его указывали при создании сертификата) (только для тестирования надо!)" />
        </identity>
      </endpoint>
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="IgnoreSSLErrors">
          <clientCredentials>
            <serviceCertificate>
              <!-- Set certificateValidationMode to None to don't check if the server certificate is trusted, so you can use self signed certificate.
                  WARNING: Remember to set this property to ChainTrust or PeerOrChainTrust when using a certificate generated from a trusted authority -->
              <authentication certificateValidationMode="None" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  
</configuration>


собственно всё....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.