(2015-02-24 13:19:00 отредактировано avrik)

Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

С ЭЦП сталкиваюсь впервые.
Выдали на работе Rutoken ЭЦП Bluetooth.
Задача - подписать файл. Формат файла - xml, если это имеет значение.
Собственно, вопрос заключается в следующем - откуда начать поиск решения?

Скачал Rutoken SDK. Собрал примеры. Токен находит. Только вот в примере с CryptoPro, при нахождении токена выдает следующее:
Aktiv Rutoken ECP BT 831741204
INVALID_MEDIA

Правильно ли я понял, что подпись производится с помощью функций представленных в этом документе про PKCS#11?
http://developer.rutoken.ru/download/at … pdf?api=v2

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

avrik пишет:

С ЭЦП сталкиваюсь впервые.
Выдали на работе Rutoken ЭЦП Bluetooth.
Задача - подписать файл. Формат файла - xml, если это имеет значение.
Собственно, вопрос заключается в следующем - откуда начать поиск решения?

Скачал Rutoken SDK. Собрал примеры. Токен находит. Только вот в примере с CryptoPro, при нахождении токена выдает следующее:
Aktiv Rutoken ECP BT 831741204
INVALID_MEDIA

Правильно ли я понял, что подпись производится с помощью функций представленных в этом документе про PKCS#11?
http://developer.rutoken.ru/download/at … pdf?api=v2

Добрый день.

Для работы с токеном можно использовать либо программный интерфейс PKCS#11 либо CryptoAPI (можно и то и другое вместе, но для разных целей, как в примере).

Самый важный момент: формат ключевого контейнера. Вы должны понимать, чем и как будут созданы ключи и сертификаты на токене.
Если ключевая информация записывается через криптопро CSP, то вариант на iOS у вас только один - нужно использовать CryptoAPI через КриптоПро CSP.framework
Если нет, то можно обойтись программным интерфейсом PKCS#11.

Примеры для подписи файлов через CryptoAPI можно найти на MSDN или на форуме Крипто-ПРО (что предпочтительнее).
Для того, чтобы правильно собрать пример в SDK воспользуйтесь hotfix-ом  http://dev.rutoken.ru/download/attachme … amp;api=v2

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

То есть подписывать документы можно как через PKCS#11, так и через CryptoPro?

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

И да и нет.
В общем случае - да. Можно использовать программный интерфейс по вкусу.

Но, очень важен формат в котором записана ключевая информация.
Если она записана через КриптоПро CSP - то и использовать и на iOS нужно CryptoProCSP.framework.
Через PKCS#11 вы не увидите ключей и сертфикатов.

То же самое, если наоборот.
Вы ничего не найдете если будете использовать CryptoProCSP.framework для поиска объектов PKCS#11.

(2015-02-25 12:13:04 отредактировано avrik)

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Спасибо за скорый ответ, Кирилл.
При инициализации защищенного канала в примере с CryptoPro спрашивает пароль. Есть ли какой-то дефолтный?

UPD: http://dl.dropbox.com/u/19262670/Sended … 3%2036.png
Скриншот приложения, после того как токен обнаружен. Что означает статус INVALID_MEDIA?

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Добрый день.
Про пароли защищенного канала написано тут http://dev.rutoken.ru/pages/viewpage.ac … d=11632725

Если пишет INVALID_MEDIA то скорее всего у вас ошибка в конфигурации.
Внимательно прочитайте и выполните все пункты инструкции http://dev.rutoken.ru/download/attachme … amp;api=v2
Пример рассчитывает что на токене есть ключевой контейнер криптопро csp.
Его можно выписать на компьютере с windows и установленным криптопро csp через internet explorer через эту страничку http://cryptopro.ru/certsrv/

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Кирилл Мещеряков пишет:

Добрый день.
Про пароли защищенного канала написано тут http://dev.rutoken.ru/pages/viewpage.ac … d=11632725

Если пишет INVALID_MEDIA то скорее всего у вас ошибка в конфигурации.
Внимательно прочитайте и выполните все пункты инструкции http://dev.rutoken.ru/download/attachme … amp;api=v2
Пример рассчитывает что на токене есть ключевой контейнер криптопро csp.
Его можно выписать на компьютере с windows и установленным криптопро csp через internet explorer через эту страничку http://cryptopro.ru/certsrv/

Если так, то что делает этот кусок кода в примере?

- (IBAction)CreateContainer:(id)sender {
    [self addTxtValue:@"Create container"];
    if([currentToken getReaderStatus] != kValidReader) {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:kContainerCreateAlertTitle message:@"Error! This reader seems to be not valid yet!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        alert.alertViewStyle = UIAlertViewStyleDefault;
        [alert show];
    } else {
        CFUUIDRef uuid = CFUUIDCreate(NULL);
        CFStringRef str = CFUUIDCreateString(NULL, uuid);
        CFRelease(uuid);
        [self addTxtValue:[NSString stringWithFormat:@"Creating container %@", (__bridge NSString*)str]];
        [CryptoPro createNewKeyset:(__bridge NSString*)str forReader:currentToken];
        [self ListContainers: self];
    }
}

Разве здесь не создается контейнер с новой парой ключей?

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

avrik пишет:
Кирилл Мещеряков пишет:

Добрый день.
Про пароли защищенного канала написано тут http://dev.rutoken.ru/pages/viewpage.ac … d=11632725

Если пишет INVALID_MEDIA то скорее всего у вас ошибка в конфигурации.
Внимательно прочитайте и выполните все пункты инструкции http://dev.rutoken.ru/download/attachme … amp;api=v2
Пример рассчитывает что на токене есть ключевой контейнер криптопро csp.
Его можно выписать на компьютере с windows и установленным криптопро csp через internet explorer через эту страничку http://cryptopro.ru/certsrv/

Если так, то что делает этот кусок кода в примере?

- (IBAction)CreateContainer:(id)sender {
    [self addTxtValue:@"Create container"];
    if([currentToken getReaderStatus] != kValidReader) {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:kContainerCreateAlertTitle message:@"Error! This reader seems to be not valid yet!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        alert.alertViewStyle = UIAlertViewStyleDefault;
        [alert show];
    } else {
        CFUUIDRef uuid = CFUUIDCreate(NULL);
        CFStringRef str = CFUUIDCreateString(NULL, uuid);
        CFRelease(uuid);
        [self addTxtValue:[NSString stringWithFormat:@"Creating container %@", (__bridge NSString*)str]];
        [CryptoPro createNewKeyset:(__bridge NSString*)str forReader:currentToken];
        [self ListContainers: self];
    }
}

Разве здесь не создается контейнер с новой парой ключей?

Прошу прощения, я перепутал, действительно создать контейнер можно.

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Вот здесь http://developer.rutoken.ru/pages/viewp … d=10059883
написано:

Пароль инициализации - специальный пароль, записанный на карточке, входящей в комплект поставки Токена. Без знания пароля инициализации приложение не может произвести первоначальную инициализацию защищённого канала с Токеном.

Что за карточка? На упаковке токена написано только про пароль 1234 при установлении связи с устройствами, но это же не то? https://www.dropbox.com/s/2904aryohy8nv … 7.jpg?dl=0

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

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

Инструкция на упаковке отношения к защищенному каналу не имеет.
Там указан пароль для Bluetooth спаривания, который большинство вообще не спрашивает.

(2015-02-26 11:50:27 отредактировано avrik)

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

После форматирования токена и получения пароля для инициализации защищенного канала удалось создать контейнер с ключами. На винде через вашу утилиту контейнер тоже видит. Это хорошо.

https://www.dropbox.com/s/d6u4nyfvkjc0g … 4.png?dl=0
https://www.dropbox.com/s/ye2zx3mkoxfv4 … 4.png?dl=0

Искал примеры на MSDN и задавал вопросы на форуме КриптоПро. И там и там не смог найти ответа на вопрос.
Как при помощи этих ключей и КриптоПро формировать подпись документа?

PS Проблема с INVALID_MEDIA решилась после удаления run скриптов и установки флага -all_load в other linker flags. Необходимо было следовать инструкции представленной здесь Кириллом выше.
http://dev.rutoken.ru/download/attachme … amp;api=v2

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Пример подписи можно найти в составе CryptoProCSP.framework в примере "CreateFile"

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

В этом примере используется CertOpenSystemStore. То есть для подписи необходимо получить сертификат. Насколько я понимаю, сертификат выдает удостоверяющий центр. В моем случае УЦ КриптоПро. Как получить сертификат для пары ключей, которые существуют уже в контейнере? Или необходимо делать это одновременно - генерировать ключи и получать сертификат?

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

Ну мы не самые большие специалисты по CryptoAPI - такие вопросы лучше в Крипто-ПРО отправлять.

Вы сильно облегчите себе жизнь если не станете генерировать ключи и сертификаты на iOS девайсе.
Эту операцию обычно делают через Desktop компьютер, так правильнее как с точки зрения бизнес-логики, так и с точки зрения безопасности.

Сгерерировав ключевой контейнер на desktop и записав сертификат - вы можете подключить токен к устройству на iOS, найти сертификат и использовать его для подписи.

Re: Подпись документа на iOS с помощью Rutoken ЭЦП Bluetooth

С помощью формы тестового УЦ КриптоПро получил сертификат в виде base64 строки, при этом на токене сгенерировались ключи. Сохранил строку в cert файл и положил сертификат в контейнер через КриптоПро CSP.

Панель Рутокен показывает следующее: https://www.dropbox.com/s/tdzxj115nm4n6 … 0.png?dl=0

В примере КриптоПро для формирования подписи используется сертификат. Собственно, вопрос. Как получить сертификат с токена? Я нашел вот эту тему на форуме: https://forum.rutoken.ru/topic/1303/

Цитирую:

Это можно сделать по средствам CSP.
1. Перебрать доступные контейнеры с подключенного Rutoken:
    1.1 CryptAcquireContext(... CRYPT_VERIFYCONTEXT ...);
    1.2 CryptGetProvParam(... PP_ENUMCONTAINERS...);
    1.3 Для каждого контейнера получить хендл ключевой пары - CryptGetUserKey;
    1.4 Получить у ключа свойство сертификата - CryptGetKeyParam(... KP_CERTIFICATE...);
2. Создать контекст из данных сертификата - CertCreateCertificateContext.
3. Получить из контекста сертификата необходимые свойства - CertGetCertificateContextProperty, сравнить с имеющимися.

Это единственный возможный путь получения сертификата и последующего формирования подписи? Или есть другие?