Необходима помощь для защиты моей службы WCF с помощью сертификата

Привет всем,

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

Ошибка сервера в приложении «/MyTestService».

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

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

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

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

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

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

person Saghar    schedule 18.08.2010    source источник


Ответы (1)


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

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

person Ladislav Mrnka    schedule 18.08.2010
comment
Есть ли какая-нибудь ссылка, где я могу прочитать об общедоступных и частных сертификатах или видеоуроке? - person Saghar; 18.08.2010
comment
Термины частные и публичные сертификаты, вероятно, неверны. Сертификат представляет собой стандартизированный контейнер для ключей и сопутствующей информации (например, об издателе, сроке действия, теме, серийном номере и т. д.). Сертификат, хранящийся на сервере, должен содержать секретный закрытый ключ и открытый ключ. Сертификат, предоставляемый клиентам, должен содержать только открытый ключ - Инфраструктура открытых ключей. - person Ladislav Mrnka; 18.08.2010