Сообщение об ошибке
Valid PEM but no BEGIN PUBLIC KEY/END PUBLIC KEY delimiters. Are you sure this is a public key?
Python cryptography — ValueError from load_pem_public_key
Что это означает
Файл — корректный PEM (обрамление разбирается), но его метка не PUBLIC KEY. Вы передали в load_pem_public_key закрытый ключ, сертификат или CSR. Библиотека буквально спрашивает, ту ли функцию загрузки вы выбрали для этого объекта.
Почему это происходит
Закрытый ключ передан функции загрузки открытых ключей
частоДля блоков закрытых ключей BEGIN PRIVATE KEY / BEGIN EC PRIVATE KEY нужна load_pem_private_key. Так часто бывает, когда один параметр конфигурации («ключ») обслуживает участки кода, которым на самом деле нужны разные половины пары.
Сертификат там, где ожидается голый ключ
частоBEGIN CERTIFICATE содержит открытый ключ внутри структуры X.509. Сначала его нужно загрузить как сертификат, а затем извлечь ключ: метка PEM подсказывает, какой парсер отвечает за этот объект.
Экзотические, но допустимые метки
редкоОбъекты вроде запроса на сертификат BEGIN CERTIFICATE REQUEST (CSR) или ключа в формате OpenSSH, вставленного в файл .pem, тоже не проходят эту проверку: для каждого есть своя функция загрузки, или его нужно преобразовать.
Как исправить
- 1.
Получите открытый ключ из того, что у вас есть
Из любого контейнера с ключевым материалом открытый ключ можно получить одним дополнительным вызовом.
python from cryptography.hazmat.primitives.serialization import ( load_pem_private_key, load_pem_public_key) from cryptography.x509 import load_pem_x509_certificate first = pem.splitlines()[0] if b"PRIVATE KEY" in first: public_key = load_pem_private_key(pem, password=None).public_key() elif b"CERTIFICATE" in first: public_key = load_pem_x509_certificate(pem).public_key() else: public_key = load_pem_public_key(pem) - 2.
Один раз экспортируйте правильный SPKI
Если системе постоянно нужен голый открытый ключ, создайте канонический файл BEGIN PUBLIC KEY и храните его.
bash openssl pkey -in private.pem -pubout -out public.pem # from a private key openssl x509 -in cert.pem -pubkey -noout > public.pem # from a certificate - 3.
Называйте файлы по содержимому
Половина таких ошибок — ошибки в организации файлов, а не в коде: server.pem, в котором склеены ключ, сертификат и цепочка, или public.pem, полученный копированием вывода не той команды. Храните по одному объекту в файле и указывайте тип объекта в имени (orders-es256-public.pem) — и весь этот класс ошибок с неподходящей функцией загрузки исчезнет из кодовой базы.