Проблема в размещении службы WCF с использованием wsHttpBinding в IIS - PullRequest
2 голосов
/ 27 июля 2010

Я пытаюсь разместить свой сервис, используя следующую конфигурацию.

<system.serviceModel>
    <services>
        <service name="Test.MyService" behaviorConfiguration="MyServiceBehavior">
            <!--         Service Endpoints -->
            <endpoint address="MyTestService" binding="wsHttpBinding" bindingConfiguration="WebserviceHttpBinding" contract="Test.IMyService"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="WebserviceHttpBinding">
                <security mode="Message">
                    <message clientCredentialType="UserName" negotiateServiceCredential="false"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyServiceBehavior">
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Test.CredentialValidator, Test"/>
                    <serviceCertificate findValue="RPKey" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
                </serviceCredentials>
                <!--           To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!--           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>
</system.serviceModel>

Когда я отлаживаю этот сервис, у меня нет проблем. Я размещал этот сервис в IIS, используя веб-сайт. Когда я просматриваю эту услугу из IIS, я получаю следующее исключение.

Ошибка сервера в «/ MyTestService» Применение.

Набор ключей не существует

Описание: необработанное исключение произошло во время исполнения текущий веб-запрос. Пожалуйста, просмотрите трассировка стека для получения дополнительной информации о ошибка и откуда она возникла код.

Сведения об исключении: System.Security.Cryptography.CryptographicException: Набор ключей не существует

Ошибка источника:

Создано необработанное исключение во время исполнения текущего веб-запрос. Информация относительно Происхождение и место исключения можно определить с помощью исключения трассировка стека ниже.

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

[CryptographicException: набор ключей не существует ] System.Security.Cryptography.Utils.CreateProvHandle (параметры CspParameters, логический randomKeyContainer) +369 System.Security.Cryptography.Utils.GetKeyPairHelper (параметры CspAlgorithmType keyType, параметры CspParameters, логический randomKeyContainer, Int32 dwKeySize, SafeProvHandle & safeProvHandle, SafeKeyHandle & safeKeyHandle) +151 System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair () +85 System.Security.Cryptography.RSACryptoServiceProvider..ctor (параметры Int32 dwKeySize, CspParameters, логическое значение useDefaultKeySize) +280 System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey () +468 System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange (сертификат X509Certificate2) + 85

[ArgumentException: сертификат 'CN = RPKey' должен иметь закрытый ключ, способный к обмену ключами. Процесс должен иметь права доступа к закрытому ключу.] System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange (сертификат X509Certificate2) +15832031 System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider () +45 System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider (RecipientServiceModelSecurityTokenRequirement receiveientRequirement) +73 System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider (требование SecurityTokenRequirement) +65 System.ServiceModel.Security.SessionRenewSecurityTokenManager.CreateSecurityTokenProvider (требование SecurityTokenRequirement) +14 System.ServiceModel.Security.SymmetricSecurityProtocolFactory.OnOpen (время ожидания TimeSpan) +15334232 System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (время ожидания TimeSpan) +23 System.ServiceModel.Channels.CommunicationObject.Open (время ожидания TimeSpan) +563 System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open (TimeSpan timeout) +101 System.ServiceModel.Channels.SecurityChannelListener 1.OnOpen(TimeSpan timeout) +203 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +563 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +87 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +563 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +110 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +563 System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen(TimeSpan timeout) +149 System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) +23 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +563 System.ServiceModel.Security.SecurityUtils.OpenCommunicationObject(ICommunicationObject obj, TimeSpan timeout) +24 System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen(TimeSpan timeout) +878 System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) +23 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +563 System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout) +153 System.ServiceModel.Channels.SecurityChannelListener 1.OnOpen (тайм-аут тайм-аута) +203 System.ServiceModel.Channels.CommunicationObject.Open (время ожидания TimeSpan) +563 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (время ожидания TimeSpan) +87 System.ServiceModel.Channels.CommunicationObject.Open (время ожидания TimeSpan) +563 System.ServiceModel.ServiceHostBase.OnOpen (время ожидания TimeSpan) +110 System.ServiceModel.Channels.CommunicationObject.Open (время ожидания TimeSpan) +563 System.ServiceModel.HostingManager.ActivateService (String normalizedVirtualPath) +135 System.ServiceModel.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath) + 654

[ServiceActivationException: служба '/AtlasServices/Service.svc' не может быть активирована из-за исключения во время компиляции. Сообщение об исключении: Сертификат 'CN = RPKey' должен иметь закрытый ключ, способный к обмену ключами. Процесс должен иметь права доступа к закрытому ключу ..]System.ServiceModel.AsyncResult.End (результат IAsyncResult) +15700960 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End (результат IAsyncResult) +15623609 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous (контекст HttpApplication, логический flowContext) +265 System.ServiceModel.Activation.HttpModule.ProcessRequest (Отправитель объекта, EventArgs e) +227 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +80 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно) + 171

Ответы [ 4 ]

4 голосов
/ 27 июля 2010

Это вероятно, потому что в IIS настройки учетной записи отличаются от учетной записи, которую вы используете для запуска локального сервера.

вы работаете с сертификатом X.509? Если да, уверены ли вы, что предоставили права доступа на чтение учетной записи, на которой выполняется процесс (на которой запущен IIS) для файла, содержащего закрытый ключ?

Итак, если IIS работает под учетной записью Saghar, прочитал ли Saghar права доступа к файлу ключа?

@ обновление

ArgumentException: сертификат 'CN = RPKey' должен иметь закрытый ключ, способный к обмену ключами. Процесс должен иметь права доступа к закрытому ключу.

это говорит о том, что ваша учетная запись IIS не имеет разрешений на ваш закрытый ключ

1 голос
/ 02 ноября 2010

Удостоверение пула приложений IIS не имеет доступа к сертификату

  1. Установить идентификатор пула приложений на NETWORK SERVICE
  2. установка rktools
  3. запустите "c: \ Program Files (x86) \ Windows Resource Kits \ Tools \ winhttpcertcfg.exe" -g -c LOCAL_MACHINE \ My -s WSE2QuickStartServer -a "СЕТЬ СЕРВИС"
1 голос
/ 28 июля 2010

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

В первом случае очень легко разобраться, если сертификат x.509 был экспортирован не в формате .pfx, а в качестве .cer.Для обмена сертификатами, которые содержат закрытый ключ, недостаточно формата .cer, поскольку он может содержать только сертификат открытого ключа в кодировке DER x.509.Вы должны экспортировать свой сертификат с сервера сертификатов (или из хранилища, имеющего оба ключа) в виде файла .pfx, и убедитесь, что вы включили закрытый ключ.

Если это последний случай, то вам нужночтобы убедиться, что учетная запись пула приложений, под которой работает ваша служба в IIS, имеет разрешение на доступ к хранилищу сертификатов, в котором находятся ключи.Эта статья может быть полезна: Сделать сертификаты X.509 доступными для WCF

0 голосов
/ 27 июля 2010

Если вам не требуется wshttpbinding, просто попробуйте перейти на basichttpbinding, и ваша проблема, вероятно, исчезнет.

В прошлом у нас были проблемы с этим, когда клиент подключался с сайта за пределами нашей сети.Поскольку соединение было установлено через vpn, у нас была возможность отказаться от безопасности для привязки.

...