Unterschiede zwischen den privaten Schlüsseln von ssh-keygen und denen von libressl?

Unterschiede zwischen den privaten Schlüsseln von ssh-keygen und denen von libressl?

Ich habe mit Libressl 3.0 und Curve einen privaten Schlüssel generiert secp521r1.

openssl genpkey -aes128 -algorithm EC -pkeyopt ec_paramgen_curve:secp521r1 -pkeyopt ec_param_enc:named_curve

Soweit ich weiß, ist diese Kurve dieselbe, die ssh-keygen verwendet, ssh-keygen -t ecdsa -b 521und aus der Dokumentation weiß ich, dass ssh-keygen jetzt aes128 verwendet, um den privaten Schlüssel zu verschlüsseln.

Die Größe des privaten Libressl-Schlüssels beträgt 534und die Größe des SSH-Keygen-Schlüssels beträgt 736.

Meine Frage lautet: Was macht ssh-keygen zusätzlich, um die Größe des Schlüssels zu erhöhen?

Außerdem: Sind beide austauschbar? Kann ein in dem einen generierter privater Schlüssel in den anderen konvertiert werden?

Antwort1

TLDR: Es gibt viele verschiedene Formate für Privatekey-Dateien

Und es hängt teilweise von der OpenSSH-Version ab, die Sie nicht angegeben haben.

Mit Ausnahme der längst veralteten Protokollversion 1 (und des Schlüsseltyps „rsa1“) verwendete OpenSSH (den libcrypto-Teil von) OpenSSL, um die meisten seiner Kryptooperationen durchzuführen – einschließlich der Speicherung privater Schlüssel (oder tatsächlich Schlüsselpaare) in Dateien, unter Verwendung des„traditionelle“ oder „Legacy“-Formate, definiert durch SSLeay/OpenSSL. OpenSSL unterstützt auch „neue“ (seit etwa 1998!) PKCS8-Formate, die (etwas) sicherer sind. Es gibt also 4 PEM-Formate, die von OpenSSL für „ECDSA“ unterstützt werden (genauer gesagt X9-artiges Weierstrass EC, das sowohl X9.62 ECDSA als auch X9.63 ECDH abdeckt), von denen OpenSSHerzeugtnur 2, aber (mit libcrypto) können alle gelesen werden. Wenn ssh-keygenverschlüsseltOpenSSL-FormatDateien, neuere Versionen verwenden AES-128-CBC, aber das war nicht immer so.

Ab Version 6.5 im Jahr 2014-01OpenSSH hat sein eigenes „neues“ Dateiformat hinzugefügt, teilweise um eine bessere Sicherheit als die alten OpenSSL-Formate (bei Verschlüsselung) zu bieten und teilweise um den damals neuen Algorithmus Ed25519 zu unterstützen, den OpenSSL damals überhaupt nicht unterstützte. ssh-keygenhatte eine Option -o, ein neues Format für jeden Schlüsseltyp außer ed25519 (oder rsa1) anzufordern, und Sie werden viele Stack Q und As der letzten Jahre finden, die auf diese Option verweisen und sie normalerweise auch empfehlen. Dateien im „neuen“ Format werden standardmäßig mit AES256-CBC verschlüsselt, was mit überschrieben werden kann -Z ciphername, aber die Manpage wurde anscheinend für keines davon aktualisiert. Ab Version 7.8 in 2018-08 verwendet OpenSSH standardmäßig das „neue“ Format für alle Schlüsseltypen, obwohl Sie mit anfangen können, um -m pemdas OpenSSL-Format für alles außer ed25519 anzufordern. Wenn Sie man ssh-keygenIhr System überprüfen (es sei denn, es ist Windows), sollte einer dieser Fälle beschrieben werden, wahrscheinlich der letztere.

(Es gibt auch PKCS12 aka PFX-Format, das OpenSSLdürfenwird für einen privaten Schlüssel verwendet, wird aber normalerweise nur verwendet, um einen privaten Schlüssel (oder mehrere) mit einem oder mehreren X.509-Zertifikaten für diesen (diese) Schlüssel zu kombinieren, was eine andere Situation darstellt und nicht auf SSH zutrifft, das niemals X.509-Zertifikate verwendet. Andere Programme oder Systeme verwenden andere Formate: „kommerziell“/Tectia SSH hat sein eigenes Format und PuTTY hat sein eigenes Format PPK = PuTTY Private Key. Und so weiter und so fort, Yul Brynner. Alle diese sind semantisch gleichwertig und können mit geeigneten Tools ineinander umgewandelt werden.)

Alle von OpenSSH verwendeten Privatekey-Formate sindPEM-Stil; die Binärdaten werden als Base64-Text mit Kopf- und Endzeilen in der Form kodiert

-----BEGIN (something)-----
(sometimes some headers here)
(data encoded in base64, broken into lines of 64 characters)
-----END (something)-----

Sie können also erkennen, welches Format Sie haben, indem Sie sich einfach die Striche-BEGIN-Zeile ansehen. Siehe Near-Crossdupeshttps://security.stackexchange.com/questions/39279/stärkere-verschlüsselung-für-ssh-keysoder kürzerhttps://security.stackexchange.com/questions/129724/how-to-check-if-an-ssh-private-key-has-passphrase-or-notUndhttps://security.stackexchange.com/questions/200935/wie-kann-ich-feststellen-ob-ein-vorhandener-ssh-privater-schlüssel-sicher-ist(meins).

Die Unterschiede:Die Größe von 736 Zeichen für einen ecdsa-p521-Schlüssel entspricht dem neuen OpenSSH-Formatunverschlüsselt-- Sind SieSicherSie haben ihm eine Passphrase gegeben? – und 534 entspricht dem PKCS8-verschlüsselten Format, das von OpenSSL 1.0.2 erstellt wurde, was meines Wissens nach der Zeitpunkt der Fork von LibreSSL war. (OpenSSL 1.1.0 und höher ändert die PKCS8-Verschlüsselung, um HMAC-SHA256 in PBKDF2 zu verwenden, was die Datei etwas größer macht. OpenSSL 1.1.0 und höher macht außerdem param_enc=named zum Standard, sodass Sie es nicht mehr angeben müssen.) Das neue OpenSSH-Format ist größer als das PKCS8-enc-Format, hauptsächlich, weil es ohne ersichtlichen Grund den Publickey-Wert speichert (für ECDSA einen Kurvenpunkt im X9.62-Format).zweimal-- einmal in dem für den öffentlichen Schlüssel angegebenen Abschnitt der Datei undwiederim für den privaten Schlüssel angegebenen Abschnitt. Darüber hinaus hat das OpenSSH-Format die meisten seiner Metadaten als Textzeichenfolgen und alle Längenfelder sind 4 Bytes lang, während PKCS8 (wie die älteren OpenSSL-Formate) ASN.1 mit variablen Längenfeldern von meist nur 1 Byte und Metadaten meist binär verwendet, insbesondere „OIDs“ für die verwendeten Algorithmen.)

Außerdem: Sind beide austauschbar? Kann ein in dem einen generierter privater Schlüssel in den anderen konvertiert werden?

Ja und nein. Wie erwähnt kann OpenSSH mit OpenSSL PKCS8 lesen (aber nicht schreiben), daher ssh-keygenkann es in OpenSSH-new konvertiert werden, indem eine Nulländerung vorgenommen wird, d. h. das Passwort auf den vorhandenen Wert „geändert“ wird; von 6.5 bis 7.7 müssen Sie angeben -ound ab 7.8 ist dies die Standardeinstellung. In die andere Richtung können Sie in OpenSSL-Legacy konvertieren, aber nicht direkt in PKCS8. Dazu ssh-keygenmüssen Sie entweder explizit mit oder ab 1.0.0 (was mittlerweile jeder und definitiv alle LibreSSL sein sollten) einfach verwenden . (Ersteres ist standardmäßig verschlüsselt und letzteres unverschlüsselt, aber beide können überschrieben werden.)opensslpkcs8 -topk8pkey

verwandte Informationen