Первое: openssl_pkey_get_public
предназначено либо для прямой загрузки c ключа непосредственно , либо извлечения его из сертификата, как описано в документации параметра certificate
openssl_pkey_get_public
.
Для этой проблемы уже зарегистрировано сообщение об ошибке # 75643 от De c 2017 (версия 7.1.12), которое имеет статус Нет обратной связи и в настоящее время приостановлено (обратите внимание, что # 75643 фактически ссылается на openssl_public_encrypt
, который, однако, использует тот же лог c относительно ключа, что и openssl_pkey_get_public
, здесь ):
Ожидается ошибка в очереди. Если вы предоставляете строку как PEM (строка без префикса «file: //», которая будет являться путем к файлу), тогда сначала проверяется сертификат (с использованием PEM_ASN1_read_bio). Это означает, что произошел сбой, и ошибка сохраняется в очереди. Однако эта очередь является просто копией OpenSSL, которая очищается. После этого ключ загружается с использованием PEM_read_bio_PUBKEY, что успешно в вашем случае, поэтому вы получите результат. Подводя итог, можно сказать, что openssl_error_string не означает, что операция завершилась неудачно, а просто что была выдана какая-то ошибка ...
. В соответствии с этим сообщение об ошибке вызвано невозможностью извлечь ключ из сертификата. , Однако обработка продолжается и ключ загружается напрямую. Другими словами, сообщение об ошибке появляется, как и ожидалось, при загрузке ключа напрямую и может быть проигнорировано в этом контексте (по крайней мере, если прямая загрузка прошла успешно).
Для записей: As из 7.2 (.17), отображается немного другое сообщение об ошибке: ошибка: 0909006 C: процедуры PEM: get_name: нет начальной строки .
Обновление:
Как отметил @President James Moveon Polk в своем комментарии, createPemFromModulusAndExponent
неправильно генерирует ключ. Если первый / самый значимый байт больше 0x7F
, модулю должен предшествовать 0x00
байт, чего в настоящее время не происходит. Например, в опубликованном коде модуль начинается (декодируется Base64url) с 0x88
, что означает, что сгенерированный (= опубликованный) ключ недействителен. Если 0x00
добавляется вручную и значение с таким исправлением (в кодировке Base64url) передается в createPemFromModulusAndExponent
, то следующие, теперь действительные ключевые результаты:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiGaLqP6y+SJCCBq5Hv6p
GDbG/SQ11MNjH7rWHcCFYz4hGwHC4lcSurTlV8u3avoVNM8jXevG1Iu1SY11qInq
UvjJur++hghr1b56OPJu6H1iKulSxGjEIyDP6c5BdE1uwprYyr4IO9th8fOwCPyg
jLFrh44XEGbDIFeImwvBAGOhmMB2AD1n1KviyNsH0bEB7phQtiLk+ILjv1bORSRl
8AK677+1T8isGfHKXGZ/ZGtStDe7Lu0Ihp8zoUt59kx2o9uWpROkzF56ypresiIl
4WprClRCjz8x6cPZXU2qNWhu71TQvUFwvIvbkE1oYaJMb0jcOTmBRZA2QuYw+zHL
wQIDAQAB
-----END PUBLIC KEY-----
Конечно, это было бы лучше, если бы createPemFromModulusAndExponent
сделал это исправление автоматически. @ Президент Джеймс Мовеон Полк подал заявку на это, здесь .