Сообщение об ошибке
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), его отклоняют; сначала нужно извлечь ключ.
Ключ OpenSSH там, где ожидается PEM
частоОднострочные записи «ecdsa-sha2-nistp256 AAAA... user@host» (формат authorized_keys) — это собственная кодировка OpenSSH, а не PEM/DER. 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.
Извлеките ключ из сертификата
Одна команда выдаёт открытый ключ SPKI в формате PEM, который ожидают команды с -pubin.
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 как стандартный открытый ключ PEM с меткой BEGIN PUBLIC KEY (SPKI); в 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