Стоит задача: интегрировать ФСГ.
Запрос ФСГ представляет из себя подписанное XML сообщение, которое шлётся через сокет поTLS1.0 и шифруется по ГОСТ.
Последний затык, который никак не удаётся победить:
SSL operation failed with code 1. OpenSSL Error messages: error:1409017F:SSL routines:ssl3_get_server_certificate:wrong certificate type
Сокет создаётся следующим образом:
$context = stream_context_create(
array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
// 'local_cert' => 'client_ssl.pem',
// 'cafile' => 'cryptopro.cer',
// 'local_pk' => 'nocerts.pem',
'allow_self_signed' => true,
// 'ciphers' => 'aGOST:kGOST:aGOST01:GOST94:GOST89MAC:ALL',
// 'disable_compression' => true
)
)
);
$socket = stream_socket_client($hostname.':'.$port, $errno, $errstr, 60,
STREAM_CLIENT_CONNECT, $context);
if (!$socket) {
die("Не могу соединиться: $errstr ($errno)");
}
if ($socket) {
fwrite($socket, $xml);
}
Если раскомментировать 'ciphers' =>..., то ошибки не будет, но и сервера не дружат. Т.е. с моей стороны пакеты уходят, а на стороне ФСГ они не воспринимаются.
Разработка ведётся на виндовой машине, PHP5.6.15, Apache/2.4.17 (Win32), OpenSSL/1.0.2d
Вопрос таков: занимались ли вы подключением к ФСГ? Если да, то совет по реализации будет очень кстати. А если нет, то может быть есть идеи что не так?
Есть приложение, написанное на C++, которое работает. Но оно требует КриптоПро и еще кучу каких-то библиотек.
Мониторил передаваемые данные с помощью сниффера. Сравнивал то, что передаёт эталонное приложение с тем, что выдаёт PHP.
Handshake проходит одинаково, а вот с передаваемыми данными что-то не то.
- эталон:
00000000
17 03 01 00 08 5B 8D 89 B6 B4 15 2D 1C 17 03 01 .....[Ќ‰ ¶ґ.-....
00000010 3F FF DE BE DC 3B 24 04 3E B2 3D AD AC A3 04 0D ?яЮѕЬ;$. >І=¬Ј..
- PHP:
00000000
17 03 01 00 04 37 EF 7A 68 17 03 01 18 60 25 F6 .....7пz h....`%ц
00000010 73 6E 88 39 2C 7C 94 11 96 3A 9C 18 F9 03 4B 4F sn€9,|”. –:њ.щ.KO
Выделенный блок содержит размер передаваемых данных. В обоих случаях размер одинаков. В первом случае блок 8байт(00 08), во втором 4(00 04).