Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ibz  
#1 Оставлено : 4 июня 2020 г. 12:18:16(UTC)
ibz

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.08.2019(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 3 раз в 2 постах
Итак предыстория.
Есть МИС, на линуксе. путем долгого выпиливания лобзиком удалось там поднять и крипто про и phpcades.
В прошлом году даже удалось победить ФСС с их больничными, но на некоторое время пришлось криптопро отложить в сторонку и заняться другими делами.
Есть такая штука как МДЛП и его надо внедрять, согласно api https://честныйзнак.рф/u...ysnogo-urovnya-v3.07.pdf
Первый этап там получение кода (который успешно проходится) и затем этот полученный код, надо подписать своим сертификатом.
Есть краткая инструкция по быстрому началу https://честныйзнак.рф/u..._dlya_izucheniya_API.pdf
по этой инструкции с помощью утилит командной строки подпись создается вообще без проблем

/opt/cprocsp/bin/amd64/csptest -sfsign -sign -in code.txt -my 7ecf3608182fb033f2140f761e9be89e5472408d -base64 -detached -out signed_code.txt -add

а вот из php начинаются проблемы
набросал такой скрипт для проверки

Код:

#!/usr/bin/php

<?php

    function FindCertbySHA1HASH($sha1_hash)
    {
        $store = new CPStore();
        $store->Open(CURRENT_USER_STORE, "my", STORE_OPEN_READ_ONLY);
        $certs = $store->get_Certificates();

        for($i = 1; $i <= $certs->Count(); $i++)
        {
            if(strtoupper($certs->Item($i)->get_Thumbprint()) == strtoupper($sha1_hash))
            {
                return $certs->Item($i);
            }
        }
        return null;
    }

    $code = "5937b53c-73f4-4411-9b78-a39851c3954e";
    $cert = FindCertbySHA1HASH('7ecf3608182fb033f2140f761e9be89e5472408d');

    $signer = new CPSigner();
    // $address = "http://cryptopro.ru/tsp/tsp.srf ";
    // $signer->set_TSAAddress($address);
    $signer->set_Certificate($cert);
    var_dump( $signer->get_Certificate()->get_SubjectName());
    var_dump( $signer->get_Certificate()->get_ValidFromDate());
    var_dump( $signer->get_Certificate()->get_ValidToDate());

    $sd = new CPSignedData();
    $sd->set_Content($code);

    try
    {
        $signature = $sd->Sign($signer, true, 0);
        echo "Signature is:\n".$signature;
    }
    catch (Exception $e)
    {
        echo $e->getMessage()."\n";
    }
?>


выводит

Код:
string(364) "OGRN=1142130007..... и т.д.""
string(19) "20.02.2020 06:17:46"
string(19) "20.02.2021 06:27:46"
No TSP Client license has been entered or TSP Client license is expired. (0xC2100140)


посмотрел, видимо это какая то встроенная и она закончилась
Код:
[root@bars2 amd64]# ./tsputil license
Type of license is : Standard
Duration : 28.11.2019 (Expired)
[ReturnCode: 0x00000000]

но ведь консольные утилиты работают, им это не мешает делать подпись?
Offline Андрей *  
#2 Оставлено : 4 июня 2020 г. 12:33:41(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,691
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Здравствуйте.

Так у Вас в реальном коде - есть использование TSP или нет?
В примере - "закомментировано".
Техническую поддержку оказываем тут
Наша база знаний
Offline ibz  
#3 Оставлено : 4 июня 2020 г. 12:51:24(UTC)
ibz

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.08.2019(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 3 раз в 2 постах
Автор: Андрей * Перейти к цитате
Здравствуйте.

Так у Вас в реальном коде - есть использование TSP или нет?
В примере - "закомментировано".


и с комментированным и раскомментированным кодом поведение одинаковое. По идее не нужен же он мне. Но почему то запрашивался.

P.S.
Какой же все-таки хороший форум - не успели мне ответить, а я сумел подобрать ответ. Сейчас напишу в следующем сообщении
Offline ibz  
#4 Оставлено : 4 июня 2020 г. 13:11:39(UTC)
ibz

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.08.2019(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 3 раз в 2 постах
Автор: ibz Перейти к цитате
Итак предыстория.
Есть МИС, на линуксе. путем долгого выпиливания лобзиком удалось там поднять и крипто про и phpcades.
В прошлом году даже удалось победить ФСС с их больничными, но на некоторое время пришлось криптопро отложить в сторонку и заняться другими делами.
Есть такая штука как МДЛП и его надо внедрять, согласно api https://честныйзнак.рф/u...ysnogo-urovnya-v3.07.pdf
Первый этап там получение кода (который успешно проходится) и затем этот полученный код, надо подписать своим сертификатом.
Есть краткая инструкция по быстрому началу https://честныйзнак.рф/u..._dlya_izucheniya_API.pdf



Итак. Удалось подобрать правильные параметры для того чтобы правильно составить подпись, и мне удалось получить токен
Я попробовал вместо метода Sign использовать SignCades
добавил в конец скрипта кусок кода

Код:

    foreach( array(0, 1, 5, 0x5D, 0xFFFF) as $cades_type )  // соответствуют константам   CADES_DEFAULT, CADES_BES, CADES_T, CADES_X_LONG_TYPE_1, PKCS7_TYPE
    {
        try
        {
            echo "\nCADES_TYPE = $cades_type\n";
            $signature = $sd->SignCades($signer, $cades_type, true, 0);
            echo "Signature is:\n".$signature;
        }
        catch (Exception $e)
        {
            echo $e->getMessage()."\n";
        }
    }

выяснил что один из типов подписей ( CADES_BES ) не требует TSP
далее родился кусок кода который дал в итоге получить мне токен
привожу для тех кто тоже будет пытаться подружиться с мдлп

Код:

<?php

    function FindCertbySHA1HASH($sha1_hash)
    {
        $store = new CPStore();
        $store->Open(CURRENT_USER_STORE, "my", STORE_OPEN_READ_ONLY);
        $certs = $store->get_Certificates();

        for($i = 1; $i <= $certs->Count(); $i++)
        {
            if(strtoupper($certs->Item($i)->get_Thumbprint()) == strtoupper($sha1_hash))
            {
                return $certs->Item($i);
            }
        }
        return null;
    }

    $code = "5937b53c-73f4-4411-9b78-a39851c3954e";
    $cert = FindCertbySHA1HASH('7ecf3608182fb033f2140f761e9be89e5472408d');

    $signer = new CPSigner();
    $signer->set_Certificate($cert);
//    $signer->set_Options(CERTIFICATE_INCLUDE_END_ENTITY_ONLY);   // проверил, мдлп понимает и если всю цепочку сертификатов включать - но с этой опцией размер меньше всего

    $sd = new CPSignedData();
    $sd->set_ContentEncoding(BASE64_TO_BINARY); 
    $sd->set_Content(base64_encode($code));

    try
    {
        $signature = $sd->SignCades($signer, CADES_BES, true, ENCODE_BASE64);
        echo "Signature is:\n".$signature;                         // полученную сигнатуру надо почистить от \r\n и можно использовать для получения token'а
    }
    catch (Exception $e)
    {
        echo $e->getMessage()."\n";
    }

Отредактировано пользователем 4 июня 2020 г. 13:12:17(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил ibz за этот пост.
two_oceans оставлено 08.06.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.