cURL PHP Windows ГОСТ2012

gremline

Новичок
Добрый день. Это мой первый пост на данном ресурсе. Помогите, пожалуйста, решить проблему. Под Windows запущен Open Server (5.2.2) - PHP 5.5, Apache 2.4+Nginx 1.10, openSSL 1.0.2l. С помощью cURL отправляю запрос POST на https (сервер использует шифрование ГОСТ 2012):

Код:
$postData = array(
    "document" => ""
);
$myCurl = curl_init('https://.....');
curl_setopt_array($myCurl, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Accept: application/json',
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => json_encode($postData)
));
Приходит ответ от сервера: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Пробовал так:

Код:
$postData = array(
    "document" => ""
);
$myCurl = curl_init('https://.....');
curl_setopt_array($myCurl, array(
    CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_0,
    CURLOPT_SSLCERT => путь к сертификату, использумый сервером,
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Accept: application/json',
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => json_encode($postData)
));
Ответ от сервера: could not load PEM client certificate, OpenSSL error error:0609E09C:digital envelope routines:pKEY_SET_TYPE:unsupported algorithm, (no key found, wrong pass phrase, or wrong file format?)

Через Internet Explorer ошибок нет. Через Chrome - ошибка ERR_SSL_VERSION_OR_CIPHER_MISMATCH. В чем может быть проблема?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Проверяйте openssl_get_cipher_methods()/openssl_get_md_methods(). И, да, если вам нужен GOST под Windows, скорее всего, придётся компилировать его самим.
 

gremline

Новичок
Скачал OpenSSL 1.1.1b - gost с поддержкой гост. Через конфиг подцепил gostengy.dll . При просмотре через консоль OpenSSL в ciphers появился GOST2012-GOST8912-GOST8912.

Как заставить php использовать эту версию OpenSSL ?
 

AnrDaemon

Продвинутый новичок
Во-первых скачайте новую версию, 1.1.1b имеет известные критические уязвимости.
 

gremline

Новичок
Установил Open Server на чистую винду. Выбрал модуль Apache 2.4+Nginx 1.17, PHP 7.2. В составе OpenSSL 1.1.1d. Попробовал тот же скрипт
Код:
$postData = array(
    "document" => ""
);
$myCurl = curl_init('https://.....');
curl_setopt_array($myCurl, array(
    CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_0,
    CURLOPT_CAINFO => путь к сертификату, использумый сервером,
    CURLOPT_CERTINFO => TRUE,
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Accept: application/json',
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => json_encode($postData)
));
Все заработало, ответ от сервера пришел. В первых вариантах использовал CURLOPT_SSLCERT для указания пути к сертификату сервера. Понял ошибку - исправил на CURLOPT_CAINFO. Пробовал другие версии PHP в составе OpenServer - соединение устанавливается только если OpenSSL версия 1.1.0 или выше.

При этом openssl_get_cipher_methods() не показывает GOST вообще, а в openssl_get_md_methods() присутствует GOST 31.11-2012.

Сторонние dll для ГОСТ не подключал.
 
Последнее редактирование:

gremline

Новичок
Пробовал собрать PHP 5.5 через Visual Studio 2012. Визульно набор файлов в собранной версии сильно отличается от набора в составе OpenServer (думал просто заменю папку с PHP). Надо разбираться с конфигурацией во время сборки. Позже займусь этим вопросом.
 
Сверху