エラーメッセージ
unable to load Public Key
OpenSSL 1.1.x の文言で、現在も最もよく引用される形です。OpenSSL 3.0 は「Could not read key of Public Key from cert.pem」、OpenSSL 3.5 以降は「Could not find private key of Public Key from cert.pem」と出力します(3.0.2 と 3.6.4 で再現)。失敗の内容は同じで、文言だけが新しくなっています。
このエラーの意味
openssl コマンドは、指定されたファイルから公開鍵を読み込もうとしましたが、公開鍵と認識できるものを見つけられませんでした。ファイルは存在しており、問題はその内容です。別の種類のオブジェクト(証明書、秘密鍵、SSH 鍵)であるか、エンコーディングが違うか、そもそも鍵ではないかのいずれかです。
発生する理由
ファイルが鍵そのものではなく証明書
よくある「-----BEGIN CERTIFICATE-----」は X.509 証明書であり、公開鍵を含んではいますが、公開鍵そのものではありません。素の SPKI を想定するコマンド(-pubin)はこれを拒否するため、先に鍵を取り出す必要があります。
PEM が想定される場所に OpenSSH の鍵を渡している
よくある「ecdsa-sha2-nistp256 AAAA... user@host」という 1 行のエントリ(authorized_keys 形式)は、PEM/DER ではなく OpenSSH 独自のエンコーディングです。OpenSSL は、変換しない限りこれを読み込めません。
-pubin を付けて秘密鍵を渡している
よくある-pubin フラグは、入力が公開鍵であることを宣言するものです。OpenSSL 1.1 と 3.0 は、このフラグが付いていると「-----BEGIN PRIVATE KEY-----」を拒否します。フラグを外すか、先に公開鍵部分を導出してください。(OpenSSL 3.5 以降は、代わりに公開鍵部分を黙って読み込みます。)
DER ファイルを PEM として読み込んでいる
ときどきOpenSSL 1.1 では、バイナリの .der/.cer ファイルに -inform der が必要です。バイナリデータを PEM として解析しても BEGIN 行が見つからず、失敗するためです。OpenSSL 3 は DER を自動的に判別します。
修正方法
- 1.
証明書から鍵を取り出す
1 つのコマンドで、-pubin を使うコマンドが想定する SPKI 形式の公開鍵 PEM を生成できます。
bash openssl x509 -in cert.pem -pubkey -noout > pubkey.pem openssl pkey -pubin -in pubkey.pem -noout -text # now loads - 2.
OpenSSH の鍵を PEM に変換する
ssh-keygen は、authorized_keys 形式のエントリを標準的な BEGIN PUBLIC KEY(SPKI)の PEM としてエクスポートできます。ssh-keygen では、この形式を PKCS8 と呼びます。
bash ssh-keygen -f id_ecdsa.pub -e -m pkcs8 > pubkey.pem - 3.
秘密鍵から公開鍵部分を導出する
ファイルが実際には秘密鍵である場合は、-pubin を使わずに公開鍵を導出してください。
bash openssl pkey -in private.pem -pubout -out pubkey.pem