Вопрос или проблема
Я изменил версию PHP на PHP 8.3 на платформе Google App Engine и заметил, что Google изменил версию OpenSSL, при этом поддержка устаревших функций по умолчанию отключена.
Я использую файл .p12, созданный в Windows, и когда я попытался вызвать openssl_pkcs12_read, появляется ошибка “error:0308010C:digital envelope routines::unsupported”.
Могу ли я включить поддержку устаревших функций?
Я пытался найти другую функцию PHP в качестве замены, а также искал некоторые параметры конфигурации php.ini.
Ответ или решение
Для решения вашей проблемы с использованием PHP 8.3 на платформе Google App Engine и поддержки OpenSSL Legacy, вам потребуется выполнить следующие шаги.
1. Понимание проблемы
Ошибка "error:0308010C:digital envelope routines::unsupported" связана с изменением поведения OpenSSL в версиях, начиная с 3.0. В этой версии поддержки устаревших функций шифрования по умолчанию отключена. Это влияет на функции PHP, которые зависят от этих устаревших методов, таких как openssl_pkcs12_read
для обработки файлов .p12.
2. Включение поддержки Legacy в OpenSSL
OpenSSL предоставляет опцию для включения поддержки Legacy, однако данная опция не всегда доступна в стандартной сборке PHP. Проверьте, поддерживает ли ваш веб-сервер использование пользовательского php.ini для установки параметров OpenSSL. Если вы можете его модифицировать, добавьте следующую строку в ваш php.ini:
openssl.cafile="/path/to/cacert.pem"
3. Изменение кода
Если изменение php.ini не доступно или не решает проблему, вам нужно использовать альтернативные подходы для работы с файлами .p12. Например, вы можете воспользоваться сторонними библиотеками, такими как:
- phpseclib – это библиотека для работы с криптографией, которая поддерживает более старые форматы файлов.
4. Установка phpseclib
Для установки phpseclib
, используйте Composer:
composer require phpseclib/phpseclib
Затем вы можете использовать библиотеку для работы с .p12
файлами:
use phpseclib3\File\PKCS12;
$p12Path = '/path/to/your/file.p12';
$password = 'your_password'; // если у файла есть пароль
try {
$p12 = PKCS12::load($p12Path, $password);
// Теперь вы можете использовать данные из $p12
var_dump($p12);
} catch (\Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
5. Заключение
Если вам необходимо использовать функции OpenSSL, которые больше не поддерживаются, используйте альтернативные библиотеки, как указано выше. Временно включить Legacy поддержку может быть невозможно в вашей среде, и использование сторонних решений часто является более надежным и безопасным вариантом.
Как альтернатива, вы можете рассмотреть возможность выполнения вашей PHP-скриптной логики на локальной машине с установленной более старой версией PHP и OpenSSL, а затем развернуть уже обработанные данные на Google App Engine.
Это даст вам гибкость при обработке криптографических операций, которые требуют устаревших функций.