Re: Поддержка Рутокен ЭЦП в OpenSSL

Спасибо за ответ.

Виктор Ткаченко пишет:

Наш конфиг - урезанный. Вам имеет смысл использовать умолчательный конфиг (который идет с openssl), а для работы с нашим engine - наш конфиг.

Пока так и решаю вопрос, через установку OPENSSL_CONF в шапке скриптов. Меня просто удивило, что никто на подобное не жаловался, и что вообще без конфига всё грузится нормально - подумал, что что-то делаю не так. Да и интересно стало, с чего это вообще - как бы потом проблем не возникло после внедрения.

Виктор Ткаченко пишет:

Форматировать токен нужно не утилитами opensc, а нашей панелью управления.

А в чём причина, если не секрет? Возиться с wine ради этого не очень хочется, иметь разные машины под форматирование и под работу с токенами - тем более. У pkcs15-init есть отдельный профиль под названием "rutoken_ecp", и вся работа с токеном после этого идёт нормально - по крайней мере, все примеры с openssl из первых сообщений отрабатывают как положено, ключи генерятся, сертификаты тоже, подписи создаются и проверяются. Единственное, что

$ openssl ca -engine pkcs11_gost -keyfile 100 -keyform engine -cert ca.crt -in req.csr -out tester.crt

ругнулось на Invalid name options: "ca_defaultoption" как у ivan-t в сообщении #75, но я так понимаю что это всё-таки ошибка у вас в конфиге - мануалы про ca_defaultoption молчат, пишут что есть только ca_default.
Там ещё какие-то грабли впереди ждут, или это значит что OpenSC теперь нормально форматирует токены? Правда, надо сказать, в процессе экспериментов один раз из-под панели в Windows токен всё-таки форматировался, но с тех пор несколько раз стирался с pkcs15-init.

Re: Поддержка Рутокен ЭЦП в OpenSSL

Виктор Ткаченко пишет:

вообще говоря и не обязан. Потому что сертификат гостовый. Какую версию libp11 вы используете c PAM-ом? И что у вас за проет, если не секрет?

Задача: настроить аутентификацию с использованием PAM, Рутокен и ГОСТ-криптографии.
Для этих целей я пытаюсь переделать модуль pam_p11

libp11-2 i386 0.2.8-2

(2013-04-10 19:15:55 отредактировано abstract)

Re: Поддержка Рутокен ЭЦП в OpenSSL

Добрый день!

1) Где можно взять исходники библиотеки libp11.so.2, упоминающейся в инструкции по настройке?

2) И еще. Подпись сообщений выполняется и успешно проверяется. Однако, openssl получает ошибку
error:06089093:digital envelope routines:EVP_PKEY_CTX_ctrl:command not supported

Re: Поддержка Рутокен ЭЦП в OpenSSL

Вам было послано письмо на адрес указанный при регистрации

Re: Поддержка Рутокен ЭЦП в OpenSSL

День добрый.

В ходе экспериментов добрался до компиляции исходников из примеров, но под linux. Начал с сообщения #6:

Программный пример подписи данных "на борту" Рутокен ЭЦП в формате PKCS#7 по ГОСТ Р 34-10.2001 c помощью ключа и сертификата, хранящихся на токене

т.к. хотелось проверить, как pkcs11-tool справилась с записью сертификата в слот.

Убрал windows.h, изменил вызов LoadEngine на

LoadEngine("pkcs11_gost", "librtpkcs11ecp.so", NULL);

, добавил линк на libssl - после этого скомпилировалась нормально.

Установил переменную OPENSSL_ENGINES=/usr/lib/pkcs11_gost/ , запустил программу - и получил "bind failed", о котором спрашивал несколько сообщений назад. Опытным путём выяснилось, что вылетает во время LoadEngine, конкретнее -  на ENGINE_by_id.

Добавил после вызова LoadEngine вывод сообщений об ошибках:

    if(!engine_pkcs11)
        {
         SSL_load_error_strings();
        ERR_print_errors_fp(stderr);
        ERR_free_strings();
        return 1;
        }

Получил ссылку на отсутствующую в папке libgost.so:

140137873385128:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:185:filename(/usr/lib/pkcs11-gost/libgost.so): /usr/lib/pkcs11-gost/libgost.so: cannot open shared object file: No such file or directory
140137873385128:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
140137873385128:error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:eng_dyn.c:450:
140137873385128:error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:417:id=gost
140137873385128:error:260B606D:engine routines:DYNAMIC_LOAD:init failed:eng_dyn.c:521:
140137873385128:error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:417:id=pkcs11_gost

Библиотека нашлась в /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libgost.so (ставится из пакета libssl1.0.0)
Сделал ссылку:

sudo ln -s /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/libgost.so /usr/lib/pkcs11-gost/

После этого вместо "bind failed" стало выдавать сообщение "unable to load module librtpkcs11ecp.so", и вылетает уже не на ENGINE_by_id, а на ENGINE_init. Вдобавок образовалась неприятная проблема: вызов ERR_print_errors_fp(stderr) почему-то выдаёт ошибку сегментирования, т.е. даже детали ошибки просмотреть уже не получается.

librtpkcs11ecp.so лежит в папке с собранной программой и в /usr/lib/pkcs11-gost/. Установка и сброс OPENSSL_CONF на ошибки не влияют. После сброса OPENSSL_ENGINES выдаётся ошибка (что логично)

140003680458408:error:260B408F:engine routines:DYNAMIC_CTRL:invalid argument:eng_dyn.c:385:
140003680458408:error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:417:id=pkcs11_gost

Система: Debian Squeeze x64, OpenSSL 1.0.1e 11 Feb 2013, libssl-dev 1.0.1e-2.

Пожалуйста, помогите разобраться, в чём дело. Может, libgost.so не та, что нужна? И откуда мог появиться сегфолт на выводе ошибок, можно ли его как-то обойти и узнать детали ошибки?

(2013-04-16 14:57:37 отредактировано ArPod)

Re: Поддержка Рутокен ЭЦП в OpenSSL

Разобрался сам - надо было либо нормально прописать адрес модуля, либо установить LD_LIBRARY_PATH. После изменения вызова LoadEngine на

LoadEngine("pkcs11_gost", "./librtpkcs11ecp.so", NULL); 

всё заработало как положено, подпись нормально формируется. Правда, откуда сегфолт при выводе ошибок был, до сих пор не ясно, но это наверное лучше у самих разработчиков openssl в багтрекере спросить. Ещё появилась та же ошибка, что у abstract:

140239041869480:error:06089093:digital envelope routines:EVP_PKEY_CTX_ctrl:command not supported:pmeth_lib.c:411:

- появляется после вызова функции PKCS7_sign. Так и должно быть?

Re: Поддержка Рутокен ЭЦП в OpenSSL

Смотря в какой момент ошибка появляется. Не после генерации закрытого ключа?

Re: Поддержка Рутокен ЭЦП в OpenSSL

Виктор Ткаченко пишет:

Смотря в какой момент ошибка появляется. Не после генерации закрытого ключа?

В том примере генерации закрытого ключа вообще нет, только считывание. Судя по расставленным fprintf'ам и выводам ошибок, появляется она после вызова

p7=PKCS7_sign(cert_info.cert, pKey, NULL, in, flags);

- ключ туда передаётся вторым параметром, как я понимаю. При этом сама программа дальше работает нормально, по крайней мере судя по выходным данным.

Re: Поддержка Рутокен ЭЦП в OpenSSL

Посмотрел. Это не совсем ошибка, то есть не критично. Через некоторое время пересоберем engine.

Re: Поддержка Рутокен ЭЦП в OpenSSL

Виктор Ткаченко пишет:

Посмотрел. Это не совсем ошибка, то есть не критично. Через некоторое время пересоберем engine.

Ясно, это радует.

Если всё-таки будете разбираться с "bind failed" при запуске системы - удалось получить чуть более информативное сообщение, установив bind9-host из wheezy. Если после этого запустить команду "host www.ru" с вашим конфигом (или с дефолтным, в который добавлена секция engines из вашего), то выдаст такую ошибку:

GOST engine already loaded
17-Apr-2013 17:48:13.632 ENGINE_by_id failed
17-Apr-2013 17:48:13.632 error:260B606D:engine routines:DYNAMIC_LOAD:init failed:eng_dyn.c:521:
17-Apr-2013 17:48:13.632 error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:417:id=gost
host: dst_lib_init: crypto failure

Ошибка при запуске осталась та же, но думаю что источник у них один.

Кстати, секция в конфиге

[gost_section]
default_algorithms        = ALL

за что-нибудь отвечает, или это остатки от тестирования? Я просто не вижу строчек, которые бы на неё ссылались.

(2013-04-22 15:03:06 отредактировано ArPod)

Re: Поддержка Рутокен ЭЦП в OpenSSL

День добрый.

Можно ли где-нибудь посмотреть возможные коды/значения поля "reason" для ошибок, которые выдаёт в очередь OpenSSL ваша библиотека? Хочется сделать приличную систему обработки ошибок для интерфейса под JNI, но сейчас приходится ловить их "вслепую".

UPD: И ещё вопрос, возможно ли удаление существующей на токене ключевой пары / сертификата средствами OpenSSL?

Re: Поддержка Рутокен ЭЦП в OpenSSL

А вы пишете JAVA-апплет? Не смотрели в направлении http://pki.rutokenweb.ru/ ?

(2013-04-22 15:37:01 отредактировано ArPod)

Re: Поддержка Рутокен ЭЦП в OpenSSL

Виктор Ткаченко пишет:

А вы пишете JAVA-апплет? Не смотрели в напрвлении http://pki.rutokenweb.ru/ ?

Не совсем "обычный" апплет - делаю дипломный проект, внедрение PKI и цифровой подписи определённых данных в уже развёрнутую автоматизированную банковскую систему. Из апплетов предполагается производить подпись по ГОСТу, проверку подписи, проверку сертификатов и общение с OCSP, в будущем - возможно, ещё на что-нибудь расширить, так что, боюсь, функционала плагина не хватит, да и привязывать Openssl через JNI всё равно придётся.

(2013-05-06 10:49:09 отредактировано ArPod)

Re: Поддержка Рутокен ЭЦП в OpenSSL

Здравствуйте (снова).

Пытаюсь откомпилировать и обкатать нужные функции в виде .exe, прежде чем оборачивать в библиотеку/апплет. К сожалению, пока не получается.

Во время загрузки Engine, после вызова ENGINE_by_id(), вызовов всех нужных ENGINE_ctrl(), функция ENGINE_init() подвисает секунд на 15, и выдаёт сообщение "unable to load module rtPKCS11ECP.dll". Причём это происходит и если грузить по id="pkcs11_gost", как в примерах из первых сообщений, и если загружать гостовский и pkcs11 движки через Dynamic, как в статье на хабре.

Включил выдачу ошибок - ругается на "OPENSSL_Uplink(10100000,08): no OPENSSL_Applink". Пытался компилировать в g++ и в Visual Studio 2010 с /MT и /MD, с различными вариантами libeay32.lib - libeay32MT.lib, libeay32MD.lib (из lib/VC), просто с libeay32.lib (из lib), с разными версиями openssl (1.0.0k и 1.0.1e), пытался использовать разные версии libeay32.dll - всё равно ругается на апплинк. Сделал как предлагает FAQ OpenSSL -

extern "C"
{
#include <openssl/applink.c>
}

После этого ENGINE_init() всё равно висит столько же времени, но ошибка изменилась:

1456:error:80001005:Vendor defined:PKCS11_CTX_load:General Error:p11_load.c:86:
1456:error:8108D097:lib(129):PKCS11_INIT:fail load libp11:engine_pkcs11.c:199:

После подключения апплинка также пытался компилировать в g++/VS, с разными версиями библиотек и OSSL - безрезультатно, ничего не меняется.

Пожалуйста, помогите разобраться в чём дело. Потратил на поиски три дня, варианты уже просто закончились.

ОС - Win XP 32 SP3.

P.S. Поправьте ссылку на сборку OpenSSL для windows в первых постах - 1.0.0e выдаёт 404(сейчаслибо 1.0.0k либо 1.0.1e), и в light-версии установки отсутствуют .lib и .h файлы.

P.P.S. Заодно случайно выяснилось, что вылет программы при попытке вывести ошибки после "unable to load module rtPKCS11ECP.dll" лечится удалением вызова ENGINE_free() после неудавшегося ENGINE_init().

---------------

UPD: Всё оказалось до смешного просто - нужна была свежая версия rtPKCS11ECP.dll вместо той, которая лежит в архиве на habrahabr. А ошибки OPENSSL_Applink возникали из-за ERR_print_errors_fp() -  функций принимающих FILE*, как выяснилось, разработчики рекомендуют избегать, тогда applink не будет нужен.

Re: Поддержка Рутокен ЭЦП в OpenSSL

Столкнулся с совершенно неожиданной проблемой - сертификаты, записанные на токен под Windows, не видятся в Linux, и наоборот. Пробовал писать через CMD_SAVE_CERT_CTRL как в примере, пробовал напрямую через pkcs11-tool. Причём сертификат, записанный через CMD_SAVE_CERT_CTRL под linux, видно в выводе "pkcs11-tool -O" (в нужном слоте и с указанным именем). Форматировал токен из панели управления РуТокен под Windows - ситуация не изменилась. При этом сли сначала записать сертификат с ID=1 в одной системе, потом в другой, то работать будет в обеих - получается, что сертификаты почему-то пишутся в разные области памяти?

Ответьте, пожалуйста. В данном случае без вашей помощи точно не разобраться.