fr05t1k / esia

Компонент для авторизации на портале "Госуслуги" (ЕСИА)
http://fr05t1k.github.io/esia
139 stars 67 forks source link

Warning: openssl_pkcs7_sign(): key type not supported in this PHP build! - но всё работает #35

Open fluffycondor opened 3 years ago

fluffycondor commented 3 years ago

Добрый день.

PHP 7.3.19 fr05t1k/esia 2.3.1

Так как используемый нами фреймворк конвертит ворнинги в эксепшны, крашимся в SignerPKCS7 на этой строке:

$signResult = openssl_pkcs7_sign(
     $messageFile,
     $signFile,
     $cert,
     $privateKey,
     []
);

с сообщением Warning: openssl_pkcs7_sign(): key type not supported in this PHP build! Используем нешифрованный приватный ключ.

Приходится оборачивать buildUrl() такими некрасивыми вещами:

$oldErrorReportingLevel = error_reporting(E_ERROR | E_PARSE);
$url = $this->esia->buildUrl();        
error_reporting($oldErrorReportingLevel);

Таким образом всё великолепно работает.

Возможно ли как-то обработать этот ворнинг на уровне вашей библиотеки?

fr05t1k commented 3 years ago

Привет! Я добавил возможности указвать флаги для openssl_pkcs7_sign (https://www.php.net/manual/en/openssl.pkcs7.flags.php).

Попробуй добавить флаг $signer->addPKCS7Flag(PKCS7_NOSIGS) или $signer->addPKCS7Flag(PKCS7_NOVERIFY)

fluffycondor commented 3 years ago

Увы, эффекта не даёт, варнинг на месте. Даже PKCS7_NOVERIFY | PKCS7_NOATTR | PKCS7_NOCERTS | PKCS7_NOCHAIN | PKCS7_NOINTERN

fr05t1k commented 3 years ago

А это секретные ключи? Можешь поделиться?

fluffycondor commented 3 years ago

Я не думаю, что дело в ключах. Скорее всего, дело в связке определенных версий PHP + openssl (у нас это PHP 7.3.19 и OpenSSL 1.1.1d). Глубже я не компетентен - ГОСТовское шифрование настраивал наш девопс с бубнами и матами, из-за этого у нас и лок на PHP 7.3, на 7.4 что-то не заводится. Вот рандомный тестовый серт + ключ, с ним у нас проблема воспроизводится. fam002.zip

fr05t1k commented 3 years ago

Я не встретил проблем с сетификатом и ключем которые в репозитории на: PHP 7.3.19 (cli) (built: Jun 11 2020 19:52:31) ( NTS ) OpenSSL 1.1.1d 10 Sep 2019

С теми что в архиве не завелось с ошибкой: error:0609E09C:digital envelope routines:pkey_set_type:unsupported algorithm

fr05t1k commented 3 years ago

Как вариант можете использовать CLI версию:

  1. Установить пакет gost
  2. Добавить конфиг
  3. Использоать CliSignerPKCS7
fluffycondor commented 3 years ago

А если добавить в конфиг опцию supressPKCS7Warnings и по ее наличию оборачивать openssl_pkcs7_sign в

$oldErrorReportingLevel = error_reporting(E_ALL & ~E_WARNING); // выключает только варнинги
$signResult = openssl_pkcs7_sign(
     $messageFile,
     $signFile,
     $cert,
     $privateKey,
     []
); 
error_reporting($oldErrorReportingLevel);