Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Общие сведения
Элемент <ssl>
задает параметры FTP по протоколу SSL для службы FTP; FTP через SSL впервые появился для IIS 7 в FTP 7.0.
В отличие от использования ПРОТОКОЛА HTTP через SSL, для которого требуется отдельный порт и подключение для безопасного обмена данными (HTTPS), безопасный обмен данными по ПРОТОКОЛу FTP осуществляется через тот же порт, что и небезопасный обмен данными. FTP 7 поддерживает две различные формы FTP через SSL:
- Явный FTPS. По умолчанию ftp-сайты и клиенты используют порт 21 для канала управления, а сервер и клиент согласовывают вторичные порты для подключений к каналу данных. В типичном FTP-запросе FTP-клиент подключается к FTP-сайту через канал управления, а затем клиент может согласовывать SSL/TLS с сервером для канала управления или канала данных. При использовании FTP 7 вы используете явный ПРОТОКОЛ SSL, если включаете FTPS и назначаете ftp-сайту любой порт, отличный от порта 990.
- Неявное FTPS. Неявное FTPS — это более старая форма FTP по SSL, которая по-прежнему поддерживается FTP 7. При использовании неявного FTPS подтверждение SSL должно быть согласовано перед отправкой каких-либо ftp-команд клиентом. Кроме того, несмотря на то, что явный FTPS позволяет клиенту произвольно решать, следует ли использовать SSL, неявный FTPS требует, чтобы весь сеанс FTP был зашифрован. При использовании FTP 7 используется неявный ПРОТОКОЛ SSL, если вы включили FTPS и назначите ftp-сайт порту 990.
В зависимости от параметров безопасности, настроенных в controlChannelPolicy
атрибутах и dataChannelPolicy
, FTP-клиент может переключаться между безопасным и незащищенным несколько раз в одном явном сеансе FTPS. Существует несколько способов реализации этой функции в зависимости от потребностей вашего бизнеса.
controlChannelPolicy | dataChannelPolicy | Примечания |
---|---|---|
SslAllow |
SslAllow |
Такая конфигурация позволяет клиенту решить, следует ли шифровать какую-либо часть сеанса FTP. |
SslRequireCredentialsOnly |
SslAllow |
Эта конфигурация защищает учетные данные FTP-клиента от электронного перехвата и позволяет клиенту решить, следует ли шифровать передачу данных. |
SslRequireCredentialsOnly |
SslRequire |
Эта конфигурация требует, чтобы учетные данные клиента были защищены, а затем позволяет клиенту решить, следует ли шифровать команды FTP. Однако все передачи данных должны быть зашифрованы. |
SslRequire |
SslRequire |
Эта конфигурация является наиболее безопасной: клиент должен согласовывать SSL с помощью команд, связанных с FTPS, прежде чем будут разрешены другие команды FTP, и все передачи данных должны быть зашифрованы. |
Совместимость
Версия | Примечания |
---|---|
IIS 10.0 | Элемент <ssl> не был изменен в IIS 10.0. |
IIS 8,5 | Элемент <ssl> не был изменен в IIS 8.5. |
IIS 8,0 | Элемент <ssl> не был изменен в IIS 8.0. |
IIS 7,5 | Элемент <ssl> элемента поставляется <security> как компонент IIS 7.5. |
IIS 7.0 | Элемент <ssl> элемента появился <security> в FTP 7.0, который был отдельной загрузкой для IIS 7.0. |
IIS 6,0 | Служба FTP в IIS 6.0 не поддерживала FTP через SSL. |
Примечание
Службы FTP 7.0 и FTP 7.5 поставляются внеполосно для IIS 7.0, что требует скачивания и установки модулей по следующему URL-адресу:
В Windows 7 и Windows Server 2008 R2 служба FTP 7.5 поставляется в качестве функции для IIS 7.5, поэтому скачивание службы FTP больше не требуется.
Настройка
Чтобы обеспечить поддержку публикации FTP для веб-сервера, необходимо установить службу FTP. Для этого выполните следующие действия.
Windows Server 2012 или Windows Server 2012 R2
На панели задач щелкните Диспетчер сервера.
В диспетчер сервера откройте меню Управление и выберите пункт Добавить роли и компоненты.
В мастере добавления ролей и компонентов нажмите кнопку Далее. Выберите тип установки и нажмите кнопку Далее. Выберите целевой сервер и нажмите кнопку Далее.
На странице Роли сервера разверните узел Веб-сервер (IIS) и выберите FTP-сервер.
Нажмите кнопку Далее, а затем на странице Выбор компонентов нажмите кнопку Далее еще раз.
На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
На странице Результаты нажмите кнопку Закрыть.
Windows 8 или Windows 8.1
На начальном экране переместите указатель в левый нижний угол, щелкните правой кнопкой мыши кнопку Пуск и выберите панель управления.
В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
Разверните узел Службы IIS, а затем выберите FTP-сервер.
Нажмите кнопку ОК.
Щелкните Закрыть.
Windows Server 2008 R2
На панели задач нажмите кнопку Пуск, выберите Администрирование, а затем диспетчер сервера.
В области иерархии диспетчер сервера разверните узел Роли и выберите Веб-сервер (IIS).
На панели Веб-сервер (IIS) прокрутите страницу до раздела Службы ролей и щелкните Добавить службы ролей.
На странице Выбор служб ролеймастера добавления служб ролей разверните узел FTP-сервер.
Выберите Служба FTP.
Щелкните Далее.
На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
На странице Результаты нажмите кнопку Закрыть.
Windows 7
На панели задач нажмите кнопку Пуск, а затем панель управления.
В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
Разверните узел Службы IIS, а затем FTP-сервер.
Выберите Служба FTP.
Нажмите кнопку ОК.
Windows Server 2008 или Windows Vista
Скачайте пакет установки по следующему URL-адресу:
Следуйте инструкциям в следующем пошаговом руководстве, чтобы установить службу FTP:
Инструкции
Настройка параметров SSL для FTP-сайта
Откройте диспетчер служб IIS:
Если вы используете Windows Server 2012 или Windows Server 2012 R2:
- На панели задач щелкните диспетчер сервера, выберите Сервис, а затем диспетчер служб IIS.
Если вы используете Windows 8 или Windows 8.1:
- Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
- Щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
Если вы используете Windows Server 2008 или Windows Server 2008 R2:
- На панели задач нажмите кнопку Пуск, наведите указатель на пункт Администрирование, а затем выберите Пункт Диспетчер служб IIS.
Если вы используете Windows Vista или Windows 7:
- На панели задач нажмите кнопку Пуск, а затем панель управления.
- Дважды щелкните Администрирование, а затем дважды щелкните Диспетчер служб IIS.
В области Подключения разверните имя сервера, узел Сайты и щелкните имя сайта.
На домашней панели сайта дважды щелкните функцию ПАРАМЕТРЫ FTP SSL .
В списке SSL-сертификат выберите сертификат, который будет использоваться для подключений к FTP-серверу.
В разделе Политика SSL выберите один из следующих параметров:
Разрешить SSL-подключения. Позволяет FTP-серверу поддерживать не ssl- и SSL-подключения с клиентом.
Требовать SSL-подключения. Требуется шифрование SSL для обмена данными между FTP-сервером и клиентом.
Пользовательский. Позволяет настроить другую политику шифрования SSL для канала управления и канала данных. Если выбран этот параметр, нажмите кнопку Дополнительно... . Когда откроется диалоговое окно Расширенная политика SSL , выберите следующие параметры:
В разделе Канал управления выберите один из следующих вариантов шифрования SSL через канал управления:
- Разрешить: указывает, что ssl разрешен для канала управления; FTP-клиент может использовать SSL для канала управления, но это не обязательно.
- Требовать. Указывает, что для канала управления требуется SSL; FTP-клиент не может переключиться в небезопасный режим связи для канала управления.
- Требовать только для учетных данных: указывает, что только учетные данные пользователя должны быть отправлены через сеанс SSL; FTP-клиент должен использовать SSL для имени пользователя и пароля, но клиент не обязан использовать SSL для канала управления после входа в систему.
В разделе Канал данных выберите один из следующих вариантов шифрования SSL по каналу данных:
- Разрешить: ssl разрешен для канала данных; FTP-клиент может использовать SSL для канала данных, но это не обязательно.
- Требовать: для канала данных требуется SSL; FTP-клиент не может переключиться в небезопасный режим связи для канала данных.
- Запретить: ssl запрещен для канала данных; FTP-клиент не может использовать SSL для канала данных.
Нажмите кнопку ОК , чтобы закрыть диалоговое окно Расширенная политика SSL .
В области Действия нажмите кнопку Применить.
Конфигурация
Элемент <ssl>
настраивается на уровне сайта.
Атрибуты
Атрибут | Описание | ||||||||
---|---|---|---|---|---|---|---|---|---|
controlChannelPolicy |
Необязательный атрибут перечисления. Указывает политику SSL для канала управления FTP. Примечание: Нет значения перечисления, запрещающего SSL для канала команд; Чтобы запретить SSL, не привязывайте SSL-сертификат к FTP-сайту, указывая хэш сертификата в атрибуте serverCertHash .
SslRequire . |
||||||||
dataChannelPolicy |
Необязательный атрибут перечисления. Указывает политику SSL для канала данных FTP.
SslRequire . |
||||||||
serverCertHash |
Необязательный строковый атрибут. Указывает хэш отпечатка для сертификата на стороне сервера, который будет использоваться для SSL-подключений. Значение по умолчанию отсутствует. |
||||||||
serverCertStoreName |
Необязательный строковый атрибут. Указывает хранилище сертификатов для SSL-сертификатов сервера. Значение по умолчанию — MY . |
||||||||
ssl128 |
Необязательный атрибут boolean . Указывает, требуется ли 128-разрядное шифрование SSL. Значение по умолчанию — false . |
Дочерние элементы
Отсутствует.
Образец конфигурации
В следующем примере показаны несколько параметров конфигурации в элементе <ftpServer>
для FTP-сайта. В частности, <site>
параметры в этом примере демонстрируют следующее:
- Создайте FTP-сайт и добавьте привязку для протокола FTP через порт 21.
- Настройте параметры SSL FTP, чтобы разрешить безопасный доступ как к элементу управления, так и к каналу данных с помощью сертификата.
- Отключите анонимную проверку подлинности и включите обычную проверку подлинности для FTP.
- Запретить доступ для команды FTP SYST .
- Укажите формат списка каталогов UNIX.
- Настройте параметры ведения журнала.
- Укажите настраиваемое приветственное сообщение и включите локальные подробные сообщения об ошибках.
- Укажите, что пользователи будут запускаться в домашнем каталоге, основанном на имени входа, но только в том случае, если этот каталог существует.
<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>
<security>
<ssl controlChannelPolicy="SslAllow"
dataChannelPolicy="SslAllow"
serverCertHash="57686f6120447564652c2049495320526f636b73" />
<authentication>
<basicAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
<commandFiltering maxCommandLine="4096" allowUnlisted="true">
<add command="SYST" allowed="false" />
</commandFiltering>
</security>
<directoryBrowse showFlags="StyleUnix" />
<logFile logExtFileFlags="Date, Time, ClientIP, UserName, ServerIP, Method, UriStem, FtpStatus, Win32Status, ServerPort, FtpSubStatus, Session, FullPath, Info" />
<messages expandVariables="true"
greetingMessage="Welcome %UserName%!"
allowLocalDetailedErrors="true" />
<userIsolation mode="StartInUsersDirectory" />
</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 для настройки этих параметров для параметра 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";
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"
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";
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"
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