Перейти к содержимому
ecdsa.com
Python cryptographyPython: пакет cryptography

Сообщение об ошибке

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. Библиотека буквально спрашивает, ту ли функцию загрузки вы выбрали для этого объекта.

Почему это происходит

Как исправить

  1. 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. 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. 3.

    Называйте файлы по содержимому

    Половина таких ошибок — ошибки в организации файлов, а не в коде: server.pem, в котором склеены ключ, сертификат и цепочка, или public.pem, полученный копированием вывода не той команды. Храните по одному объекту в файле и указывайте тип объекта в имени (orders-es256-public.pem) — и весь этот класс ошибок с неподходящей функцией загрузки исчезнет из кодовой базы.

Связанные ошибки

Открыть всю базу ошибок подписей