CURL и ГОСТ

NT Man

Новичок
Итак скомпилировал CURL с поддержкой ГОСТа.

Проверил

$ openssl s_client -connect icrs.nbki.ru:443 -tls1 -debug -msg -state
CONNECTED(00000003)
SSL_connect:before/connect initialization

***
---
New, TLSv1/SSLv3, Cipher is GOST2001-GOST89-GOST89
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : GOST2001-GOST89-GOST89
Session-ID:
Session-ID-ctx:
Master-Key: 6A64655D5A2C2E405076D8E6D58275F9BCE6D698E4377B7F9FB1392A337DD2C797A04A0691A39D326C8EBCD574A69A25
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1358168321
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
kjkjkjk
write to 0x8591398 [0x85a0456] (26 bytes => 26 (0x1A))
0000 - 17 03 01 00 04 38 f9 71-4b 17 03 01 00 0c 15 54 .....8.qK......T
0010 - e0 3f ec 6c f5 27 47 58-48 4c .?.l.'GXHL
read from 0x8591398 [0x859bf03] (5 bytes => 5 (0x5))
0000 - 17 03 01 01 1b .....
read from 0x8591398 [0x859bf08] (283 bytes => 283 (0x11B))
0000 - 9b 12 6c 6b 24 96 90 27-e5 ee ab 82 55 ee 2e ac ..lk$..'....U...
0010 - 5a cb 83 c1 b4 fd 79 a5-f0 94 cf c6 77 fb f1 0b Z.....y.....w...
0020 - bf a3 4a 3d fb 48 df d2-08 04 02 28 1b d7 40 25 ..J=.H.....(..@%
0030 - b7 30 19 bb b7 6a 3d ce-eb f1 d0 d5 91 05 8a 2f .0...j=......../
0040 - 07 f0 a0 ad 4e 3b 65 a4-fb 66 f8 1e 4c 84 9e d1 ....N;e..f..L...
0050 - de eb 25 af df 84 7e 22-be 3e a9 97 3d 0a ae 1c ..%...~".>..=...
0060 - 1d 35 b5 37 58 ac 00 2f-af 35 6e 7d 67 c5 5f 13 .5.7X../.5n}g._.
0070 - b4 94 b8 32 c8 f2 e8 31-68 79 6d 18 af db 8b ec ...2...1hym.....
0080 - 58 b6 2d 03 80 83 2f d4-bc 23 e1 5a b8 73 b2 f9 X.-.../..#.Z.s..
0090 - ce 92 af 96 f5 71 5a fd-3d ae 41 a4 8b cb ed a8 .....qZ.=.A.....
00a0 - 50 4b 1a a3 b6 a2 1f 62-94 67 e5 b2 bf f7 9a 0e PK.....b.g......
00b0 - 35 5d 7b d1 e2 48 34 9d-83 d1 e2 e3 f3 7d 26 65 5]{..H4......}&e
00c0 - 64 83 ab 83 a6 5d 21 67-3d 96 56 43 92 ca 2b 4c d....]!g=.VC..+L
00d0 - 7a e0 3f 28 a8 d0 09 b2-b0 cb 40 c6 69 b6 df 1c z.?([email protected]...
00e0 - 6a 49 d2 c4 ea 31 ca 4d-ea a8 4e c3 47 b6 0a 9d jI...1.M..N.G...
00f0 - fc 43 e5 fc 38 b6 af 85-29 25 1b 27 9f 9b 2d 33 .C..8...)%.'..-3
0100 - ee bf 70 ff 83 93 24 c4-6a a3 a6 32 d5 f0 db 2f ..p...$.j..2.../
0110 - 1d b3 4c f7 98 32 66 99-b9 ed 3f ..L..2f...?
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://icrs.nbki.ru/main">here</a>.</p>
<hr>
<address>Apache/2.2.21 Server at icrs.nbki.ru Port 443</address>
</body></html>
read from 0x8591398 [0x859bf03] (5 bytes => 0 (0x0))
read:errno=0
write to 0x8591398 [0x85a0453] (11 bytes => 11 (0xB))
0000 - 15 03 01 00 06 1c 86 f5-0d b6 0c ...........
>>> TLS 1.0 Alert [length 0002], warning close_notify
01 00
SSL3 alert write:warning:close notify
Как видно подключается.

Но когда обращаюсь из PHP получаю ошибку: Cannot communicate securely with peer: no common encryption algorithm(s).

Почему PHP не работает с ГОСТом??? Разве OpenSSL построен не по модульному принципу? (т е перекомпилил его и все программы его использующие работают с новыми криптографическими движками)

https://docs.google.com/file/d/0B0nwzlfiB4aQVXpNQzRhN091ajQ/edit
 

NT Man

Новичок
Какие настройки OpenSSL используются при работе PHP скрипта?
Чтоб работал ГОСТ я добавил в openssl.cnf следующие строки

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
default_algorithms = ALL
dynamic_path = /usr/lib/openssl/engines/libgost.so
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
Есть подозрение, которое пока не могу никак опровергнуть, что PHP скрипты не используют эту дополнительную настройку.
 

NT Man

Новичок
Итак я нашел решение!

Надо в файле ext/openssl/openssl.c

перед строчкой
SSL_library_init();

добавить
/* needed for use default config */
OPENSSL_config(NULL);

Подсказку дала вот эта тема: http://stackoverflow.com/questions/10959771/openssl-and-gost-engine-issue-statically-linked

Кто сможет мой патчь (неловко даже называть это патчем) протолкнуть в апстрим?


PHP:
*** 111/openssl.c       2012-12-19 12:55:19.000000000 +0600                                                                                                   
--- openssl.c   2013-01-15 18:43:22.000000000 +0600                                                                                                           
***************                                                                                                                                               
*** 1038,1043 ****                                                                                                                                            
--- 1038,1046 ----                                                                                                                                            
        le_x509 = zend_register_list_destructors_ex(php_x509_free, NULL, "OpenSSL X.509", module_number);                                                     
        le_csr = zend_register_list_destructors_ex(php_csr_free, NULL, "OpenSSL X.509 CSR", module_number);                                                   
                                                                                                                                                              
+       /* needed for use default config */                                                                                                                   
+       OPENSSL_config(NULL);                                                                                                                                 
+                                                                                                                                                             
        SSL_library_init();                                                                                                                                   
        OpenSSL_add_all_ciphers();                                                                                                                            
        OpenSSL_add_all_digests();
 

tony2001

TeaM PHPClub
Патч сходу выглядит неправильным - в PHP есть уже чтение конфига openssl.conf (и даже можно указать какой конкретно конфиг читать), см. php_openssl_parse_config() там же.
Лучше всего создать баг, объяснить проблему и дать мне ссылку на него - я назначу его сразу на Пьера, пусть он уже разбирается.
 

tony2001

TeaM PHPClub
Очень желательно добавить короткий (но самодостаточный) код для воспроизведения, это сильно ускорит всё.
 

NT Man

Новичок
В архиве пример для CLI, конфиг openSSL для подключения ГОСТ и spec файл помощью которого в Fedora 18 можно обрать rpm openSSL с поддержкой ГОСТ.

Чтонибудь еще??
 

Вложения

  • 19,6 KB Просмотры: 30

NT Man

Новичок
Еще проблема нарисовалась:
Все что я выше описал работает под CentOS 5, под Fedora 18 не работает нивкакую с PHP
$ openssl s_client -connect icrs.nbki.ru:443 -tls1 -debug -msg -state в обеих операциоках работает.

С права Fedora 18, с лева CentOS 5. Что за SSL версия такая NSS/3.14.0.1 ???
 

Вложения

Вурдалак

Продвинутый новичок
Это заголовки для POST запроса. На самом деле безразницы мы ж тестируем не логику а SSL чтоб соеденялся.
Что это за заголовок такой? Мне лень тестировать, но у тебя результирующий запрос будет либо
Код:
POST /products/B2BRequestServlet HTTP/1.1
Host: icrs.nbki.ru
POST Xml.php HTTP/1.0
content-type:application/octet-stream;charset="windows-1251"
...
либо
Код:
POST Xml.php HTTP/1.0
Host: icrs.nbki.ru
content-type:application/octet-stream;charset="windows-1251"
...
и ни то, ни другое не имеет смысла.
 

NT Man

Новичок
Что это за заголовок такой? Мне лень тестировать, но у тебя результирующий запрос будет либо
и ни то, ни другое не имеет смысла.
Обрати внимание на зануленую переменную $xml через неё передаются все данных, для теста SSL это не нужно.
P.S. на продакшене CentOS 5 + OpenSSL 1.0.1c + PHP 5.4.10 выше приведенный пример, если ГОСТ правильно настроен и применен мой патчь работает.

Получить OpenSSL 1.0.1c c ГОСТ можно тут:
http://rpm.axivo.com/
# yum --enablerepo=axivo update openssl

Получить PHP 5.4.10 можно тут:
http://blog.famillecollet.com/pages/Config-en
 

NT Man

Новичок
Не нужно. Зачем ты тогда это написал?
Да лень было вычищать. Вот теперь очищенный пример. Если ГОСТ работает будет выводить "Ok", в противном случае
PHP Fatal error: Uncaught exception 'Exception' with message 'Cannot communicate securely with peer: no common encryption algorithm(s).' in /home/mikhail/www/labs-nbki/test.php:15
Stack trace:
#0 {main}
thrown in /home/mikhail/www/labs-nbki/test.php on line 15

Fatal error: Uncaught exception 'Exception' with message 'Cannot communicate securely with peer: no common encryption algorithm(s).' in /home/mikhail/www/labs-nbki/test.php:15
Stack trace:
#0 {main}
thrown in /home/mikhail/www/labs-nbki/test.php on line 15
 

Вложения

Airis

Новичок
Установил OpenSSL 1.0.0 с поддержкой ГОСТ. Протестировал openssl - работает.
Тестирование доступа php+curl выдает ошибку:

Connection error. Cause: error:140920F8:SSL routines:SSL3_GET_SERVER_HELLO:unknown cipher returned
Что не так? Нужна ли перекомпиляция curl или php ?
 

NT Man

Новичок
pochta.ru
Установил OpenSSL 1.0.0 с поддержкой ГОСТ. Протестировал openssl - работает.
Тестирование доступа php+curl выдает ошибку:



Что не так? Нужна ли перекомпиляция curl или php ?
Какой дистрибутив?
curl давно уж как перешел на NSS провайдер вместо OpenSSL.
https://bugzilla.redhat.com/show_bug.cgi?id=908069
Соответственно раз curl юзает NSS, а php юзает curl, то GOST в OpenSSL это как мертвому припарка.
Возможные варианты это перекомпилировать curl чтоб он использовал OpenSSL вместо NSS, при этом в PHP придется внести опубликованный мной патч так как PHP почемуто не инитит дефолтный конфиг OpenSSL или поставить всеже криптоПРО и работать через него с его курлом. Второй вариант особенно актуален если у вас сертификаты в формате КриптоПро.
 

Airis

Новичок
Какой дистрибутив?
Характеристики системы такие:

FreeBSD 7.2-RELEASE
OpenSSL 1.0.0k 5 Feb 2013
#curl -V выдает следущее
curl 7.19.4 (i386-portbld-freebsd7.2) libcurl/7.19.4 OpenSSL/0.9.8e zlib/1.2.3
Protocols: tftp ftp telnet dict http file https ftps
Features: IPv6 Largefile NTLM SSL libz
Судя по всему curl использует OpenSSL.

Вот еще информация:
#openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine
#curl --engine list
Build-time engines:
padlock
dynamic
- тут видно, что curl не поддерживает движок gost.

Тут http://sourceforge.net/p/curl/bugs/1208/ написано, что необходимо применить патч, который видимо криво сделан...в общем не получилось.
Если я не ошибаюсь и мой curl в данный момент работает через OpenSSL, то как его заставить увидеть engine GOST?
 
Сверху