CURL и ГОСТ под Windows

Mishall

Новичок
Добрый день.

Не удается заставить работат CURL с ГОСТ-алгоритмом под Windows.
Похожая проблема описывается в соседней теме от 2013 под Nix.

Возникающая ошибка:
error:140920F8:SSL routines:SSL3_GET_SERVER_HELLO:unknown cipher returned

PHP 5.5.27 NTS VC11
CURL 7.42.1
OpenSSL 1.0.1p

Пробовал брать бинарники с CURL 7.43.0 подменой php_curl.dll на libcurl.dll в php.ini и заменой файлов libeay32.dll и ssleay32.dll, но php отказывается распознавать curl-функции - PHP Fatal error: Call to undefined function curl_init()

Судя по тексту исходников 7.43.0 проблема (отказ чтения файла конфигурации openssl.cfg с подключением ГОСТ-алгоритмов) не должна проявляться (lib\vtls\openssl.c), судя по присутствию вызова функции CONF_modules_load_file(NULL, NULL ...


Код:
int Curl_ossl_init(void)
{
  OPENSSL_load_builtin_modules();

#ifdef HAVE_ENGINE_LOAD_BUILTIN_ENGINES
  ENGINE_load_builtin_engines();
#endif

  /* Lets get nice error messages */
  SSL_load_error_strings();

  /* Init the global ciphers and digests */
  if(!SSLeay_add_ssl_algorithms())
    return 0;

  OpenSSL_add_all_algorithms();


  /* OPENSSL_config(NULL); is "strongly recommended" to use but unfortunately
    that function makes an exit() call on wrongly formatted config files
    which makes it hard to use in some situations. OPENSSL_config() itself
    calls CONF_modules_load_file() and we use that instead and we ignore
    its return code! */

  /* CONF_MFLAGS_DEFAULT_SECTION introduced some time between 0.9.8b and
    0.9.8e */
#ifndef CONF_MFLAGS_DEFAULT_SECTION
#define CONF_MFLAGS_DEFAULT_SECTION 0x0
#endif

  CONF_modules_load_file(NULL, NULL,
                        CONF_MFLAGS_DEFAULT_SECTION|
                        CONF_MFLAGS_IGNORE_MISSING_FILE);

  return 1;
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
почему под windows, а не в виртуалке?
пробовал сборку под cygwin?

cipher-ы, алгоритмы, реализует не curl, а ssl-библиотека, обычно openssl, и под win может не быть реализации этого cipher-а. Можно поразбираться с openssl, но без обоснования считаю что нет смысла скрещивать openssl с windows.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
openssl ciphers -v и если там нету госта - для начала добейся, чтобы был
 

AnrDaemon

Продвинутый новичок
Хотя бы ссылочку дай, на каком сайте потренироваться можно.
 

Mishall

Новичок
2 grigori
PHP трудится под IIS 7,
виртуалку под Hyper-V c CentOs стал настраивать параллельно, но столкнулся с проблемами идентификации в сети.

2 fixxxer
для бинарного openssl.exe все работает и gost в списке выводится (на требуемом файле конфигурации *.cnf), требуется найти php_curl.dll или собрать ее самостоятельно из исходников
об ошибках подмены curl (libcurl.dll) уже писал выше

2 AnrDaemon
тесты проводятся пока на локальном сайте

нашел пример компиляции php_curl под Win, но не удалось связаться с автором по вопросам
 

AnrDaemon

Продвинутый новичок
php_curl это расширение PHP.
libcurl - это просто библиотека, ничего о PHP не знающая.
Менять без замены экстеншена только libeay32.dll и ssleay32.dll. Причём только на версии из той же X.Y линейки. Иначе нарвёшься на несовместимость ABI.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
то, что трудится под IIS - это ежу понятно, и это не объясняет зачем использовать php под win/iis
 

Mishall

Новичок
2 AnrDaemon
не удалось найти тех же версий указанные файлы
найденный curl-7.42.1-win32.7z указывает на версии продукта 1.0.2а и версию файла 1.0.2.1, против ранее стоявщих 1.0.1p и 1.0.1.16
на офф.сайте curl под Win присутствуют сборки только 7.40, 7.43 в которых совершенно другие версии указанных файлов

при этом в секции openssl оражается через phpinfo()

OpenSSL support enabled
OpenSSL Library Version OpenSSL 1.0.2a 19 Mar 2015
OpenSSL Header Version OpenSSL 1.0.1p 9 Jul 2015

после замены libeay32.dll и ssleay32.dll версии 1.0.2а возникла ошибка:
error:0609E09C:digital envelope routines:pKEY_SET_TYPE:unsupported algorithm

содержимое файла openssl.cfg успешно отрабатывает при запуске файла openssl.exe с последующим ciphers и найденной строкой gost в перечне

вероятно найденнная сборка curl-openssl так и не читает файл конфигурации при запуске через php_curl.
Догадку подтверждат намеренное внесение ошибок в openssl.cfg, о чем сразу сообщает openssl.exe, а php по-прежнему error:0609E09C:digital...

Подключение расширения php_openssl.dll и вывод списка алгоритмов через php-функции openssl_get_cipher_methods и openssl_get_md_methods() подтверждают отсутствие gost-алгоритма.

Полный набор ошибок OpenSSL, а не только последняя:

error:0B07706F:x509 certificate routines:X509_PUBKEY_get:unsupported algorithm
error:0B06E06C:x509 certificate routines:X509_get_pubkey_parameters:unable to get certs public key
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

2 grigori
под IIS все устраивает + там еще масса других проектов под Net крутится,
с учетом сложностей в решении проблем под Win для это проекта параллельно равернул вирт.машину CentOS 6.6 с предустановленным LAMP
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ну что ж, устраивает - значит, откусывай кактус, ставь visual studio и собирай php под винду со своим курлом
 

AnrDaemon

Продвинутый новичок
2 AnrDaemon
не удалось найти тех же версий указанные файлы
найденный curl-7.42.1-win32.7z указывает на версии продукта 1.0.2а и версию файла 1.0.2.1, против ранее стоявщих 1.0.1p и 1.0.1.16
на офф.сайте curl под Win присутствуют сборки только 7.40, 7.43 в которых совершенно другие версии указанных файлов
OpenSSL можно обновлять в пределах X.Y. Т.е. 1.0.1 можно обновить на любую 1.0.z и всё должно работать. (Исключения есть, но их мало и они обычно неспециальны и проходят по категории "баги, пофиксить срочно".)
С libcurl разбирайся сам. Так же как с php_curl.
 

Mishall

Новичок
2 AnrDaemon
как я понимаю libcurl мне особо не поможет, а php_curl скорее содержит методы работы php с curl, но никак не подключение файла настроек openssl.cfg

2 grigori
речь идет о сборке php_curl.dll из исходников php или (libeay32.dll и ssleay32.dll) из исходников curl ?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Именно libcurl тебе и нужен :) он реализует алгоритмы, а php_curl - адаптер для php.
Речь идет о сборке всего. php_curl собирается из исходников php в привязке к конкретному libcurl
я рассуждаю в соответствии с алгоритмом сборки на линуксе, на винде я никогда не собирал это, и можно ли собрать расширение в привязке к уже собранному curl.dll - не знаю

с учетом количества дней, прошедших с открытия темы, можно смело утверждать, что микросервисом на виртуалке с каким-нибудь boot2docker и 128 мб памяти задача решается в 10 раз быстрее, за один день максимум
 
Последнее редактирование:

Mishall

Новичок
с учетом количества дней, прошедших с открытия темы, можно смело утверждать, что микросервисом на виртуалке с каким-нибудь boot2docker и 128 мб памяти задача решается в 10 раз быстрее, за один день максимум
Вы правы, ранее не собирал расширения PHP и в перерывах между тех.поддержкой не всегда удается уделить достаточной время

1. Если я правильно понял различия между curl и libcurl у меня 2 варианта использования в php:
1) вызов бинарника curl.exe (собрав curl-7.43.0.zip) и из php вызвав shell_exec(...). Т.е. на выходе после сборки пакета получаю curl.exe
2) использовать libcurl (собрав Win32 2000/XP zip 7.40.0 libcurl SSL, потом пересборав php_curl) и из php вызвав curl_init() и т.д. Т.е. на выходе после 2-х сборок пакетов получаю (libeay32.dll, ssleay32.dll), php_curl

как я понимаю исходники curl и libcurl одинаковы и после сборки берем нужные файлы

правда не совсем понимаю смысл компиляции, если судя по исходникам ошибки возникать не должно. судя по записям в Интернет проявлялась ошибка на ранних версиях curl пару лет назад.

2. На понимание, нашел под Win бинарный curl.exe, который поддерживает ГОСТ
проверка curl --engine list выводит
Build-time engines:
dynamic
4758cca
aep
atalla
cswift
chil
nuron
sureware
ubsec
padlock
gost
capi
При этом запуск в ком.строке
выводит ошибку
curl: (35) error:0609E09C:digital envelope routines:pKEY_SET_TYPE:unsupported al
gorithm
запросы на страндартные https, например ya.ru проходят
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Confirmed.
Код:
$ openssl s_client -connect zakupki.gov.ru:443
CONNECTED(00000003)
depth=0 C = RU, ST = \D0\B3. \D0\9C\D0\BE\D1\81\D0\BA\D0\B2\D0\B0, L = \D0\9C\D0\BE\D1\81\D0\BA\D0\B2\D0\B0, O = \D0\9E\D0\9E\D0\9E \"\D0\9E\D0\9D\D0\9B\D0\90\D0\9D\D0\A2\D0\90\", OU = \D1\81\D0\BB\D1\83\D0\B6\D0\B1\D0\B0 \D0\B8\D0\BD\D1\84\D0\BE\D1\80\D0\BC\D0\B0\D1\86\D0\B8\D0\BE\D0\BD\D0\BD\D0\BE\D0\B9 \D0\B1\D0\B5\D0\B7\D0\BE\D0\BF\D0\B0\D1\81\D0\BD\D0\BE\D1\81\D1\82\D0\B8, GN = gov.ru, SN = zakupki., title = \D0\A0\D1\83\D0\BA\D0\BE\D0\B2\D0\BE\D0\B4\D0\B8\D1\82\D0\B5\D0\BB\D1\8C \D0\A1\D0\98\D0\91, CN = zakupki.gov.ru
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = RU, ST = \D0\B3. \D0\9C\D0\BE\D1\81\D0\BA\D0\B2\D0\B0, L = \D0\9C\D0\BE\D1\81\D0\BA\D0\B2\D0\B0, O = \D0\9E\D0\9E\D0\9E \"\D0\9E\D0\9D\D0\9B\D0\90\D0\9D\D0\A2\D0\90\", OU = \D1\81\D0\BB\D1\83\D0\B6\D0\B1\D0\B0 \D0\B8\D0\BD\D1\84\D0\BE\D1\80\D0\BC\D0\B0\D1\86\D0\B8\D0\BE\D0\BD\D0\BD\D0\BE\D0\B9 \D0\B1\D0\B5\D0\B7\D0\BE\D0\BF\D0\B0\D1\81\D0\BD\D0\BE\D1\81\D1\82\D0\B8, GN = gov.ru, SN = zakupki., title = \D0\A0\D1\83\D0\BA\D0\BE\D0\B2\D0\BE\D0\B4\D0\B8\D1\82\D0\B5\D0\BB\D1\8C \D0\A1\D0\98\D0\91, CN = zakupki.gov.ru
verify error:num=21:unable to verify the first certificate
verify return:1
2283136:error:0609E09C:digital envelope routines:PKEY_SET_TYPE:unsupported algorithm:p_lib.c:231:
2283136:error:0B07706F:x509 certificate routines:X509_PUBKEY_get:unsupported algorithm:x_pubkey.c:148:
2283136:error:140900EF:SSL routines:ssl3_get_server_certificate:unable to find public key parameters:s3_clnt.c:1297:
---
Certificate chain
 0 s:/C=RU/ST=\xD0\xB3. \xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0/L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0/O=\xD0\x9E\xD0\x9E\xD0\x9E "\xD0\x9E\xD0\x9D\xD0\x9B\xD0\x90\xD0\x9D\xD0\xA2\xD0\x90"/OU=\xD1\x81\xD0\xBB\xD1\x83\xD0\xB6\xD0\xB1\xD0\xB0 \xD0\xB8\xD0\xBD\xD1\x84\xD0\xBE\xD1\x80\xD0\xBC\xD0\xB0\xD1\x86\xD0\xB8\xD0\xBE\xD0\xBD\xD0\xBD\xD0\xBE\xD0\xB9 \xD0\xB1\xD0\xB5\xD0\xB7\xD0\xBE\xD0\xBF\xD0\xB0\xD1\x81\xD0\xBD\xD0\xBE\xD1\x81\xD1\x82\xD0\xB8/GN=gov.ru/SN=zakupki./title=\xD0\xA0\xD1\x83\xD0\xBA\xD0\xBE\xD0\xB2\xD0\xBE\xD0\xB4\xD0\xB8\xD1\x82\xD0\xB5\xD0\xBB\xD1\x8C \xD0\xA1\xD0\x98\xD0\x91/CN=zakupki.gov.ru
   i:/[email protected]/street=\xD1\x83\xD0\xBB. \xD0\x98\xD0\xBB\xD1\x8C\xD0\xB8\xD0\xBD\xD0\xBA\xD0\xB0 \xD0\xB4.7/L=\xD0\xB3. \xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0/unstructuredName=\xD0\x94\xD0\xB0\xD0\xBD\xD0\xBD\xD1\x8B\xD0\xB9 \xD1\x81\xD0\xB5\xD1\x80\xD1\x82\xD0\xB8\xD1\x84\xD0\xB8\xD0\xBA\xD0\xB0\xD1\x82 \xD0\xBE\xD1\x82\xD0\xBA\xD1\x80\xD1\x8B\xD1\x82\xD0\xBE\xD0\xB3\xD0\xBE \xD0\xBA\xD0\xBB\xD1\x8E\xD1\x87\xD0\xB0 \xD0\xB8\xD1\x81\xD0\xBF\xD0\xBE\xD0\xBB\xD1\x8C\xD0\xB7\xD1\x83\xD0\xB5\xD1\x82\xD1\x81\xD1\x8F \xD1\x81\xD0\xBE \xD1\x81\xD1\x80\xD0\xB5\xD0\xB4\xD1\x81\xD1\x82\xD0\xB2\xD0\xBE\xD0\xBC \xD0\xA1\xD0\x9A\xD0\x97\xD0\x98 \xD0\x9A\xD1\x80\xD0\xB8\xD0\xBF\xD1\x82\xD0\xBE \xD0\x9F\xD1\x80\xD0\xBE CSP/C=RU
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 1523 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1438992135
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
так собирай курс с тем openssl, который работает с твоим гостом,
или вызывай щзутыыд командной строкой, открывай туннель, и дальше уже через сокет делай http-запросы,
есть реализация работы с http через сокеты в разных библиотеках на php

ты вопросы задай - что именно тебе подсказать? собирать курл под виндой мы не будем
 
Последнее редактирование:

Mishall

Новичок
работающий openssl у меня в виде бинарника и набора dll, собрать с этим curl не получится
пока собираю curl под windows из исходников, не все гладко с win sdk и потребуется время на правку всех ошибок

вопросов пока нет, сообщу о результатах сборки и поделюсь бинарниками, если кому потребуется реализация аналогичной задачи )
 
Сверху