Безопасность на уровне сообщений с SSL в WCF

Я пытаюсь использовать WCF для разработки веб-службы через Интернет. Требование состоит в том, что мы должны предоставить TLS (безопасность транспортного уровня) и MLS (безопасность уровня сообщений). Для этой цели мы используем «ws2007HttpBinding» с режимом безопасности как «TransportWithMessageCredential». Здесь я обнаружил, что запрос передается через SSL, но при использовании Fiddler (для https) я обнаружил, что тело мыла имеет открытый текстовый формат.

Для безопасности на транспортном уровне я использовал ClientCredentialType как «None», а для безопасности на уровне сообщений я использовал «Certificate» как ClientCredentialType.

Я использую .NET framework 3.5.

К вашему сведению, я использую другой сертификат для SSL и сервера.

Мой Web.config для сервера выглядит следующим образом.

<system.serviceModel>
    <services>
        <service behaviorConfiguration="API_WCF.Service1Behavior" name="API_WCF.API">
            <endpoint address="https://localhost/API_WCF/API.svc" name="API" binding="ws2007HttpBinding" bindingConfiguration="customWsHttpBinding" contract="API_WCF.IARDAPI">
                <identity>
                    <dns />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <bindings>
        <ws2007HttpBinding>
            <binding name="customWsHttpBinding">
      <!-- For http  -->
      <!--
      <security mode="Message">
        <message clientCredentialType="Certificate" negotiateServiceCredential="false" establishSecurityContext="false"/>
      </security>
      -->
      <!-- For https  -->
        <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None"/>
                    <message clientCredentialType="Certificate" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </ws2007HttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="API_WCF.Service1Behavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://localhost/API_WCF/API.svc/API"/>
                <serviceCredentials>
                    <serviceCertificate findValue="CN=WSE2QuickStartServer" storeLocation="LocalMachine" x509FindType="FindBySubjectDistinguishedName" storeName="My"/>
                    <clientCertificate>
                        <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>
                    </clientCertificate>
                </serviceCredentials>

                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>

            </behavior>
        </serviceBehaviors>
    </behaviors>
    <diagnostics wmiProviderEnabled="true" performanceCounters="ServiceOnly">
        <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000"/>
    </diagnostics>
</system.serviceModel>

Пожалуйста, расскажите, как достичь безопасности на уровне сообщений с помощью безопасности транспортного уровня в WCF через Интернет.


person Bhavin Shah    schedule 12.04.2013    source источник


Ответы (2)


Если вам нужно запустить скрипач в режиме HTTPS для просмотра ваших сообщений WCF, значит, вы уже используете TLS!

Если сообщения зашифрованы при использовании скрипта в режиме HTTP, это означает, что ваши сообщения защищены перед отправкой по сети. См .: Как использовать безопасность транспорта и учетные данные сообщений

Использование TransportWithMessageCredential означает, что в сценарии HTTP ваша служба будет защищена через HTTPS, и вы можете выбрать дополнительные учетные данные для сообщений (MLS).

person Brad    schedule 15.04.2013

Если вы хотите использовать SSL и шифрование на уровне сообщений (а не только аутентификацию на уровне сообщений), вам необходимо использовать настраиваемую привязку. Например (фактическая конфигурация зависит от того, что вы хотите):

<textMessageEncoding messageVersion="Soap11" />
<security authenticationMode="MutualCertificate" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"></security>
<httpsTransport />
person Yaron Naveh    schedule 15.04.2013
comment
Когда я пытаюсь использовать предложенное выше решение, я получаю следующую ошибку. System.InvalidOperationException: сбой экспорта политики безопасности. Привязка содержит как элемент привязки SymmetricSecurityBindingElement, так и элемент привязки безопасного транспорта. Экспорт политики для такой привязки не поддерживается. - person Bhavin Shah; 15.04.2013
comment
пожалуйста, сначала создайте привязку только с безопасностью сообщений (без ssl), которая соответствует вашим потребностям. Затем опубликуйте его, и мы увидим, как добавить к нему ssl. - person Yaron Naveh; 15.04.2013
comment
также, если вы получите другое исключение, укажите, когда вы его получите (при добавлении ссылки wsdl, создании прокси, получении ответа и т. д.) - person Yaron Naveh; 15.04.2013
comment
Я могу создать привязку только с безопасностью сообщений, теперь вы можете посоветовать мне, как настроить ее на SSL? - person Bhavin Shah; 15.04.2013
comment
если вы просто перейдете на https, на каком этапе вы получите исключение - person Yaron Naveh; 15.04.2013
comment
Когда я пытаюсь просмотреть веб-службу (svc) и получить доступ к файлу wsdl. в это время я получаю сообщение об ошибке экспорта политики. - person Bhavin Shah; 16.04.2013
comment
Не уверен, почему wcf выдает эту ошибку. В любом случае в сообщении об ошибке говорится, что он не может сгенерировать WSDL для этого режима двойной защиты, но не говорится, что этот режим защиты не поддерживается. Я предлагаю вам удалить настройку SSL, затем сгенерировать клиента с добавлением ссылки на службу, а затем отдельно настроить клиент и сервер для использования httpsTransport. Таким образом вы обойдете часть генерации wsdl (возможно, даже потребуется удалить конечную точку mex и запретить серверу генерировать метаданные) - person Yaron Naveh; 16.04.2013
comment
Привет, Ярон, спасибо за ваше предложение. он работает для этой проблемы, но у меня есть определенные вопросы по этому подходу. 1) Когда наш веб-сервис будет использоваться несколькими клиентами, особенно клиенты могут присоединиться к сервису, когда им нужен какой-то сценарий. Как можно поделиться с ними WSDL? (в случае, если метаданные недоступны) 2) мы протестировали веб-сервис для .net 3.5, 4.0 и 4.5 framework, но обнаружили, что исключение экспорта политики безопасности не появляется в случае .net 4.0 и 4.5. Он поставляется с .net 3.5 (к сожалению, я должен использовать только это). Тогда любая идея об исправлении этой проблемы в .net 3.5. - person Bhavin Shah; 16.04.2013
comment
Кроме того, 3) как вы упомянули в своем решении, messageVersion упоминается как Soap11, что означает, что версия soap 1.1 будет поддерживаться веб-службой, но также как включить ее для soap 1.1 и soap 1.2. Заранее спасибо. - person Bhavin Shah; 16.04.2013
comment
вы можете создать несколько конечных точек для этой службы: одну с soap11, а другую с soap12. Если вам нужен WSDL, вы можете использовать жестко запрограммированный WSDL. Вы даже можете удалить политику из WSDL, которую вы получили, пропустив https, и опубликовать ее. - person Yaron Naveh; 16.04.2013