FTP über SSL <ssl>
Übersicht
Das <ssl>
Element gibt die FTP über Secure Sockets Layer (SSL)-Einstellungen für den FTP-Dienst an; FTP über SSL wurde erstmals für IIS 7 in FTP 7.0 eingeführt.
Im Gegensatz zur Verwendung von HTTP über SSL, das einen separaten Port und eine separate Verbindung für die sichere (HTTPS)-Kommunikation erfordert, erfolgt die sichere FTP-Kommunikation auf demselben Port wie die nicht sichere Kommunikation. FTP 7 unterstützt zwei verschiedene Formen von FTP über SSL:
- Explicit FTPS: Standardmäßig verwenden FTP-Sites und -Clients Port 21 für den Steuerkanal, und der Server und Client verhandeln sekundäre Ports für Datenkanalverbindungen. In einer typischen FTP-Anforderung stellt ein FTP-Client eine Verbindung mit einer FTP-Site über den Steuerkanal her, und dann kann der Client SSL/TLS mit dem Server entweder für den Steuerkanal oder den Datenkanal aushandeln. Wenn Sie FTP 7 verwenden, verwenden Sie Explicit SSL, wenn Sie FTPS aktivieren und die FTP-Site einem anderen Port als Port 990 zuweisen.
- Implicit FTPS: Implicit FTPS ist eine ältere Form von FTP über SSL, die noch von FTP 7 unterstützt wird. Mit Implicit FTPS muss ein SSL-Handshake ausgehandelt werden, bevor FTP-Befehle vom Client gesendet werden können. Darüber hinaus, obwohl explicit FTPS es dem Client ermöglicht, willkürlich zu entscheiden, ob SSL verwendet werden soll, erfordert Implicit FTPS, dass die gesamte FTP-Sitzung verschlüsselt werden muss. Wenn Sie FTP 7 verwenden, verwenden Sie Implicit SSL, wenn Sie FTPS aktivieren und die FTP-Site Port 990 zuweisen.
Abhängig von den Sicherheitsoptionen, die Sie in den controlChannelPolicy
und dataChannelPolicy
Attributen konfigurieren, kann ein FTP-Client in einer einzelnen Explicit FTPS-Sitzung zwischen sicher und nicht sicher wechseln. Es gibt verschiedene Möglichkeiten, wie dies je nach Ihren geschäftlichen Anforderungen implementiert werden kann:
controlChannelPolicy | dataChannelPolicy | Hinweise |
---|---|---|
SslAllow |
SslAllow |
Mit dieser Konfiguration kann der Client entscheiden, ob ein Teil der FTP-Sitzung verschlüsselt werden soll. |
SslRequireCredentialsOnly |
SslAllow |
Diese Konfiguration schützt Ihre FTP-Clientanmeldeinformationen vor elektronischem Abhören und ermöglicht dem Client zu entscheiden, ob Datenübertragungen verschlüsselt werden sollen. |
SslRequireCredentialsOnly |
SslRequire |
Diese Konfiguration erfordert, dass die Anmeldeinformationen des Clients sicher sein müssen, und der Client kann dann entscheiden, ob FTP-Befehle verschlüsselt werden sollen. Allerdings müssen alle Datenübertragungen verschlüsselt werden. |
SslRequire |
SslRequire |
Diese Konfiguration ist am sichersten – der Client muss SSL mithilfe der FTPS-bezogenen Befehle aushandeln, bevor andere FTP-Befehle zulässig sind, und alle Datenübertragungen müssen verschlüsselt werden. |
Kompatibilität
Version | Hinweise |
---|---|
IIS 10.0 | Das <ssl> Element wurde in IIS 10.0 nicht geändert. |
IIS 8.5 | Das <ssl> Element wurde in IIS 8.5 nicht geändert. |
IIS 8.0 | Das <ssl> Element wurde in IIS 8.0 nicht geändert. |
IIS 7.5 | Das <ssl> Element des <security> Elements wird als Feature von IIS 7.5 ausgeliefert. |
IIS 7.0 | Das <ssl> -Element des <security> -Elements wurde in FTP 7.0 als separater Download für IIS 7.0 eingeführt. |
IIS 6.0 | Der FTP-Dienst in IIS 6.0 unterstützt FTP über SSL nicht. |
Hinweis
Die Dienste FTP 7.0 und FTP 7.5 wurden für IIS 7.0 Out-of-Band ausgeliefert. Dazu musste der Dienst von der folgenden URL heruntergeladen und installiert werden:
Mit Windows 7 und Windows Server 2008 R2 wird der FTP 7.5-Dienst als Feature für IIS 7.5 ausgeliefert, sodass das Herunterladen des FTP-Diensts nicht mehr erforderlich ist.
Setup
Um die FTP-Veröffentlichung für Ihren Webserver zu unterstützen, müssen Sie den FTP-Dienst installieren. Führen Sie dazu die folgenden Schritte aus:
Windows Server 2012 oder Windows Server 2012 R2
Klicken Sie auf der Taskleiste auf Server-Manager.
Klicken Sie im Server-Manager auf Verwalten und dann auf Rollen und Features hinzufügen.
Klicken Sie im Assistenten zum Hinzufügen von Rollen und Features auf Weiter. Wählen Sie den Installationstyp aus, und klicken Sie auf Weiter. Wählen Sie den Zielserver aus, und klicken Sie auf Weiter.
Erweitern Sie auf der Seite Serverrollen den Webserver (IIS), und wählen Sie dann FTP-Server aus.
Klicken Sie auf Weiter, und klicken Sie dann auf der Seite Features auswählen erneut auf Weiter.
Klicken Sie auf der Seite Installationsauswahl bestätigen auf Installieren.
Klicken Sie auf der Seite Ergebnisse auf Schließen.
Windows 8 oder Windows 8.1
Bewegen Sie auf dem Startbildschirm den Mauszeiger ganz nach links unten, klicken Sie mit der rechten Maustaste auf die Starttaste und klicken Sie dann auf Systemsteuerung.
Klicken Sie in der Systemsteuerung auf Programme und dann auf Windows-Features aktivieren oder deaktivieren.
Erweitern Sie Internetinformationsdienste, und wählen Sie dann FTP-Server aus.
Klicken Sie auf OK.
Klicken Sie auf Schließen.
Windows Server 2008 R2
Klicken Sie auf der Taskleiste auf Start, zeigen Sie auf Verwaltung, und klicken Sie dann auf Server-Manager.
Erweitern Sie im Hierarchiebereich des Server Managers die Rollen und klicken Sie dann auf den Webserver (IIS).
Scrollen Sie im Bereich Webserver (IIS) zum Abschnitt Rollendienste, und klicken Sie dann auf Rollendienste hinzufügen.
Erweitern Sie auf der Seite Rollendienste auswählen des Assistenten zum Hinzufügen von Rollendiensten die Option FTP-Server.
Wählen Sie FTP-Dienst aus.
Klicken Sie auf Weiter.
Klicken Sie auf der Seite Installationsauswahl bestätigen auf Installieren.
Klicken Sie auf der Seite Ergebnisse auf Schließen.
Windows 7
Klicken Sie auf der Taskleiste auf Start und dann auf Systemsteuerung.
Klicken Sie in der Systemsteuerung auf Programme und dann auf Windows-Features aktivieren oder deaktivieren.
Erweitern Sie Internetinformationsdienste und dann FTP Server.
Wählen Sie FTP-Dienst aus.
Klicken Sie auf OK.
Windows Server 2008 oder Windows Vista
Laden Sie das Installationspaket von der folgenden URL herunter:
Befolgen Sie die Anweisungen in der folgenden exemplarischen Vorgehensweise zum Installieren des FTP-Diensts:
Gewusst wie
Konfigurieren von SSL-Optionen für eine FTP-Site
Öffnen Sie den Internet Information Services (IIS) Manager:
Wenn Sie Windows Server 2012 oder Windows Server 2012 R2 verwenden:
- Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows 8 oder Windows 8.1 verwenden:
- Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf Systemsteuerung.
- Klicken Sie auf Verwaltung und doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows Server 2008 oder Windows Server 2008 R2 verwenden:
- Klicken Sie auf der Taskleiste auf Start, zeigen Sie auf Verwaltung und dann auf den Internet Information Services (IIS) Manager.
Wenn Sie Windows Vista oder Windows 7 verwenden:
- Klicken Sie auf der Taskleiste auf Start und dann auf Systemsteuerung.
- Doppelklicken Sie auf Verwaltung und doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
Erweitern Sie im Bereich Verbindungen den Servernamen, erweitern Sie den Knoten Websites, und klicken Sie dann auf den Namen der Website.
Doppelklicken Sie im Startbereich der Website auf das FTP-SSL-Einstellungsfeature.
Wählen Sie in der Liste SSL-Zertifikat das Zertifikat aus, das Sie für Verbindungen mit dem FTP-Server verwenden möchten.
Wählen Sie unter SSL-Richtlinie eine der folgenden Optionen aus:
SSL-Verbindungen zulassen: Gestattet dem FTP-Server die Unterstützung von Nicht-SSL- und SSL-Verbindungen mit einem Client.
SSL-Verbindungen erfordern: Erfordert die SSL-Verschlüsselung für die Kommunikation zwischen dem FTP-Server und einem Client.
Benutzerdefiniert: Ermöglicht es Ihnen, eine andere SSL-Verschlüsselungsrichtlinie für den Steuerkanal und den Datenkanal zu konfigurieren. Wenn Sie diese Option auswählen, klicken Sie auf die Schaltfläche Erweitert. Wenn das Dialogfeld Erweiterte SSL-Richtlinie geöffnet wird, wählen Sie die folgenden Optionen aus:
Wählen Sie unter Steuerungskanal eine der folgenden Optionen für die SSL-Verschlüsselung über den Steuerkanal aus:
- Zulassen: Gibt an, dass SSL für den Steuerkanal zulässig ist. Ein FTP-Client kann SSL für den Steuerkanal verwenden, ist jedoch nicht erforderlich.
- Erforderlich: Gibt an, dass SSL für den Steuerkanal erforderlich ist. Ein FTP-Client wechselt möglicherweise nicht zu einem nicht sicheren Kommunikationsmodus für den Steuerkanal.
- Nur für Anmeldeinformationen erfordern: Gibt an, dass nur die Benutzeranmeldeinformationen über SSL-Sitzung gesendet werden müssen. Ein FTP-Client muss SSL für seinen Benutzernamen und sein Kennwort verwenden, der Client ist jedoch nicht erforderlich, um SSL für den Steuerkanal zu verwenden, nachdem er sich angemeldet hat.
Wählen Sie unter Datenkanal eine der folgenden Optionen für die SSL-Verschlüsselung über den Datenkanal aus:
- Zulassen: SSL ist für den Datenkanal zulässig. Ein FTP-Client kann SSL für den Datenkanal verwenden, ist jedoch nicht erforderlich.
- Erfordern: SSL ist für den Datenkanal erforderlich. Ein FTP-Client wechselt möglicherweise nicht zu einem nicht sicheren Kommunikationsmodus für den Datenkanal.
- Verweigern: SSL wird für den Datenkanal verweigert; ein FTP-Client verwendet möglicherweise nicht SSL für den Datenkanal.
Klicken Sie auf OK, um das Dialogfeld Erweiterte SSL-Richtlinie zu schließen.
Klicken Sie im Bereich Aktionen auf Übernehmen.
Konfiguration
Das <ssl>
Element wird auf Websiteebene konfiguriert.
Attribute
Attribut | Beschreibung | ||||||||
---|---|---|---|---|---|---|---|---|---|
controlChannelPolicy |
Optionales Enumerationsattribut. Gibt die SSL-Richtlinie für den FTP-Steuerkanal an. Hinweis: Es gibt keinen Enumerationswert, der SSL für den Befehlskanal verweigert. Um SSL zu verweigern, binden Sie kein SSL-Zertifikat an die FTP-Website, indem Sie einen Zertifikathash im serverCertHash Attribut angeben.
SslRequire . |
||||||||
dataChannelPolicy |
Optionales Enumerationsattribut. Gibt die SSL-Richtlinie für den FTP-Datenkanal an.
SslRequire . |
||||||||
serverCertHash |
Optionales Zeichenfolgeattribut. Gibt den Fingerabdruckhash für das serverseitige Zertifikat an, das für SSL-Verbindungen verwendet werden soll. Es ist kein Standardwert vorhanden. |
||||||||
serverCertStoreName |
Optionales Zeichenfolgeattribut. Gibt den Zertifikatspeicher für SSL-Serverzertifikate an. Der Standardwert ist MY . |
||||||||
ssl128 |
Optionales Boolean -Attribut. Gibt an, ob 128-Bit-SSL erforderlich ist. Der Standardwert ist false . |
Untergeordnete Elemente
Keine.
Konfigurationsbeispiel
Im folgenden Beispiel werden mehrere Konfigurationseinstellungen im <ftpServer>
Element für eine FTP-Site veranschaulicht. Genauer gesagt zeigen die <site>
Einstellungen in diesem Beispiel, wie Sie:
- Eine FTP-Site erstellen, und die Bindung für das FTP-Protokoll am Port 21 hinzufügen.
- Die FTP-SSL-Optionen konfigurieren, um den sicheren Zugriff sowohl auf dem Steuerelement als auch auf dem Datenkanal mithilfe eines Zertifikats zu ermöglichen.
- „Anonyme Authentifizierung“ deaktivieren, und „Standardauthentifizierung für FTP“ aktivieren.
- Den Zugriff für FTP SYST-Befehl verweigern.
- Das UNIX-Verzeichnisauflistungsformat angeben.
- Die Protokollierungsoptionen konfigurieren.
- Eine angepasste Willkommensnachricht angeben, und lokale detaillierte Fehlermeldungen aktivieren.
- Angeben, dass Benutzer in einem Startverzeichnis beginnen, das auf ihrem Anmeldenamen basiert, aber nur, wenn dieses Verzeichnis vorhanden ist.
<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>
Beispielcode
In den folgenden Beispielen wird eine FTP-Website so konfiguriert, dass SSL sowohl für den Datenkanal als auch für den Steuerkanal erforderlich ist.
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
Hinweis
Sie müssen unbedingt den Commitparameter auf apphost
festlegen, wenn Sie AppCmd.exe verwenden, um diese Einstellungen zu konfigurieren. Dadurch werden die Konfigurationseinstellungen auf den entsprechenden Speicherortabschnitt in der Datei ApplicationHost.config festgelegt.
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