本文へスキップ
ecdsa.com

OpenSSH の秘密鍵形式

OpenSSH 7.8(2018年)以降、ssh-keygen がデフォルトで書き出す openssh-key-v1 コンテナで、-----BEGIN OPENSSH PRIVATE KEY----- として保存され、パスフレーズを設定すると bcrypt ベースの KDF で暗号化されます。
別表記BEGIN OPENSSH PRIVATE KEYopenssh-key-v1PROTOCOL.key

OpenSSH の PROTOCOL.key で規定されています。マジック文字列 openssh-key-v1 とゼロバイト、暗号名(none または aes256-ctr)、KDF 名(none または bcrypt)とソルトおよびラウンド数(デフォルトは 16 で、ssh-keygen -a で増やせます)、公開鍵、そして暗号化されたセクションが続きます。このセクションには、同じ値を 2 回並べたチェック用の整数(誤ったパスフレーズを検出するため)、秘密鍵、コメントが入ります。Ed25519 鍵は当初からこの形式を使っており、7.8 以降は -m PEM を指定しない限り RSA 鍵と ECDSA 鍵もこの形式を使います。

古いライブラリやツールは PEM(PKCS #1、SEC 1、PKCS #8)しか読めません。初期の JSch、一部の CI サービス、標準の鍵仕様クラスを使う Java のコードは、invalid privatekey などのエラーで失敗します。ssh-keygen -p -m PEM -f key(ファイルをその場で書き換えます)で変換するか、ssh-keygen -e -m PKCS8 で公開鍵をエクスポートしてください。公開鍵は 1 行の type base64 comment 形式のままです。

規格と参考文献

すべての用語