Intelligente Lösungen
in neuer Dimension

SSH: PublicKey aus PrivateKey extrahieren

Manchmal möchte man wissen, ob ein SSH-PrivateKey auf einen SSH-PublicKey “passt” oder man hat nur den SSH-PrivateKey zur Hand und und muß daraus den PubKey ermitteln. Hier zeige ich, wie beides geht.

Namenskonventionen

Üblicherweise liegen die SSH-Keys in “${HOME}/.ssh” und folgen diesem Schema:

  • (dateiname).pub … SSH-PublicKey
  • (dateiname) … SSH-PrivateKey

SSH-PublicKey aus SSH-PrivateKey ermitteln

Grundsätzlich kann der SSH-PublicKey mit dem Kommando ssh-keygen -e -f (dateiname) ermittelt werden. Die Ausgabe kann aber nur schwer mit dem SSH-PublicKey verglichen werden wegen:

  • Kopf- und Fußzeilen
  • Zeilenumbrüchen
  • Fehlender Schlüsseltyp

Wenn man den ermittelten Key mit ssh-keygen -i -f (zwischendateiname) bearbeitet, dann sieht die Ausgabe davon fast so aus wie der SSH-PublicKey.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ssh-keygen -e -f "${HOME}/.ssh/(dateiname)"
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "4096-bit RSA, converted by uli@uli-desktop from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAACAQCNVN1BBw8NEn6Pwf1/ZWkDio7HNTuvrMGOzKmd2g
ef+1qPUSTx8VR/9v38AEjPgYCE8ejtp7og6JrBq2qqRLCnLBjxeyU67wmlgUnDwf76LYRE
...
EA2w+X5PlQYvRw==
---- END SSH2 PUBLIC KEY ----

  # Die Zeilenumbrüche und die Kopf- und Fußzeilen stören
$ ssh-keygen -e -f "${HOME}/.ssh/(dateiname)"|head -n -1|tail -n +3|tr -d "\r\n"
AAAAB3NzaC1yc2EAA...eyU67wmlgUnDwf76LYRE...EA2w+X5PlQYvRw==

  # Noch besser geht die Wandlung via 2x ssh-keygen
$ ssh-keygen -e -f "${HOME}/.ssh/(dateiname)"| ssh-keygen -i -f /dev/stdin
ssh-rsa AAAAB3NzaC1yc2EAA...eyU67wmlgUnDwf76LYRE...EA2w+X5PlQYvRw==

Schlüsselvergleich

Nachfolgend ein Skript, welches prüft, ob der SSH-PublicKey und der SSH-PrivateKey zusammenpassen. Wenn sie zusammenpassen, dann erfolgt keine Ausgabe. Bei nicht passenden Keys werden beide ausgegeben kombiniert mit einer Fehlermeldung.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

PRIVKEY_FILE="$1"
PUBKEY_FILE="${PRIVKEY_FILE}.pub"

PUBKEY="$(cat "${PUBKEY_FILE}"|sed  -E -e "s/\s\s*/ /g" -E -e "s/^\s*//" -E -e "s/\s*$//"|cut -f1,2 -d" ")"
PUBKEY_FROM_PRIVKEY="$(ssh-keygen -e -f "${PRIVKEY_FILE}"|ssh-keygen -i -f /dev/stdin|sed  -E -e "s/\s\s*/ /g" -E -e "s/^\s*//" -E -e "s/\s*$//"|cut -f1,2 -d" ")"

test "${PUBKEY}" = "${PUBKEY_FROM_PRIVKEY}" || {
  echo >&2 "Unterschiede!"
  echo >&2 " PubKey:  '${PUBKEY}'"
  echo >&2 " PrivKey: '${PUBKEY_FROM_PRIVKEY}'"
  exit 1
}

Historie

  • 2022-05-21: Erste Version