Поделиться через


Практическое руководство. Предоставление доступа к сертификатам X.509 для WCF

Чтобы сделать сертификат X.509 доступным для Windows Communication Foundation (WCF), код приложения должен указать имя и расположение хранилища сертификатов. В некоторых случаях идентификатор процесса должен иметь доступ к файлу, который содержит закрытый ключ, связанный с сертификатом X.509. Чтобы получить закрытый ключ, связанный с сертификатом X.509 в хранилище сертификатов, WCF должен иметь разрешение на это. По умолчанию доступ к закрытому ключу сертификата имеют только владелец и системная учетная запись.

Предоставление доступа к сертификатам X.509 для WCF

  1. Укажите учетную запись, в которой WCF выполняет доступ на чтение к файлу, который содержит закрытый ключ, связанный с сертификатом X.509.

    1. Определите, требуется ли WCF доступ на чтение к закрытому ключу для сертификата X.509.

      В следующей таблице приводятся сведения о том, должен ли закрытый ключ быть доступным при использовании сертификата X.509.

      Использование сертификата X.509 Закрытый ключ
      Цифровая подпись исходящего сообщения SOAP. Да
      Проверка подписи входящего сообщения SOAP. No
      Шифрование исходящего сообщения SOAP. No
      Расшифровка входящего сообщения SOAP. Да
    2. Определите расположение и имя хранилища сертификатов, в котором хранится сертификат.

      Хранилище сертификатов, в котором хранится сертификат, задается в коде приложения или конфигурации. Например, в следующем примере задано, что сертификат расположен в хранилище сертификатов 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")
      
    3. Определите, где находится закрытый ключ сертификата на компьютере с помощью средства 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  
      
    4. Определите учетную запись, в которую выполняется WCF.

      В следующей таблице описана учетная запись, в которой wcF выполняется для данного сценария.

      Сценарий Идентификатор процесса
      Клиент (консоль или приложение WinForms). Текущий пользователь.
      Служба, являющаяся резидентной. Текущий пользователь.
      Служба, размещенная в IIS 6.0 (Windows Server 2003) или IIS 7.0 (Windows Vista). СЕТЕВАЯ СЛУЖБА
      Служба, размещенная в IIS 5.X (Windows XP). Управляется с помощью элемента <processModel> в файле Machine.config. По умолчанию используется учетная запись ASPNET.
    5. Предоставьте доступ на чтение к файлу, который содержит закрытый ключ для учетной записи, в которую выполняется WCF, с помощью такого средства, как icacls.exe.

      В следующем примере кода редактируется список управления доступом (DACL) для указанного файла, чтобы предоставить доступ к файлу для чтения учетной записи NETWORK SERVICE (:R).

      icacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /grant "NETWORK SERVICE":R  
      

См. также