Under Construction
SSH-Server: Erzeugen von SSH Host-Zertifikaten
Ein SSH Host-Zertifikat kann auf dem Rechner mit der Host-Zertifizierungsstelle durch Signieren eines Host-Public-Keys erzeugt werden. D.h. man benötigt zunächst den Public-Key eines Hosts. Diese sind per Default im Verzeichnis /etc/ssh zu finden und haben den Präfix „ssh_host_“ und die Endung „.pub“:
user01@server01 $ ls -l /etc/ssh/ssh_host*.pub
-rw-r--r-- 1 root system 162 Jun 17 2017 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root system 82 Jun 15 2019 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r--r-- 1 root system 382 Jun 15 2019 /etc/ssh/ssh_host_rsa_key.pub
user01@server01 $
Der Host-Key für den ein SSH Host-Zertifikat erzeugt werden soll, muss auf die Host-Zertifizierungsstelle (bei uns ca-host) kopiert werden:
user01@server01 $ scp /etc/ssh/ssh_host_ed25519_key.pub ca-host:/tmp
ssh_host_ed25519_key.pub 100% 82 109.4KB/s 00:00
user01@server01 $
Hinweis: Es ist kein Problem den Public-Key in das /tmp-Verzeichnis zu legen. Den Public-Key kann und darf jeder ohnehin sehen. Er lässt sich mittels ssh-keyscan auch anonym über Netz abfragen.
Dann kann mit Hilfe des Private-Keys (ssh_host_ca_key) der Zertifizierungsstelle daraus ein Zertifikat erstellt werden:
root@ca-host # ssh-keygen -s /etc/security/ssh-ca/ssh_host_ca_key -I server01.powercampus.de -h -n server01.powercampus.de,server01 /tmp/ssh_host_ed25519_key.pub
Enter passphrase: XXXXXXXXXX
Signed host key /tmp/ssh_host_ed25519_key-cert.pub: id "server01.powercampus.de" serial 0 for server01.powercampus.de,server01 valid forever
root@ca-host #
Hinweis: Auch das Ablegen des Zertifikats in /tmp ist kein Problem, da auch dieses öffentlich sichtbar sein muss und ebenfalls mit ssh-keyscan anonym über Netz abgefragt werden kann.
Das erzeugte Host-Zertifikat ist unbegrenzt gültig. Mit der Option „-I“ muss eine ID für das Zertifikat angegeben. Dies ist eine beliebige Zeichenkette, mit der das Zertifikat identifiziert und ausgewählt werden kann. Wir haben hier den FQDN des zugehörigen Hosts verwendet. Wichtig ist die Option „-h“ um ein Host-Zertifikat zu erzeugen, der Default sind User-Zertifikate. Über die Option „-n“ können sogenannte Principals angegeben werden. Im Falle von Host-Zertifikaten sind das Rechnernamen. Im Beispiel haben wir den FQDN und den Kurznamen des Hosts angegeben. Als letztes Argument muss die Datei mit dem zu signierenden Public-Host-Key angegeben werden. Hat der Private-Key der Host-Zertifizierungsstelle einen Passphrase muss dieser angegeben werden. Das erzeugte Zertifikat wird in dem Verzeichnis abgespeichert, in dem sich der Public-Host-Key befindet:
root@ca-host # ls -l /tmp/ssh_host_ed25519_key*.pub
-rw-r--r-- 1 root system 560 Jan 12 19:53 /tmp/ssh_host_ed25519_key-cert.pub
-rw-r--r-- 1 ize0h29 izbgroup 82 Jan 12 19:49 /tmp/ssh_host_ed25519_key.pub
root@ca-host #
Es wird die Zeichenkette „-cert“ im Dateinamen des Public-Host-Keys vor der Endung „.pub“ eingefügt und als Name für das Zertifikat verwendet. Details des Zertifikats können mit ssh-keygen und der Option „-L“ angezeigt werden:
root@ca-host # ssh-keygen -L -f /tmp/ssh_host_ed25519_key-cert.pub
/tmp/ssh_host_ed25519_key-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com host certificate
Public key: ED25519-CERT SHA256:po4nqX/FudIl2Vhr6IOxzN0DMhouHW89ikn6oGwmeuc
Signing CA: ED25519 SHA256:Yr22UVk95ilCGBTki8QP7BT16IBqW9PhoOY3JG/OeyA (using ssh-ed25519)
Key ID: "server01.powercampus.de"
Serial: 0
Valid: forever
Principals:
server01.powercampus.de
server01
Critical Options: (none)
Extensions: (none)
root@ca-host #
Das SSH Host-Zertifikat muss dann auf den Rechner kopiert werden, für den das Zertifikat erzeugt wurde:
user01@server01 $ scp ca-host:/tmp/ssh_host_ed25519_key-cert.pub /tmp
ssh_host_ed25519_key-cert.pub 100% 560 276.6KB/s 00:00
user01@server01 $
Danach werden der kopierte Host-Key und das generierte Zertifikat auf dem Rechner mit der Zertifizierungstelle nicht mehr benötigt und können (sollten) dort gelöscht werden:
root@ca-host # rm /tmp/ssh_host_ed25519_key*.pub
root@ca-host #
Damit der SSH-Daemon das Zertifikat auch verwenden kann, sollte es im Verzeichnis /etc/ssh abgelegt werden und über das Keyword HostCertificate in der Konfiguration des SSH-Daemon bekannt gemacht werden:
root@server01 # cp /tmp/ssh_host_ed25519_key-cert.pub /etc/ssh
root@server01 # vi /etc/ssh/sshd_config
…
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
…
root@server01 #
Anschließend muss der SSH-Daemon einmal durchgestartet werden, damit sich die geänderte Konfiguration auswirkt und das Zertifikat verwendet wird:
root@server01 # stopsrc -s sshd
0513-044 The sshd Subsystem was requested to stop.
root@server01 # startsrc -s sshd
0513-059 The sshd Subsystem has been started. Subsystem PID is 9634106.
root@server01 #
Mit Hilfe von ssh-keyscan und der Option „-c“ (certificates) kann sofort überprüft werden, ob das Zertifikat verwendet wird:
user01@server01 $ ssh-keyscan -c localhost
# localhost:22 SSH-2.0-OpenSSH_9.9
# localhost:22 SSH-2.0-OpenSSH_9.9
# localhost:22 SSH-2.0-OpenSSH_9.9
ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIIt9269j9D0pkSl8TlrshodycAUtQ3rZGrYHfE3Ux6i5AAAAIKO0B1dqnnudHJqSBeb018DVWqUV/+lnq9G25yj9lFGgAAAAAAAAAAAAAAACAAAAGmZpdHNwZWFpeGRiZTAxLmFkbW5ldC5maXRzAAAAMAAAABpmaXRzcGVhaXhkYmUwMS5hZG1uZXQuZml0cwAAAA5maXRzcGVhaXhkYmUwMQAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICyVfkcCsyO22jpy1p/G8gvpIPYdAEG9u+YGmmPszvpFAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEDUBL3Lha9pE5b6a7bPzcWRGaBFqNLJuDnaRbL+0vFu1BltOH7mlCNCHg73tEoL0xqM+EqhlYSF/h40FGvgP8kD
# localhost:22 SSH-2.0-OpenSSH_9.9
# localhost:22 SSH-2.0-OpenSSH_9.9
user01@server01 $
Das Zertifikat wird verwendet und angezeigt.
Bei Bedarf kann man auch für weitere Host-Keys Zertifikate auf die gleiche Weise erzeugen. Es kann also ohne weiteres mehr als ein Zertifikat verwendet werden, genauso wie ein Rechner ja auch mehrere Host-Keys haben kann.
