(2017-02-14 11:27:22 отредактировано DamnCliffracers)

Re: SDK для Рутокен ЭЦП

Добрый день!
Скачал SDK. Пытаюсь написать программу (C++, Visual Studio 2015), использующую библиотеку pki-core.
В настройках проекта все вроде бы делаю аналогично примерам. В разделе C/C++ -> Общие в Дополнительные каталоги включаемых файлов прописываю путь к папке с файлами common.h и pki-core-cpp.h. В разделе Компоновщик -> Ввод в Дополнительные зависимости вписываю pki-core.lib. pki-core.dll и rtpkcs11ecp.dll лежат в папке с exe-шником программы. Но при сборке получаю 3 ошибки:

Ошибка    LNK2028    ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000AD0) "extern "C" int __cdecl rt_pc_initialize(char const *)" (?rt_pc_initialize@@$$J0YAHPBD@Z) т ЇєэъЎшш "void __cdecl rutoken::pkicore::initialize(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?initialize@pkicore@rutoken@@$$FYAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
Ошибка    LNK2019    ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "extern "C" int __cdecl rt_pc_initialize(char const *)" (?rt_pc_initialize@@$$J0YAHPBD@Z) т ЇєэъЎшш "void __cdecl rutoken::pkicore::initialize(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?initialize@pkicore@rutoken@@$$FYAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
Ошибка    LNK1120    эхЁрчЁх°хээ√ї тэх°эшї ¤ыхьхэЄют: 2

В чем может быть моя ошибка?

Re: SDK для Рутокен ЭЦП

Вы пробовали собирать примеры из комплекта разработчика?
https://download.rutoken.ru/Rutoken/SDK/

Re: SDK для Рутокен ЭЦП

Да, примеры собираются и работают

Re: SDK для Рутокен ЭЦП

В таком случае вам нужно просто скопировать настройки проекта из примеров комплекта разработчика. Если все скопируете правильно - у вас все заработает.

Re: SDK для Рутокен ЭЦП

Еще вопрос. Я запускаю пример CreateCSR-PKCS10 из SDK. Вот так там выглядит структура DN:

CK_CHAR_PTR dn[] = { (CK_CHAR_PTR)"CN",                       // Тип поля CN (Common Name)
                     (CK_CHAR_PTR)"UTF8String:Иванов",        // Значение
                     (CK_CHAR_PTR)"C",                        // Тип поля C (Country)
                     (CK_CHAR_PTR)"RU",
                     (CK_CHAR_PTR)"2.5.4.5",                  // Тип поля SN (Serial Number)
                     (CK_CHAR_PTR)"12312312312",
                     (CK_CHAR_PTR)"1.2.840.113549.1.9.1",     // Тип поля E (E-mail)
                     (CK_CHAR_PTR)"ivanov@mail.ru",
                     (CK_CHAR_PTR)"ST",                       // Тип поля ST (State or province)
                     (CK_CHAR_PTR)"UTF8String:Москва", };

Получившийся запрос декодирую (https://certlogik.com/decoder/), и на выходе вместо русских символов в полях структуры DN получаю вот что:

https://forum.rutoken.ru/uploads/transfer/10000/500/10520/thumb/p1baa0ku75rhl6711vdim2fipd1.png

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

(2017-03-03 16:47:57 отредактировано Анатолий Убушаев)

Re: SDK для Рутокен ЭЦП

DamnCliffracers пишет:

Получившийся запрос декодирую (https://certlogik.com/decoder/), и на выходе вместо русских символов в полях структуры DN получаю вот что:

https://forum.rutoken.ru/uploads/transfer/10000/500/10520/thumb/p1baa0ku75rhl6711vdim2fipd1.png
Почему так происходит? Как сделать, чтобы русские символы оставались русскими символами?

Добрый день!
Видимо данный конвертер не поддерживает кириллицу, поэтому он отобразил всё в HEX виде.
HEX в свою очередь можно легко переконвертировать в TEXT, как пример можете попробовать этот конвертер  http://www.unit-conversion.info/texttoo … imal/#data , чтобы понять как это работает.
Либо в коде программы написать функцию конвертирующую HEX в TEXT.

Re: SDK для Рутокен ЭЦП

И снова здравствуйте.
Есть большой вопрос на счет структуры dn. Ее элементы содержат текст в кодировке UTF-8. Если задавать поля статически в коде программы (то есть как в примере из SDK: CK_CHAR_PTR dn[] = { (CK_CHAR_PTR)"CN", (CK_CHAR_PTR)"UTF8String:Иванов", } и т.д.), то все работает. Если же брать строки в UTF-16, преобразовывать в UTF-8 и затем результат присваивать элементам dn (например, dn[1] = (CK_CHAR_PTR)Buf), то запрос получается с ошибками.
Единственное, что мне в этой ситуации приходит на ум - фишка в том, что при первом варианте инициализации массива указателей dn участки памяти, занимаемые текстом, идут друг за другом непрерывно. Во втором случае элементы dn[0], dn[1] и т.д. указывают на разрозненные участки памяти, и в результате функция C_EX_CreateCSR такой аргумент обрабатывает неправильно. Кто знает (и кто разобрался в корявых формулировках), подскажите, пожалуйста - все ли я правильно понял или тут дело в чем-то другом?

Re: SDK для Рутокен ЭЦП

Здравствуйте, DamnCliffracers!

Наша функция работает корректно. Похоже, что у вас скорее всего UCS-2 кодировка, а не UTF-16, т.к. в UCS-2 каждый второй байт для русского языка нулевой и после конвертации в UTF-8 получается, что половина символов пустые.

Re: SDK для Рутокен ЭЦП

Спасибо, проверю и попробую получше вникнуть в кодировки. Уточню на всякий случай: UTF-16 функция обрабатывает с тем же успехом, что и UTF-8? Если да, то какой должен быть префикс (или как это правильно называется) перед строкой - "UTF16String:" или что-то еще?

Re: SDK для Рутокен ЭЦП

Добрый день, DamnCliffracers. Отдельного префикса UTF16String: не существует. Для этого есть ровно 2 причины:

  • Cтандарт PKCS11 использует внутри себя UTF-8

  • Наши функции не могут конвертировать внутри себя из всех возможных в мире кодировок. Для этого есть специально ПО\библиотеки.

Вам просто надо правильно сконвертировать строку из Вашей кодировки в UTF-8 и воспользоваться префиксом UTF8String

(2017-05-02 08:26:22 отредактировано DamnCliffracers)

Re: SDK для Рутокен ЭЦП

Спасибо за помощь. Еще вопрос: некоторые декодеры CSR (например, эти: https://certlogik.com/decoder/, https://rus.gogetssl.com/online-csr-decoder/) не могут декодировать запрос, созданный с помощью примера CreateCSR-PKCS10 из SDK. Возникают ошибки типа "The CSR uses an invalid key!" Почему так?

Re: SDK для Рутокен ЭЦП

Добрый день, DamnCliffracers.

Мы вряд ли сможем ответить на этот вопрос, так как не являемся разработчиками этих сервисов. Судя по информации на сайтах, которые Вы привели, эти сервисы изначально рассчитаны на конкретные RSA сертификаты.

Re: SDK для Рутокен ЭЦП

Еще раз добрый день. Возникла пара новых вопросов.
1. Как включить в запрос на сертификат расширение "Период использования закрытого ключа"? Я нашел OID - 2.5.29.16 - но не могу понять, как прописать в это поле даты начала и окончания действия ключа.
2. Можно ли указать в запросе в поле "Сведения о шаблоне сертификата" OID  нужного шаблона, чтобы затем в Консоли управления автоматически создать сертификат на этом шаблоне?

Re: SDK для Рутокен ЭЦП

Добрый день, DamnCliffracers.

1. Вы хотите создать такой запрос с помощью нашего PKCS11 интерфейса?
2. Про какую Консоль управления идет речь? Microsoft? КриптоПро ЦР?

Re: SDK для Рутокен ЭЦП

1. Да.
2. КриптоПро ЦР. Немного переформулирую вопрос, пожалуй: можно ли выпустить сертификат по определенному шаблону, не выбирая его вручную из списка, а автоматически, прочитав его OID из запроса?