Проблема, похоже, связана с шифрованием ключа: ключ не может быть прочитан с помощью PemReader
, если опция -v2prf hmacWithSHA1
не установлена, когда ключ зашифрован.
Опция -v2prf
существует начиная с V1.1.0 и задает алгоритм PRF (псевдослучайная функция), используемый с PKCS # 5 v2.0 или ключом деривационная функция PBKDF2 .
Случай 1: создание нового ключа
Следующие два оператора создают и шифруют ключ:
openssl ecparam -name secp256r1 -genkey -noout -out <out-path>
openssl pkcs8 -topk8 -v2 aes256 -v2prf hmacWithSHA1 -in <in-path> -out <out-path> // aes256 as of OpenSSL 1.1.0 inclusive
Сгенерированный таким образом ключ может быть успешно прочитан с помощью PemReader
. Однако, если опция -v2prf hmacWithSHA1
отсутствует, генерируется исключение.
Случай 2. Исправление уже сгенерированного ключа
Следующий оператор расшифровывает уже зашифрованный ключ :
openssl pkcs8 -topk8 -nocrypt -in <in-path> -out <out-path>
Если ключ впоследствии зашифрован с установленным параметром -v2prf hmacWithSHA1
(см. Выше), ключ можно успешно прочитать с помощью PemReader
. Таким образом, я смог исправить опубликованный ключ, чтобы его можно было прочитать с помощью PemReader
!
Возможное (к сожалению, только поверхностное) объяснение может быть найдено в документации openssl pkcs8
. Там можно прочитать о параметре -v2prf
:
Некоторые реализации могут не поддерживать пользовательские алгоритмы PRF и могут требовать, чтобы для работы работала опция hmacWithSHA1.
Интересно, что критические ключи можно без проблем прочитать, используя ECDsa#ImportEncryptedPkcs8PrivateKey
from. NET Core 3.x. Для полного объяснения, вероятно, понадобится заглянуть в исходный код.