SSH bietet die Möglichkeit, Host und User Zertifikate zur Authentifizierung zu verwenden. Dies wird möglich durch Signieren von öffentlichen SSH Schlüsseln mit einem CA Schlüssel.

Die Verwendung von Zertifikaten hat gleich mehrere Vorteile. Zertifikate können mit einer Laufzeit in ihrer Gültigkeit begrenzt werden. Wie bei Zertifikaten üblich können auch sog. _revocation lists_ geführt werden, und Zertifikate ungültig gemacht werden. Desweiteren kann man sich mit einem gültigen SSH-User-Zertifikat bei allen Hosts anmelden, die dafür konfiguriert sind, ohne, dass man seinen öffentlichen Schlüssel extra installieren muss.

Leider ist eine direkte Verwendung von den durch SSL bekannten X.509 Zertifikaten nicht vorgesehen, aber zumindest über Umwege möglich (siehe Extrahieren von SSH Schlüsseln aus X.509 Zertifikaten).

Aufbau einer SSH-CA

Um Host und User Schlüssel zu signieren, benötigt man eine SSH-CA. Sie ist lediglich ein SSH Schlüsselpaar, das zum Signieren von Host- und User-SSH-Schlüsseln verwendet wird. Man kann auch getrennte CAs für Host- und User-Schlüssel verwenden.

Folgender Befehl erstellt eine SSH-CA mit Namen `ssh_ca`.

ssh-keygen -b 4096 -t rsa -f ssh_ca -C "SSH CA for *.uni-konstanz.de"

Danach sollte der Host Schlüssel signiert werden.

ssh-keygen -s ssh_ca -h -n "$(hostname --fqdn)" -I "$(hostname --fqdn)-$(date +%s)" -V +52w+1d /etc/ssh/ssh_host_rsa_key

Hierdurch wird ein Zertifikat `/etc/ssh/ssh_host_rsa_key-cert.pub` erstellt.

Verwenden von Host-Zertifikaten

Das Verwenden von Host-Zertifikaten hat den Vorteil, dass Clienten die Vertrauenswürdigkeit von Hosts automatisch prüfen können und damit ein manuelles Prüfen von SSH-Fingerprints entfällt.

Liegt der zu signierende öffentliche Schlüssel der CA vor, wird er mit folgendem Befehl signiert.

ssh-keygen -s ssh_ca -h -n <full qualified hostname> -I <unique ID> -V <validity period> ssh_host_rsa_key.pub

Das entstandene Zertifikat wird dann zu dem Host zurück kopiert.

scp ssh_host_rsa_key-cert.pub host:/etc/ssh/

Der SSH Server des Hosts muss darauf noch so eingestellt werden, dass er das Host Zertifikat präsentiert.

# file: /etc/ssh/sshd_config
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

Damit die SSH-Clients die Gültigkeit des Host-Zertifikats prüfen können, muss man die SSH-CA auf dem Client entweder systemweit oder für einzelne Nutzer bekannt machen. Hierzu kopiert man den öffentlichen Schlüssel `ssh_ca.pub` auf den Client und schreibt den Inhalt in die Datei `known_hosts`.

# für einzelne User
echo "@cert-authority *.uni-konstanz.de $(cat ssh_ca.pub)" >> ~/.ssh/known_hosts

# systemweit
echo "@cert-authority *.uni-konstanz.de $(cat ssh_ca.pub)" >> /etc/ssh/known_hosts

Verwenden von User-Zertifikaten

Zuerst wird der öffentliche Schlüssel zum CA-Host kopiert. Dann wird er signiert.

ssh-keygen -s ssh_ca -n <user1,user2,...> -I <unique ID> -V <validity period> id_rsa.pub

Wichtig ist hierbei, dass alle Usernamen, für die das Zertifikat gültig sein soll, auch beim Signieren angegeben werden. Hat der Nutzer also auf verschiedenen Servern unterschiedliche Usernamen (bspw. `maria.muster` und `mm`), so müssen diese beim Signieren mit angegeben werden.

# Beispiel
ssh-keygen -s ssh_ca -n maria.muster,mm -I maria.muster-$(date +%s) -V 20160101120000:20180101120000 id_rsa.pub

Das Zertifikat `id_rsa-cert.pub` wird dann zurück zum Client übertragen. Der Client benötigt zur Authentifizierung drei Dateien, den privaten Schlüssel (`id_rsa`), den öffentlichen Schlüssel (`id_rsa.pub`), sowie das Zertifikat (`id_rsa-cert.pub`).
Server, die die Anmeldung mit SSH-User-Zertifikaten unterstützen wollen, benötigen eine Kopie des öffentlichen Schlüssels der CA (`ssh_ca.pub`) und müssen entsprechend konfigriert werden.

# file: /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ssh_ca.pub

Zurückziehen von Zertifikaten

Um Zertifikate zurückzuziehen benötigt man sog. _revocation lists_, die in Dateien geführt werden. Jeder Server muss über eine Kopie der Liste verfügen.

Auf dem Server

Serverseitig gibt es dafür zwei verschiedene mögliche Formate.

Das Tool `ssh-keygen` kann eine binär kodierte revocation list erstellen.

ssh-keygen -k -f /etc/ssh/revoked-keys

Alternativ kann eine klartext Datei erstellt werden.

touch /etc/ssh/revoked-keys
chmod 644 /etc/ssh/revoked-keys

Für binär kodierte Dateien können Zertifikate folgendermaßen zurückgezogen werden. Hierfür benötigt man das Zertifikat.

ssh-keygen -k -u -f /etc/ssh/revoked-keys <key or certificate file>

Bei Klartext-Listen kann man das Zertifikat einfach hinzufügen.

echo "@revoked $(cat <key or certificate file>)" >> /etc/ssh/revoked_keys

Der SSH Server muss dann noch über die Existenz der _revocation list_ informiert werden.

Auf dem Client

Clients führen keine eigene Datei, sondern fügen die zurückgezogenen Zertifikate der Datei `known_hosts` hinzu. Dies kann wieder für einzelne Nutzer oder (besser) systemweit erfolgen.

# für Nutzer
echo "@revoked $(cat <key or certificate file>)" >> ~/.ssh/known_hosts

# systemweit
echo "@revoked $(cat <key or certificate file>)" >> /etc/ssh/ssh_known_hosts'

Hierdurch wird ein Zertifikat `/etc/ssh/ssh_host_rsa_key-cert.pub` erstellt.