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

У вас до сих пор остались части openct в системе, попробуйте перезагрузиться или перезапустить pcscd и браузер.

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

Кирилл Романовский пишет:

У вас до сих пор остались части openct в системе, попробуйте перезагрузиться или перезапустить pcscd и браузер.

Да похоже рестарт решил проблему
Спасибо за помощь.

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

Добрый вечер.

Помогите решить проблему.

uname -a
Linux tohil-OEM 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

openssl version
OpenSSL 1.0.1e 11 Feb 2013

opensc-tool -l
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Aktiv Co. Rutoken S 00 00

Рутокен виден, но странно то что когда подключаю его то в логе pcscd пишет следующее:

sudo pcscd -df
00000000 pcscdaemon.c:233:main() pcscd set to foreground with debug send to stdout
00000163 configfile.l:245:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000050 configfile.l:257:DBGetReaderListDir() Skipping non regular file: .
00000030 configfile.l:298:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000090 configfile.l:257:DBGetReaderListDir() Skipping non regular file: ..
00000034 pcscdaemon.c:525:main() pcsc-lite 1.8.6 daemon ready.
00002496 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/002/001
00000265 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/003/001
00000232 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/004/001
00000218 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/005/001
00000166 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/005/001
00000176 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x046D, PID: 0xC313, path: /dev/bus/usb/005/002
00000169 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x046D, PID: 0xC313, path: /dev/bus/usb/005/002
00000218 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
21797712 hotplug_libudev.c:260:get_driver() Looking for a driver for VID: 0x0A89, PID: 0x0020, path: /dev/bus/usb/002/008
00000023 hotplug_libudev.c:312:HPAddDevice() Adding USB device: Aktiv Co. Rutoken S
00000051 readerfactory.c:978:RFInitializeReader() Attempting startup of Aktiv Co. Rutoken S 00 00 using /usr/lib/pcsc/drivers/ifd-rutokens.bundle/Contents/Linux/librutokens.so
00000188 readerfactory.c:868:RFBindFunctions() Loading IFD Handler 3.0
00132744 readerfactory.c:327:RFAddReader() Using the pcscd polling thread
00005999 eventhandler.c:256:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000029 Card ATR: 3B 6F 00 FF 00 56 72 75 54 6F 6B 6E 73 30 20 00 00 90 00
00403981 eventhandler.c:446:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED

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

Но это не дало никаких результатов

+ если проблемы при работе с pkcs11-tool

pkcs11-tool --module /usr/lib/pkcs11-gost/librtpkcs11ecp.so -Ol
Auto configuration failed
140204998088384:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:185:filename(/usr/lib/pkcs11-gost/libpkcs11_gost.so): /usr/lib/pkcs11-gost/libpkcs11_gost.so: undefined symbol: EC_ex_dup_data_fun
140204998088384:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
140204998088384:error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:eng_dyn.c:450:
140204998088384:error:260BC066:engine routines:INT_ENGINE_CONFIGURE:engine configuration error:eng_cnf.c:204:section=pkcs11_section, name=dynamic_path, value=/usr/lib/pkcs11-gost/libpkcs11_gost.so
140204998088384:error:0E07606D:configuration file routines:MODULE_RUN:module initialization error:conf_mod.c:235:module=engines, value=engine_section, retcode=-1


Нужно создать отсоединенную ЭП файла (PKCS#7). Дальнейшая работа с openssl мне понятна. А вот вытащить закрытый ключ не получается.

Спасибо.

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

Здравствуйте, Вы пытаетесь работать с библиотекой rtPKCS11ecp которая не поддерживает Рутокен S.
Опишите, пожалуйста, что и как Вы хотите сделать и как были сгенерированы ключи и сертификаты на вашем токене.

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

Скажите, пожалуйста, правильно я понимаю, что для того чтобы это решение работало на сервере, необходимо чтобы рутокен был физически подключен к этому серверу?

Спасибо.

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

nacharov пишет:

Скажите, пожалуйста, правильно я понимаю, что для того чтобы это решение работало на сервере, необходимо чтобы рутокен был физически подключен к этому серверу?

Спасибо.

Верно. Подключён, либо каким-нибудь образом проброшен.

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

Кирилл, а не можно почитать о способах пробросить рутокен на удаленный сервер?

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

Особо ничего посоветовать не могу.
Если сервер виртуальный, то проще пользоваться пробросом непосредственно от средства виртуализации.
У разных вендоров это по разному делается, надо знать, какая именно виртуализация.
Если это железный сервер или доступа к инструментам виртуализации нет (как в удалённом хостинге, например) то надо попробовать различные usb-over-ip решения.

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

Здравствуйте!
Очень интересует, каков статус данного "плагина" к OpenSSL в плане его сертификации.
Рутокен ЭЦП и МагПро КриптоПакет являются сертифицированными СКЗИ, однако не ясно, допустимо ли использование данного плагина для обеспечения взаимодействия между ними с ситуациях, когда сертифицированность СКЗИ играет важную роль.

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

glaz пишет:

Здравствуйте!
Очень интересует, каков статус данного "плагина" к OpenSSL в плане его сертификации.
Рутокен ЭЦП и МагПро КриптоПакет являются сертифицированными СКЗИ, однако не ясно, допустимо ли использование данного плагина для обеспечения взаимодействия между ними с ситуациях, когда сертифицированность СКЗИ играет важную роль.

Здравствуйте, glaz.
Учитывая тот факт, что криптография внутри плагина не производится, данный плагин не является СКЗИ и, следовательно, сертификация плагина не требуется. В данном случает вся криптография выполняется внутри носителя Рутокен ЭЦП.

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

Ксения Климанова пишет:

Здравствуйте, glaz.
Учитывая тот факт, что криптография внутри плагина не производится, данный плагин не является СКЗИ и, следовательно, сертификация плагина не требуется. В данном случает вся криптография выполняется внутри носителя Рутокен ЭЦП.

Я охотно верю, что криптографических операций внутри самого энджина не производится, однако энджины в openssl как раз служат для реализации внешних(по отношению к openssl) реализаций криптографических алгоритмов, по этому не понимаю, как доказать сертифицирующему органу, что данный энджин является лишь прослойкой между openssl и аппаратным СКЗИ при условии отсутствия исходных кодов.

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

glaz пишет:

Я охотно верю, что криптографических операций внутри самого энджина не производится, однако энджины в openssl как раз служат для реализации внешних(по отношению к openssl) реализаций криптографических алгоритмов, по этому не понимаю, как доказать сертифицирующему органу, что данный энджин является лишь прослойкой между openssl и аппаратным СКЗИ при условии отсутствия исходных кодов.

Вы хотите получить в ФСБ сертификат о корректности встраивания?

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

Добрый день!

Подскажите, пожалуйста, сейчас по-прежнему утилита инициализации рутокен ЭЦП есть только под windows?

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

Столкнулся со следующей проблемой.

При генерации ключа, если id уже используется, при завершении программы получаю Segmentation fault:

./TokenLib
key with such ID allready exists on token
Segmentation fault (core dumped)

код основан на примерах из этой темы форума:

ENGINE* LoadEngine(const char* pin)
{
    ENGINE* engine_pkcs11=NULL;

    engine_pkcs11=ENGINE_by_id("dynamic");
    if(!engine_pkcs11)
    {
        return NULL;
    }

    if(!ENGINE_ctrl_cmd_string(engine_pkcs11,    "SO_PATH",        "/usr/lib/pkcs11-gost/libpkcs11_gost.so", 0) ||
            !ENGINE_ctrl_cmd_string(engine_pkcs11,    "ID",            "pkcs11_gost", 0) ||
            !ENGINE_ctrl_cmd_string(engine_pkcs11,    "LOAD",            NULL, 0) ||
            !ENGINE_ctrl_cmd_string(engine_pkcs11,    "MODULE_PATH",    "/usr/lib/pkcs11-gost/librtpkcs11ecp.so", 0))
        return NULL;

    if(!ENGINE_ctrl(engine_pkcs11, CMD_MODULE_PATH, 0,
              (void*)"/usr/lib/pkcs11-gost/librtpkcs11ecp.so", NULL)) {
        ENGINE_free(engine_pkcs11);
        return NULL;
    }

    if(pin) {
        if(!ENGINE_ctrl(engine_pkcs11, CMD_PIN, 0,
                (void*)pin, NULL)) {
            ENGINE_free(engine_pkcs11);
            return NULL;
        }
    }

    if(!ENGINE_init(engine_pkcs11)) {
        ENGINE_free(engine_pkcs11);
        return NULL;
    }

    if(!ENGINE_set_default(engine_pkcs11, ENGINE_METHOD_ALL)) {
        ENGINE_free(engine_pkcs11);
        return NULL;
    }

    return engine_pkcs11;
}
void UnloadEngine(ENGINE* engine_pkcs11)
{
    ENGINE_finish(engine_pkcs11);
    ENGINE_free(engine_pkcs11);
}

int en_key(char* argv1, char *argv2)
{
    BIO*            bio_req=NULL;
    X509_REQ*        pRequest=NULL;
    EVP_PKEY*        key1=NULL;
    EVP_PKEY*        newkey=NULL;
    EVP_PKEY_CTX*    ctx=NULL;
    ENGINE*            engine_pkcs11=NULL;

    if(!argv1 || !argv2) {
    fprintf(stderr, "Bad parameters!");
    return 1;
    }

    /* инициализируем OpenSSL */
    ENGINE_load_builtin_engines();
    OPENSSL_add_all_algorithms_noconf();

    /* загружаем engine, реализующую работу с
        Рутокен ЭЦП через библиотеку PKCS#11 */
    engine_pkcs11=LoadEngine(
                //"pkcs11",
                  //      "rtPKCS11ECP.dll",
                        argv2);
    if(!engine_pkcs11)
        return 1;

    key1=EVP_PKEY_new();
    if(!key1) {
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    /* тип ключа ГОСТ Р 34.10-2001 */
    if(!EVP_PKEY_set_type(key1, GOST2001_KEY_TYPE)) {
        EVP_PKEY_free(key1);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    ctx=EVP_PKEY_CTX_new(key1, NULL);
    if(!ctx) {
        EVP_PKEY_free(key1);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    if(!EVP_PKEY_keygen_init(ctx)) {
        EVP_PKEY_CTX_free(ctx);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    /* параметры ключа */
    if(!EVP_PKEY_CTX_ctrl_str(ctx, "paramset", "A")) {
        EVP_PKEY_CTX_free(ctx);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    /* ID ключа */
    if(!EVP_PKEY_CTX_ctrl_str(ctx, "slot_key_id", argv1)) {
        EVP_PKEY_CTX_free(ctx);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    /* PIN-код токена */
    if(!EVP_PKEY_CTX_ctrl_str(ctx, "pin", argv2)) {
        EVP_PKEY_CTX_free(ctx);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    /* генерация ключа */
    if(!EVP_PKEY_keygen(ctx,&newkey)) {
        EVP_PKEY_CTX_free(ctx);
        UnloadEngine(engine_pkcs11);
        return 1;
    }

    BIO_free(bio_req);
    bio_req=NULL;


    X509_REQ_free(pRequest);
    EVP_PKEY_free(newkey);
    EVP_PKEY_CTX_free(ctx);

    UnloadEngine(engine_pkcs11);

    return 0;
}

valngrid указывает на CApplication::deleteAllCashPin()

valgrind ./TokenLib -v
==18406== Memcheck, a memory error detector
==18406== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==18406== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==18406== Command: ./TokenLib -v
==18406== 
key with such ID allready exists on token
==18406== Invalid read of size 4
==18406==    at 0x6892110: CApplication::deleteAllCashPin() (in /usr/lib/pkcs11-gost/librtpkcs11ecp.so)
==18406==    by 0x68EF609: my_fini (in /usr/lib/pkcs11-gost/librtpkcs11ecp.so)
==18406==    by 0x68880E7: ??? (in /usr/lib/pkcs11-gost/librtpkcs11ecp.so)
==18406==    by 0x699F7AF: ??? (in /usr/lib/pkcs11-gost/librtpkcs11ecp.so)
==18406==    by 0x400F464: _dl_fini (dl-fini.c:259)
==18406==    by 0x47EFF50: __run_exit_handlers (exit.c:78)
==18406==    by 0x47EFFDC: exit (exit.c:100)
==18406==    by 0x47D64DA: (below main) (libc-start.c:258)
==18406==  Address 0x6431810 is 0 bytes inside a block of size 32 free'd
==18406==    at 0x402BCFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==18406==    by 0x6891D27: CApplication::~CApplication() (in /usr/lib/pkcs11-gost/librtpkcs11ecp.so)
==18406==    by 0x47EFF50: __run_exit_handlers (exit.c:78)
==18406==    by 0x47EFFDC: exit (exit.c:100)
==18406==    by 0x47D64DA: (below main) (libc-start.c:258)

команда
openssl genpkey -engine pkcs11_gost -algorithm GOST2001 -pkeyopt slot_key_id:42 -pkeyopt paramset:A -pkeyopt  pin:12345678
отрабатывает корректно, даже в случае занятого id (сообщение key with such ID allready exists on token, valngrid не ругается)

При этом  "Invalid read of size 4" проявляется во всех примерах - похоже, что неправильно загружается/выгружается engine.

Ubuntu 12.04 32 bit

Подскажите, пожалуйста, в чем может быть проблема?

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

abstract пишет:

Столкнулся со следующей проблемой.
Подскажите, пожалуйста, в чем может быть проблема?

Добрый день.
Информация передана разработчикам. В данный момент производится исследование причин данного поведения.
О результатах исследования будет сообщено дополнительно.