# Secure Socket Tunneling Protocol

SSTP (Secure Socket Tunneling Protocol) :
| Familie: | Internetprotokollfamilie |
| Einsatzgebiet: | Aufbau eines Virtual Private Network |
| Port: | 443/TCP |
| SSTP im TCP/IP‑Protokollstapel: Tunnel IP (privat) PPP SSTP Anwendung HTTPS SSL/TLS Transport TCP Internet IP (IPv4, IPv6) Netzzugang Ethernet Token Bus Token Ring FDDI … ||
| Standards: | nicht durch die IETF standardisiert |
| Revision | 14.0 (8. August 2013) |
Das Secure Socket Tunneling Protocol (SSTP) ist ein Virtual-Private-Network-Tunnel-Protokoll von Microsoft aus dem Jahr 2007. Es ermöglicht den Aufbau eines VPN-Tunnels über sicheres HTTP (SSL/TLS) auf Port 443. Damit sollen Probleme beseitigt werden, die durch Blockierung an Webproxys, Firewalls und NAT-Routern auftreten, wenn andere Tunnelprotokolle wie Point-to-Point Tunneling Protocol (PPTP) oder Layer 2 Tunneling Protocol über IPsec (L2TP/IPSec) verwendet werden.

## Entwicklung

SSTP ist Microsofts Lösung für VPN-Zugriffe mit PPP über SSL (SSL-VPN). Microsoft erhoffte sich mit diesem Verfahren die Supportanfragen, die im Zusammenhang mit IPSec-basierten VPNs auftraten, deutlich reduzieren zu können, da diese oft von Firewalls und Routern blockiert werden. Obwohl das Verfahren auf vielen Standards basiert, strebte Microsoft für SSTP keine Standardisierung im Rahmen der IETF an.
Das Verfahren wurde primär als (Nutzer)-Fernzugriffslösung für ein End-to-Site-Szenario entwickelt, um über den bekannten Port 443/TCP durch Firewalls und Gateways hindurch auf Server- und Netzwerkstrukturen zugreifen zu können. Ein Einsatz als Verbindung zwischen Netzwerken, einem Site-to-Site-Szenario, ist von Seiten Microsoft nicht vorgesehen; mit einer speziellen Implementierung, beispielsweise auf Routern, jedoch möglich.

### Spezifikationen

Die technischen Spezifikationen von (MS-)SSTP sind im Rahmen des Microsoft Communication Protocol Program (MCPP) veröffentlicht, welches die unentgeltliche Bereitstellung von technischen Dokumenten für Microsoft-Betriebssysteme regelt.
SSTP verwendet SSL 3.0 und HTTP 1.1 mit 64 bit content length encoding und funktioniert sowohl unter IPv4 als auch unter IPv6. Für die PPP-Authentisierung können MS-CHAPv2, EAP-MS-CHAPv2, EAP-Smart-card und Protected Extensible Authentication Protocol (PEAP) verwendet werden. Als Verschlüsselungsalgorithmen werden die für SSL verfügbaren Verfahren unterstützt (AES, RC4, 3DES).
Serverseitig wird für die Einrichtung von SSTP-VPNs Windows Server 2008 oder höher (Windows Server 2008 R2 oder Windows Server 2012) mit installiertem Routing and Remote Access Service (RRAS) benötigt. Clientseitig ist SSTP verfügbar ab Windows Vista Service Pack 1. Ein SSTP-Client für Linux, FreeBSD und Mac OS ist auf SourceForge zum Download verfügbar. Ist clientseitig die Protokollauswahl auf Automatik eingestellt, wird der erste Verbindungsaufbau in der Reihenfolge PPTP → L2TP → SSTP versucht.

## Ablauf des Verbindungsaufbaus

* Der Client baut eine TCP-Verbindung zum Server auf Port 443 auf.
* Auf dieser TCP-Verbindung erfolgt der SSL/TLS Handshake mit dem Server (→ siehe: TLS Handshake). Während dieser Phase erhält der Client das X.509-Serverzertifikat und überprüft es. Wenn das Zertifikat nicht gültig ist, wird der Verbindungsaufbau abgebrochen. Zu diesem Zeitpunkt erfolgt keine Client-Authentisierung.
* Der Client baut über die SSL/TLS-Verbindung eine HTTP-Sitzung mit dem Server auf. (→ siehe: HTTP-Request)
* Der Client sendet SSTP-Kontrollpakete über die HTTPS-Sitzung. Wenn der SSTP-Status auf beiden Seiten bereit ist, erfolgt eine Linkup-Signalisierung an die PPP-Sicherungsschicht auf beiden Seiten.
* Über SSL/TLS und SSTP erfolgt der PPP-Verbindungsaufbau (→ siehe: Herstellung einer PPP-Verbindung). Als Teil der PPP-Authentifizierungsphase, authentisiert sich der Client gegenüber dem Server (und abhängig vom Authentifizierungsverfahren auch der Server gegenüber dem Client)
* Nach Fertigstellung der PPP-Aushandlung werden auf beiden Seiten IP-Interfaces mit privaten IP-Adressen erstellt, über die Client und Server dann mit SSTP kommunizieren.

### Beispiel

* Angenommen der Server hat die öffentliche IP-Adresse: 100.100.100.1 und der Client hat die öffentliche IP-Adresse: 200.200.200.1.
* Nach Aushandlung der PPP-Verbindung über SSTP hat der Server ein zusätzliches Interface mit der IP: 192.168.0.1 und der Client ein zusätzliches Interface mit der IP: 192.168.0.2.
* Der Nutzer pingt vom Client aus den Server mit der IP: 192.168.0.1 an.
* Der Ping wird abgesetzt via IP via PPP via SSTP (mit der Quelladresse: 192.168.0.2 und der Zieladresse: 192.168.0.1).
* SSTP sendet die Anforderung zur SSL-Schicht, die die Verschlüsselung vornimmt, von dort via TCP via IP (mit der Quelladresse: 200.200.200.1 und der Zieladresse: 100.100.100.1) über die öffentliche Schnittstelle.
* Der Server nimmt die Anforderung auf dem öffentlichen Interface entgegen und leitet sie via IP via TCP an die SSL-Schicht, die die Entschlüsselung vornimmt, von dort via SSTP via PPP via IP an die Zieladresse: 192.168.0.1.

## SSTP Paket-Struktur
### Header

Die folgende Header-Struktur gilt für alle Typen von SSTP-Paketen:
| Bit offset | Bits 0–7 | Bits 0–7 | Bits 0–7 | Bits 0–7 | Bits 0–7 | Bits 0–7 | Bits 0–7 | Bits 0–7 | 8–14 | 8–14 | 8–14 | 8–14 | 8–14 | 8–14 | 8–14 | 15 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 |
| 0 | Version | Version | Version | Version | Version | Version | Version | Version | Reserviert | Reserviert | Reserviert | Reserviert | Reserviert | Reserviert | Reserviert | C | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge | Länge |
| 32+ | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten | Daten |
* Version (8 Bits) – Übermittlung und Aushandlung der verwendeten SSTP-Version.
* Reserviert (7 Bits) – reserviert für zukünftige Verwendung.
* C (1 Bit) – Kontrollbit, das anzeigt, ob das SSTP-Paket ein SSTP-Kontroll-Paket (1) oder ein SSTP-Daten-Paket (0) ist.
* Länge (16 Bits) – Paketlänge, zusammengesetzt aus zwei Werten: reserviert (4 Bits) – reserviert für zukünftige Verwendung und Paket-Länge (12 Bits) – Länge des gesamten SSTP-Pakets, einschließlich SSTP-Header.
* Daten (variabel) – Wenn das Kontrollbit C gesetzt ist, enthält das Datenfeld eine Kontrollnachricht. Andernfalls enthält das Datenfeld ein höheres Protokoll. Aktuell ist hier nur Point-to-Point Protocol (PPP) möglich.

### Kontrollnachricht

Das Datenfeld des SSTP-Headers enthält eine SSTP-Kontrollnachricht, wenn das Kontrollbit C im Header gesetzt ist.
| Bit offset | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | Bits 0–15 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 | 16–31 |
| 0 | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Nachricht-Typ | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler | Attributzähler |
| 32+ | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute | Attribute |
* Nachrichttyp (16 Bits) – bestimmt den Typ der übermittelten Kontrollnachricht
* Attributzähler (16 Bits) – bestimmt die Anzahl der übermittelten Attribute.
* Attribute (variabel) – enthält die Liste der zum SSTP-Kontrollpaket gehörigen Attribute. Die Anzahl der Attribute wird durch das Feld Attributzähler festgelegt.