@SergioMadness

Как интегрировать федеральную систему город (socket, php)?

Стоит задача: интегрировать ФСГ.
Запрос ФСГ представляет из себя подписанное 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).
  • Вопрос задан
  • 344 просмотра
Пригласить эксперта
Ответы на вопрос 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы