помогите настроить службу wsHttpBinding WCF в .net - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь разместить службу WCF с помощью wsHttpBinding. Я создал сертификат с помощью makecert и поместил несколько строк в web.config.

Это ошибка, которую я получаю:

System.ArgumentException: The certificate 'CN=WCfServer' must have a private key that is capable of key exchange. The process must have access rights for the private key.

При поиске в Google, похоже, возникает проблема с правами доступа к файлу сертификата. Я использовал cacls, чтобы дать разрешение на чтение NETWORK SERVICE, а также свое имя пользователя, но это ничего не изменило.

Я также зашел в настройки безопасности в свойствах файла сертификата и дал полный контроль над NETWORK SERVICE и моим именем пользователя. Снова безрезультатно.

Можете ли вы подсказать мне, в чем проблема и что именно мне нужно сделать? Я действительно не в восторге от этих сертификатов.

Вот мой web.config:

<system.serviceModel>

<services>
        <service name="Abc.Service" behaviorConfiguration="Abc.ServiceBehavior">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Abc.BindConfig" contract="Abc.IService">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>

<behaviors>
    <serviceBehaviors>
        <behavior name="Abc.ServiceBehavior">
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>

            <serviceCredentials>
                <clientCertificate>
                  <authentication certificateValidationMode="PeerTrust"/>
                </clientCertificate>
                <serviceCertificate findValue="WCfServer" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
            </serviceCredentials>

        </behavior>
    </serviceBehaviors>
</behaviors>

<bindings>
  <wsHttpBinding>
    <binding name="Abc.BindConfig">
      <security mode="Message">
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

</system.serviceModel>

Ответы [ 3 ]

3 голосов
/ 03 мая 2010

Из того, что я мог собрать из Интернета, кажется, что это НЕ вопрос разрешений, скорее, что-то не так с настройкой сертификата.

Здесь есть инструкции о том, как разрешить доступ к закрытому ключу.

У вас установлен и работает IIS7. Существует очень простой инструмент для создания сертификатов (вместо makecert), который я успешно использовал для связи WCF.

2 голосов
/ 04 мая 2010

Хорошо .. Я понял, в чем проблема. При использовании makecert для создания сертификата должна использоваться опция -pe, которая делает сгенерированный приватный объект экспортируемым, чтобы его можно было использовать в сертификате. Проблема заключалась в том, что makecert в комплекте с vs2008 является версией 5.131, в которой нет опции -pe. Я нашел версию 6.0 в Microsoft SDK 6, которая имеет опцию.

Это самая большая проблема, которую я нахожу как новичок в .net. Существует так много несовместимых версий одной и той же вещи, и когда вы просматриваете что-то в Интернете, вы не знаете, о какой версии кто-то говорит.

1 голос
/ 03 мая 2010

Посмотрите на Средство настройки сертификата служб Windows HTTP (WinHttpCertCfg.exe) . Это позволяет предоставить доступ к закрытому ключу сертификата X.509 учетной записи Windows.

Вот сообщение в блоге , в котором объясняется, как использовать инструмент.

...