WCF не работает на IIS. Система не может найти указанный файл - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь создать веб-сервис с защитой сообщений.

Вот конфиг:

  <system.serviceModel>
    <services>
      <service name="WCFMessage.Service1" behaviorConfiguration="behaviour1">
        <endpoint address="" contract="WCFMessage.IService1" binding="wsHttpBinding" bindingConfiguration="binding1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviour1">
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceMetadata  httpGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="MyCert"
                                x509FindType="FindBySubjectName"
                                storeLocation="LocalMachine"
                                storeName="My"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>

    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="binding1">
          <security mode="Message">
            <message  clientCredentialType="None" negotiateServiceCredential="false"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

хорошо работает на localhost, но на IIS выдает ошибку:

Система не может найти файл указано.

Трассировка стека:

Вполне вероятно, что сертификат 'CN = MyCert' может не иметь закрытого ключа который способен к обмену ключами или тому процесс может не иметь прав доступа для закрытый ключ.

Я пробовал этот метод, но ошибка все еще возникает.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 21 января 2012

У меня была похожая ситуация в последние несколько дней. Я нашел обходной путь, который был приемлем для меня, поэтому я поделюсь им с вами. Проблема заключается в том, что учетная запись пользователя пула приложений IIS не имеет доступа к файлу закрытого ключа сертификата службы или не имеет закрытого ключа в том месте, где его вообще ожидают!

Примечание. Я предполагаю, что у вас работает собственный центр сертификации.

Чтобы обойти эту проблему, выполните следующие действия:

  1. Создайте новую учетную запись пользователя, которую вы собираетесь использовать для пула приложений IIS.
  2. Вы можете создать новый пул приложений для использования с этим идентификатором пользователя или назначить этот новый идентификатор пользователя для DefaultAppPool или любого пула приложений, используемого вашей службой (выполните это в диспетчере IIS).
  3. Затем откройте IE, перейдите к http://yourserver/certsrv, чтобы запросить новый сертификат проверки подлинности сервера. Используйте тот же CN («MyCert») в вашем запросе.
  4. Открыть центр сертификации для выдачи запрошенного сертификата.
  5. Снова перейдите на http://yourserver/certsrv, нажмите «Просмотреть статус ожидающего запроса сертификата», затем установите сертификат.
  6. Теперь вам нужно внести изменения в ваш раздел «serviceCertificate» web.config таким образом, чтобы он выглядел так:

      <serviceCredentials>   
        <serviceCertificate findValue="MyCert"   
                            x509FindType="FindBySubjectName"   
                            storeLocation="CurrentUser"   
                            storeName="My"/>   
      </serviceCredentials> 
    
  7. Сохраните, пересоберите сервис и протестируйте его, он должен работать нормально.

(было бы проще, если бы это можно было сделать с помощью функции сертификата экспорта / импорта MMC, но по некоторым причинам его поведение не такое, как мы ожидаем)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...