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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Andrey.R  
#1 Оставлено : 24 июля 2017 г. 9:02:37(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

Здравствуйте! Прошу помощи.

  1. Создаю подпись файла cades bes через Browser Plugin
  2. Отправляю на сервер (пока руками)
  3. На сервере проверяю подпись с помощью расширения PHP, получаю ошибку Segmentation fault (core dumped)

Более подробно:
1. Создание подписи
Код:
function MySignCadesBES_Async_File(tp, filedata, OnReady)
{
    cadesplugin.async_spawn(function*(arg) {
        try {
            var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
            yield oStore.Open();
        } catch (err) {
            $.notify('Failed to create CAdESCOM.Store: ' + err.number);
            return;
        }

        var all_certs = yield oStore.Certificates;
        var oCerts = yield all_certs.Find(0, tp); // по thumbprint

        if ((yield oCerts.Count) == 0) {
            $.notify("Certificate not found");
            return;
        }

        var certificate = yield oCerts.Item(1);

        var Signature;
        try
        {
            var errormes = "";
            try {
                var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
            } catch (err) {
                errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
                throw errormes;
            }

            yield oSigner.propset_Certificate(certificate);

            var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
            yield oSignedData.propset_ContentEncoding(1); //CADESCOM_BASE64_TO_BINARY
            yield oSignedData.propset_Content(filedata);

            try {
                var signature = yield oSignedData.SignCades(oSigner, 1, true);  //CADESCOM_CADES_BES  
            } catch (err) {
                alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
                return;
            }

            oStore.Close();

            if( OnReady ) OnReady(signature);
        }
        catch(err)
        {
            $.notify("Возникла ошибка: " + err);
        }
    });
}

Проверяю cryptcp

Также проходит проверку https://crypto.kontur.ru/verify

2. Сервер Centos 6 (x64)
Код:

yum install php56w php56w-devel lsb-core-noarch boost-devel gcc-c++
./install.sh # linux-amd64.tgz
rpm -i cprocsp-pki-2.0.0-amd64-cades.rpm     # cades_linux_amd64.tar.gz
rpm -i lsb-cprocsp-devel-4.0.0-4.noarch.rpm  # cades_linux_amd64.tar.gz
rpm -i cprocsp-cspopenssl-base-4.0.0-4.noarch.rpm
rpm -i cprocsp-cspopenssl-gost-64-4.0.0-4.x86_64.rpm

Собрал расширение по инструкции (/opt/cprocsp/src/phpcades/README) без ошибок
Поставил симлинк на libphpcades.so в /usr/lib64/php/modules
Прописал в php.ini extension=libphpcades.so
Установил корневые сертификаты
Код:
./certmgr -inst -store uroot -file /root/crt/kontur-n-2017.crt
./certmgr -inst -store uroot -file /root/crt/sertum-n-2017.crt


3. PHP-скрипт
Код:
<?php

$data = base64_encode(file_get_contents('data.jpg'));
$sgn = base64_encode(file_get_contents('data.jpg.sgn'));

try 
{
	$sd = new CPSignedData();
	
	$sd->set_ContentEncoding(BASE64_TO_BINARY);
	$sd->set_Content($data);
	
	$check = $sd->VerifyCades($sgn, CADES_BES, 1); // 1 - отсоединенная
	
	printf('OK');
}
catch(Exception $e)
{
	printf('Exception: ' . $e->getMessage() . "\n");
	printf("FAIL\n");
}

?>


Запускаю скрипт в консоли
php -f test.php
Получаю
Segmentation fault (core dumped)

Падает именно на VerifyCades, т.к. пробовал вызывать echo $sd->get_Content(); метод работает


Аналогичный код для проверки на JavaScript работает


test.rar (663kb) загружен 11 раз(а).

Буду благодарен за любую помощь.
Offline Andrey.R  
#2 Оставлено : 24 июля 2017 г. 9:45:22(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

Добавил журналирование через cpconfig, вот что вижу в /var/log/messages

Код:
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: CadesVerifyDetachedMessage (pVerifyPara=0x0x7ffe12078830, dwSignerIndex=0, pbDetachedSignBlob=0x0x2768ea0, cbDetachedSignBlob=7557, cToBeSigned=1, rgpbToBeSigned=0x0x7ffe120787e8, rgcbToBeSigned=0x0x7ffe120787f4, ppVerificationInfo=0x0x7ffe120787f8
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: CadesMsgVerifySignatureImpl Input parameters checked
Jul 24 09:28:51 cs110444 cpcsp[22705]: capi20: CryptMsgGetParam () Exception :'▒▒▒▒▒▒ 0xea: More data is available.' at file:'/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/capilite/CMSMessage.h' line:163
Jul 24 09:28:51 cs110444 cpcsp[22705]: capi20: CryptMsgGetParam () Exception :'▒▒▒▒▒▒ 0xea: More data is available.' at file:'/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/capilite/CMSMessage.h' line:163
Jul 24 09:28:51 cs110444 cpcsp[22705]: capi20: CryptMsgGetParam () Exception :'▒▒▒▒▒▒ 0xea: More data is available.' at file:'/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/capilite/CMSMessage.h' line:163
Jul 24 09:28:51 cs110444 cpcsp[22705]: capi20: CryptMsgGetParam () Exception :'▒▒▒▒▒▒ 0xea: More data is available.' at file:'/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/capilite/CMSMessage.h' line:163
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: VerifyMessageSignature Signature verification started
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: VerifyMessageSignature Signature verified
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: validateChain #start#
Jul 24 09:28:51 cs110444 cpcsp[22705]: cades: buildChain #start#
Jul 24 09:28:51 cs110444 kernel: php[22705]: segfault at 8 ip 0000003dd181f3b9 sp 00007ffe120765c0 error 4 in libcurl.so.4.1.1[3dd1800000+52000]
Jul 24 09:28:51 cs110444 abrtd: Directory 'ccpp-2017-07-24-09:28:51-22705' creation detected
Jul 24 09:28:51 cs110444 abrt[22707]: Saved core dump of pid 22705 (/usr/bin/php) to /var/spool/abrt/ccpp-2017-07-24-09:28:51-22705 (22945792 bytes)
Jul 24 09:28:51 cs110444 abrtd: Package 'php56w-cli' isn't signed with proper key
Jul 24 09:28:51 cs110444 abrtd: 'post-create' on '/var/spool/abrt/ccpp-2017-07-24-09:28:51-22705' exited with 1
Jul 24 09:28:51 cs110444 abrtd: Deleting problem directory '/var/spool/abrt/ccpp-2017-07-24-09:28:51-22705'


Похоже подпись проверяется, но падает проверка цепочки, что-то не так с curl

Привожу вывод php -i

Offline Andrey.R  
#3 Оставлено : 24 июля 2017 г. 11:05:57(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

curl работает


в PHP тоже работает


openssl тоже настроен на всякий случай
[root@cs110444 /]# openssl engine
(rdrand) Intel RDRAND engine
(dynamic) Dynamic engine loading support
(gost_capi) CryptoPro ENGINE GOST CAPI ($Revision: 147820 $)

Куда дальше копать не знаю, по прежнему Segmentation Fault
Offline 4eIIIupKo  
#4 Оставлено : 24 июля 2017 г. 12:43:42(UTC)
4eIIIupKo

Статус: Активный участник

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

Сказал «Спасибо»: 26 раз
Автор: Andrey.R Перейти к цитате
curl работает


в PHP тоже работает


openssl тоже настроен на всякий случай
[root@cs110444 /]# openssl engine
(rdrand) Intel RDRAND engine
(dynamic) Dynamic engine loading support
(gost_capi) CryptoPro ENGINE GOST CAPI ($Revision: 147820 $)

Куда дальше копать не знаю, по прежнему Segmentation Fault


Я тоже пытаюсь организовать проверку подписей на серваке. Но пробую это сделать через cryptcp. Обработать вывод. Суть в том, что у меня даже cryptcp не проходит проверку. Хотя КриптоПРОАРМ проверку делает
Offline 4eIIIupKo  
#5 Оставлено : 24 июля 2017 г. 12:50:58(UTC)
4eIIIupKo

Статус: Активный участник

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

Сказал «Спасибо»: 26 раз
Вот еще что заметил

https://crypto.kontur.ru/verify#result

Тут проверка не проходит.

https://www.gosuslugi.ru/pgu/eds/

А тут проходит.
Offline Andrey.R  
#6 Оставлено : 24 июля 2017 г. 14:21:00(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

Через cryptcp на мой взгляд не совсем хорошее решение. Буду использовать если совсем ничего не получится с php.

Методом размышления и тыка дошел до следующего:
в этой теме происходило рассуждение на тему curl и я тоже решил "подсунуть" с помощью симлинка вместо "стандартной" вот эту /opt/cprocsp/lib/amd64/libcpcurl.so

теперь вместо Segmentation Fault получаем вот что:
Exception: Internal error. (0x800B010A)
FAIL

и в логах видим:


видимо ключевое слово здесь chainContext #failure# HRESULT: (0x800b010a)

Наверное будет правильнее php из исходников собрать.

Пока вопрос что же все таки означает эта ошибка.
Offline 4eIIIupKo  
#7 Оставлено : 24 июля 2017 г. 14:34:32(UTC)
4eIIIupKo

Статус: Активный участник

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

Сказал «Спасибо»: 26 раз
Сравни строки передаваемые в JS и в PHP.
Они должны быть одинаковые.
Походу где-то base64 неверный
Offline Andrey.R  
#8 Оставлено : 24 июля 2017 г. 14:46:51(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

Нет, там все верно.

Судя по логу (как я предполгаю) происходит следующее:

Проверяется сама подпись: VerifyMessageSignature Signature verified
Начинается проверка цепочки сертификатов: validateChain #start#
Проверка штампов времени: verifyTime #success#
Есть несколько chainContext #start#, вероятно это в несколько потоков идут запросы к УЦ
Где-то все ОК chainContext #success#
А где-то не ОК chainContext #failure#

а вот почему, мне пока не понятно
Offline 4eIIIupKo  
#9 Оставлено : 24 июля 2017 г. 15:42:58(UTC)
4eIIIupKo

Статус: Активный участник

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

Сказал «Спасибо»: 26 раз
Автор: Andrey.R Перейти к цитате
Нет, там все верно.

Судя по логу (как я предполгаю) происходит следующее:

Проверяется сама подпись: VerifyMessageSignature Signature verified
Начинается проверка цепочки сертификатов: validateChain #start#
Проверка штампов времени: verifyTime #success#
Есть несколько chainContext #start#, вероятно это в несколько потоков идут запросы к УЦ
Где-то все ОК chainContext #success#
А где-то не ОК chainContext #failure#

а вот почему, мне пока не понятно


Может УЦ отъехал))))
Offline Andrey.R  
#10 Оставлено : 26 июля 2017 г. 8:34:41(UTC)
Andrey.R

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

Группы: Участники
Зарегистрирован: 23.07.2017(UTC)
Сообщений: 7
Российская Федерация
Откуда: Пермь

Сборка php 5.6 из исходников с хэдэрами курла и опенссл от криптопро - результат тот же.
С php 7 расширение собирается только после долгих танцев с бубном (с патчем отсюда https://www.cryptopro.ru...px?g=posts&t=11907), валится много warning'ов и в итоге тоже не работает, сегфаулт уже при попытке верификации.
Придется писать обертку (shell_exec и cryptcp). Я когда-то арендовал офис со стенами из ГКЛ, злоумышленникам было бы проще попасть внутрь через стену чем через дверь, вот здесь теперь точно также получается.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.