SSL-сертификаты SSL-клиента <FTPClientCertificates>

Общие сведения

Элемент <sslClientCertificates> задает параметры ssl-сертификата клиента для сайтов FTP. В частности, этот элемент содержит следующие атрибуты, которые подробно рассматриваются в разделе конфигурации этого раздела:

  • Атрибут clientCertificatePolicy указывает, будут ли сертификаты клиента разрешены, обязательны или игнорируются.
  • Атрибут validationFlags указывает поведение ftp-сайта для проверки отзыва сертификата.
  • Атрибут revocationFreshnessTime указывает время, в течение которого список отзыва является допустимым.
  • Атрибут revocationUrlRetrievalTimeout задает время ожидания для получения сведений об отзыве сертификата.
  • Атрибут useActiveDirectoryMapping указывает, должно ли быть разрешено сопоставление Active Directory для сертификатов клиента. Примечание. Этот атрибут используется в сочетании с элементом <clientCertAuthentication> для настройки сопоставления сертификатов с помощью Active Directory.

Совместимость

Версия Примечания
IIS 10.0 Элемент <sslClientCertificates> не был изменен в IIS 10.0.
IIS 8,5 Элемент <sslClientCertificates> не был изменен в IIS 8.5.
IIS 8,0 Элемент <sslClientCertificates> не был изменен в IIS 8.0.
IIS 7,5 Элемент <sslClientCertificates> элемента поставляется <security> как компонент IIS 7.5.
IIS 7.0 Элемент <sslClientCertificates> элемента появился <security> в FTP 7.0, который был отдельной загрузкой для IIS 7.0.
IIS 6,0 Элемент <ftpServer> и его дочерние элементы заменяют параметры FTP IIS 6.0, расположенные в пути метабазы LM/MSFTPSVC .

Примечание

Службы FTP 7.0 и FTP 7.5 поставляются внеполосно для IIS 7.0, что требует скачивания и установки модулей по следующему URL-адресу:

https://www.iis.net/expand/FTP

В Windows 7 и Windows Server 2008 R2 служба FTP 7.5 поставляется в качестве функции для IIS 7.5, поэтому скачивание службы FTP больше не требуется.

Настройка

Чтобы обеспечить поддержку публикации FTP для веб-сервера, необходимо установить службу FTP. Для этого выполните следующие действия.

Windows Server 2012 или Windows Server 2012 R2

  1. На панели задач щелкните Диспетчер сервера.

  2. В диспетчер сервера откройте меню Управление и выберите пункт Добавить роли и компоненты.

  3. В мастере добавления ролей и компонентов нажмите кнопку Далее. Выберите тип установки и нажмите кнопку Далее. Выберите целевой сервер и нажмите кнопку Далее.

  4. На странице Роли сервера разверните узел Веб-сервер (IIS) и выберите FTP-сервер.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Помимо службы FTP необходимо выбрать расширяемость FTP.
    Снимок экрана: область i IS веб-сервера, развернутая с выбранной расширяемостью F T P. .

  5. Нажмите кнопку Далее, а затем на странице Выбор компонентов нажмите кнопку Далее еще раз.

  6. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.

  7. На странице Результаты нажмите кнопку Закрыть.

Windows 8 или Windows 8.1

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

  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.

  3. Разверните узел Службы IIS, а затем выберите FTP-сервер.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Изображение служб IIS и сервера F T P, развернутых с выбранной расширяемостью F T P.

  4. Нажмите кнопку ОК.

  5. Щелкните Закрыть.

Windows Server 2008 R2

  1. На панели задач нажмите кнопку Пуск, выберите Администрирование, а затем диспетчер сервера.

  2. В области иерархии диспетчер сервера разверните узел Роли и выберите Веб-сервер (IIS).

  3. На панели Веб-сервер (IIS) прокрутите страницу до раздела Службы ролей и щелкните Добавить службы ролей.

  4. На странице Выбор служб ролеймастера добавления служб ролей разверните узел FTP-сервер.

  5. Выберите Служба FTP.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Снимок экрана: страница

  6. Щелкните Далее.

  7. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.

  8. На странице Результаты нажмите кнопку Закрыть.

Windows 7

  1. На панели задач нажмите кнопку Пуск, а затем панель управления.

  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.

  3. Разверните узел Службы IIS, а затем FTP-сервер.

  4. Выберите Служба FTP.

    Примечание

    Для поддержки ASP. Проверка подлинности членства или проверка подлинности диспетчера IIS для службы FTP. Также необходимо выбрать расширяемость FTP.
    Изображение служб IIS и развернутой области сервера F T P с выбранным параметром Расширяемость F T P.

  5. Нажмите кнопку ОК.

Windows Server 2008 или Windows Vista

  1. Скачайте пакет установки по следующему URL-адресу:

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

Инструкции

В настоящее время отсутствует пользовательский интерфейс, позволяющий настроить параметры проверки подлинности сертификата клиента для FTP-сайта. Дополнительные сведения о настройке параметров проверки подлинности сертификата клиента на ftp-сайте см. в разделах Конфигурация и Пример кода этого документа.

Конфигурация

Элемент <sslClientCertificates> настраивается на уровне сайта.

Атрибуты

Атрибут Описание
clientCertificatePolicy Необязательный атрибут перечисления.

Задает политику сертификатов клиента.
Значение Описание
CertIgnore Указывает, что сертификаты клиента не будут согласовываться для сеанса SSL.

Числовое значение равно 0.
CertAllow Указывает, что сертификаты клиента будут разрешены. Если клиент решает отправить сертификат, сертификат должен быть действительным, а сервер должен иметь возможность успешно проверить его.

Числовое значение равно 1.
CertRequire Указывает, что потребуются сертификаты клиента. Ftp-клиентам будет запрещено подключаться, если они не отправят действительный сертификат клиента на сервер.

Числовое значение равно 2.
Значение по умолчанию — CertIgnore.
validationFlags Необязательный атрибут flags.

Указывает флаги, влияющие на проверку сертификата клиента.
Значение Описание
NoRevocationCheck

Указывает, что проверки отзыва сертификата будут пропущены.

Предупреждение. Не рекомендуется пропускать проверку отзыва.

Числовое значение равно 1.

CertChainRevocationCheckCacheOnly Указывает, что проверка отзыва обращается только к кэшируемым URL-адресам.

Числовое значение равно 2.
CertChainCacheOnlyUrlRetrieval Указывает только кэшированные URL-адреса при построении цепочки сертификатов. В Интернете и интрасети не выполняется поиск объектов на основе URL-адресов.

Числовое значение равно 4.
CertNoUsageCheck Не проверка сертификат клиента для флагов использования. Проверка использования включена по умолчанию и предназначена для того, чтобы гарантировать, что разрешены только сертификаты клиента, которые разрешают проверку подлинности клиента.

Числовое значение равно 8.
Значение по умолчанию отсутствует.
revocationFreshnessTime Необязательный атрибут timeSpan.

Указывает время, в течение времени, в течение периода действия списка отзыва.

Значение по умолчанию — 00:00:00.
revocationUrlRetrievalTimeout Необязательный атрибут timeSpan.

Указывает время ожидания для получения сведений об отзыве сертификата.

Значение по умолчанию — 00:01:00.
useActiveDirectoryMapping Необязательный атрибут типа Boolean .

Значение true , если сопоставление Active Directory должно быть разрешено для сертификатов клиента; в противном случае — false. Сопоставление Active Directory позволяет пользователям домена выполнять вход с помощью сертификата клиента, настроенного в Active Directory.

Примечание: Эта функция позволяет только уровню SSL попытаться сопоставить сертификат клиента с маркером пользователя. маркер не будет использоваться автоматически. Элемент <clientCertAuthentication> используется для включения сопоставленного токена для использования ftp вместо учетных данных, указанных в командах USER и PASS.

Значение по умолчанию — false.

Дочерние элементы

Отсутствует.

Образец конфигурации

В следующем примере показан FTP-сайт, которому требуются SSL-сертификаты и сертификаты клиента как для канала данных, так и для канала управления.

<site name="ftp.example.com" id="5">
   <application path="/">
      <virtualDirectory path="/" physicalPath="c:\inetpub\www.example.com" />
   </application>
   <bindings>
      <binding protocol="ftp" bindingInformation="*:21:" />
   </bindings>
   <ftpServer serverAutoStart="true">
      <security>
         <authentication>
            <anonymousAuthentication enabled="false" />
            <basicAuthentication enabled="true" />
         </authentication>
         <ssl serverCertHash="57686f6120447564652c2049495320526f636b73"
            controlChannelPolicy="SslRequire"
            dataChannelPolicy="SslRequire" />
         <sslClientCertificates clientCertificatePolicy="CertRequire"
            useActiveDirectoryMapping="false" />
      </security>
   </ftpServer>
</site>

Пример кода

В следующих примерах ftp-сайт настраивается таким образом, чтобы ему требуются сертификаты клиента и SSL для канала данных и канала управления.

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.serverCertHash:"57686f6120447564652c2049495320526f636b73" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.controlChannelPolicy:"SslRequire" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.ssl.dataChannelPolicy:"SslRequire" /commit:apphost

appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.sslClientCertificates.clientCertificatePolicy:"CertRequire" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites /[name='ftp.example.com'].ftpServer.security.sslClientCertificates.useActiveDirectoryMapping:"False" /commit:apphost

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле ApplicationHost.config.

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();

         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"ftp.example.com");
         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer");
         ConfigurationElement securityElement = ftpServerElement.GetChildElement("security");

         ConfigurationElement sslElement = securityElement.GetChildElement("ssl");
         sslElement["serverCertHash"] = @"57686f6120447564652c2049495320526f636b73";
         sslElement["controlChannelPolicy"] = @"SslRequire";
         sslElement["dataChannelPolicy"] = @"SslRequire";

         ConfigurationElement sslClientCertificatesElement = securityElement.GetChildElement("sslClientCertificates");
         sslClientCertificatesElement["clientCertificatePolicy"] = @"CertRequire";
         sslClientCertificatesElement["useActiveDirectoryMapping"] = false;

         serverManager.CommitChanges();
      }
   }
   
   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection

      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "ftp.example.com")
      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim ftpServerElement As ConfigurationElement = siteElement.GetChildElement("ftpServer")
      Dim securityElement As ConfigurationElement = ftpServerElement.GetChildElement("security")

      Dim sslElement As ConfigurationElement = securityElement.GetChildElement("ssl")
      sslElement("serverCertHash") = "57686f6120447564652c2049495320526f636b73"
      sslElement("controlChannelPolicy") = "SslRequire"
      sslElement("dataChannelPolicy") = "SslRequire"

      Dim sslClientCertificatesElement As ConfigurationElement = securityElement.GetChildElement("sslClientCertificates")
      sslClientCertificatesElement("clientCertificatePolicy") = "CertRequire"
      sslClientCertificatesElement("useActiveDirectoryMapping") = False

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "ftp.example.com"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var ftpServerElement = siteElement.ChildElements.Item("ftpServer");
var securityElement = ftpServerElement.ChildElements.Item("security");

var sslElement = securityElement.ChildElements.Item("ssl");
sslElement.Properties.Item("serverCertHash").Value = "57686f6120447564652c2049495320526f636b73";
sslElement.Properties.Item("controlChannelPolicy").Value = "SslRequire";
sslElement.Properties.Item("dataChannelPolicy").Value = "SslRequire";

var sslClientCertificatesElement = securityElement.ChildElements.Item("sslClientCertificates");
sslClientCertificatesElement.Properties.Item("clientCertificatePolicy").Value = "CertRequire";
sslClientCertificatesElement.Properties.Item("useActiveDirectoryMapping").Value = false;

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"

Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "ftp.example.com"))

If siteElementPos = -1 Then
Wscript.Echo "Element not found!"
WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set ftpServerElement = siteElement.ChildElements.Item("ftpServer")
Set securityElement = ftpServerElement.ChildElements.Item("security")

Set sslElement = securityElement.ChildElements.Item("ssl")
sslElement.Properties.Item("serverCertHash").Value = "57686f6120447564652c2049495320526f636b73"
sslElement.Properties.Item("controlChannelPolicy").Value = "SslRequire"
sslElement.Properties.Item("dataChannelPolicy").Value = "SslRequire"

Set sslClientCertificatesElement = securityElement.ChildElements.Item("sslClientCertificates")
sslClientCertificatesElement.Properties.Item("clientCertificatePolicy").Value = "CertRequire"
sslClientCertificatesElement.Properties.Item("useActiveDirectoryMapping").Value = False

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function