Как предоставить доступ к сертификатам X.509 для WCF
Чтобы сделать сертификат X.509 доступным для Windows Communication Foundation (WCF), в коде приложения необходимо указать имя хранилища сертификатов и его расположение. В некоторых случаях идентификатор процесса должен иметь доступ к файлу, который содержит закрытый ключ, связанный с сертификатом X.509. Чтобы получить закрытый ключ, связанный с сертификатом X.509 в хранилище сертификатов, WCF должен иметь соответствующее разрешение. По умолчанию доступ к закрытому ключу сертификата имеют только владелец и системная учетная запись.
Предоставление доступа к сертификатам X.509 для WCF
Предоставьте учетной записи, от имени которой выполняется WCF, доступ для чтения к файлу, содержащему закрытый ключ, который связан с сертификатом X.509.
Определите, требуется ли для WCF доступ для чтения к закрытому ключу для сертификата X.509.
В следующей таблице приводятся сведения о том, должен ли закрытый ключ быть доступным при использовании сертификата X.509.
Использование сертификата X.509 Закрытый ключ Цифровая подпись исходящего сообщения SOAP.
Да
Проверка подписи входящего сообщения SOAP.
Нет
Шифрование исходящего сообщения SOAP.
Нет
Расшифровка входящего сообщения SOAP.
Да
Определите расположение и имя хранилища сертификатов, в котором хранится сертификат.
Хранилище сертификатов, в котором хранится сертификат, задается в коде приложения или конфигурации. Например, в следующем примере задано, что сертификат расположен в хранилище сертификатов CurrentUser с именем My.
cc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com")
cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com");
Определите расположение на компьютере закрытого ключа для сертификата с помощью средства FindPrivateKey.
Для средства FindPrivateKey требуется имя и расположение хранилища сертификатов, а также любой объект, уникальным образом определяющий сертификат. Средство принимает имя субъекта сертификата или его отпечаток в качестве уникального идентификатора. Дополнительные сведения о том, как определить отпечаток для сертификата см. в разделе Как извлечь отпечаток сертификата.
В следующем примере кода средство FindPrivateKey используется для определения расположения закрытого ключа для сертификата в хранилище
My
пользователяCurrentUser
с отпечатком46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d
.findprivatekey.exe My CurrentUser -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a
Определите учетную запись, в которой выполняется WCF.
В следующей таблице описана учетная запись, в которой выполняется WCF для данного сценария.
Сценарий Идентификатор процесса Клиент (консоль или приложение WinForms).
Текущий пользователь.
Служба, являющаяся резидентной.
Текущий пользователь.
Служба, размещенная в IIS 6.0 (Windows Server 2003) или IIS 7.0 (Windows Vista).
NETWORK SERVICE
Служба, размещенная в IIS 5.X (Windows XP).
Управляется с помощью элемента <processModel> в файле Machine.config. По умолчанию используется учетная запись ASPNET.
С помощью соответствующего средства (например, cacls.exe) предоставьте учетной записи, в которой выполняется WCF, доступ для чтения к файлу, содержащему закрытый ключ.
В следующем примере кода изменяется (/E) список управления доступом (ACL) для заданного файла, чтобы предоставить (/G) учетной записи NETWORK SERVICE доступ для чтения (:R) к файлу.
cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R
См. также
Задачи
FindPrivateKey
Как извлечь отпечаток сертификата