2010-08-18 1 views
0

Hallo all,Помощь, необходимая для обеспечения моей службы WCF с использованием сертификата

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

Ошибка сервера в '/ MyTestService' Приложение.

Keyset не существует

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

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

........... .................................................. .......

Кажется, проблема с сертификатом. Может кто-нибудь объяснить, как обращаться с материалами сертификата и, пожалуйста, подробно. Просто подумайте, что я новичок в сертификатах.

<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> 

ответ

2

Установили ли вы разрешение на доступ к секретному ключу сертификата? Закрытые ключи защищены по умолчанию, поэтому доступ к ним возможен только администратору. Вы должны установить разрешение на чтение для учетной записи, на которой запущен AppPool вашей службы.

Редактировать: Чтобы установить разрешения, откройте MMC и добавьте оснастку для вашей локальной машины. Перейдите в Личный> Сертификаты> RPKey и из контекстного меню выберите Все задачи> Управление закрытыми ключами.

+0

Есть ли какая-либо ссылка, где я могу прочитать о государственных и частных сертификатах или видеоуроке? – Saghar

+0

Условия частных и открытых сертификатов, вероятно, неверны. Сертификатом является стандартизованный контейнер для ключей и связанных с ним сведений (например, эмитент, срок действия, предмет, серийный номер и т. Д.). Сертификат, хранящийся на сервере, должен содержать секретный закрытый ключ и открытый ключ. Сертификат, предоставленный клиентам, должен содержать только открытый ключ - Инфраструктура открытого ключа. –

+0

Ваше решение сработало для меня - чем вы. – Vlad