Статус: Участник
Группы: Участники
Зарегистрирован: 09.08.2013(UTC) Сообщений: 20  Откуда: Grodno Сказал(а) «Спасибо»: 2 раз
|
На основе вашего примера stunnel пытаемся установить TLS соединение с нашим локальным сервером. Одна из задач - двухсторонняя аутентификация, т.е используя сертификат пользователя, мы застряли в самом начале - на добавлении нового сертификата в хранилище. делаем примерно так:
Код:- (void)printCerts {
std::vector<std::string> RDN;
std::vector<std::string> notBefore;
std::vector<std::string> notAfter;
std::vector<std::string> thumbprint;
EnumCerts(RDN, notBefore, notAfter, thumbprint);
NSLog(@"Certificates total count: %li",thumbprint.size());
for(int i = 0; i < thumbprint.size(); ++i){
NSLog(@"%i. %s", i, thumbprint[i].c_str());
}
}
- (bool) loadCertificate:(NSString*)filename {
HCERTSTORE hStoreMy = 0;
PCCERT_CONTEXT pCertCtx = 0;
hStoreMy = CertOpenSystemStore(0,"MY");
NSData* data = [NSData dataWithContentsOfFile:filename];
BYTE * cert = (BYTE*)[data bytes];
DWORD lSize = [data length];
if (CertAddEncodedCertificateToStore(hStoreMy, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, cert, lSize, CERT_STORE_ADD_REPLACE_EXISTING, &pCertCtx)) {
//это явно лишнее, пробовали и без этого - безрезультатно
if (CertAddCertificateContextToStore(hStoreMy, pCertCtx, CERT_STORE_ADD_REPLACE_EXISTING, 0)) {
CertCloseStore(hStoreMy, 0);
return true;
}
}
return false;
}
- (void) testAddingCerts {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
[self printCerts];
NSLog(@"loadingSert %i",[self loadCertificate:[NSString stringWithFormat:@"%@/client.cer", documentsDirectory]]);
[self printCerts];
//console print
//2013-08-09 16:00:53.624 iStunnel[606:907] Certificates total count: 0
//2013-08-09 16:00:55.794 iStunnel[606:907] loadingSert 1
//2013-08-09 16:00:56.684 iStunnel[606:907] Certificates total count: 0
}
Все отрабатывает без ошибок и предупреждений, но сертификат в хранилище не появляется. Пробовали различные форматы сертификата, пробовали поместить в хранилище сертификат полученнный через ваш тестовый CA. Безрезультатно. Возможно мы что-то не так понимаем в работе с сертификатами и хранилищем, возможно для того чтобы поместить сертификат в хранилище он должен быть подписан находящимся в хранилище рутовым сертификатом, и для начала нужно добавить в хранилище его? Просим некоторых разъяснений, по возможности подробных. Спасибо заранее!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
А как вы проверяете появляется ли сертификат в хранилище? Я не вижу реализацию функции EnumCerts. |
Татьяна ООО Крипто-Про |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.08.2013(UTC) Сообщений: 20  Откуда: Grodno Сказал(а) «Спасибо»: 2 раз
|
EnumCerts реализация во фреймворке, через эту функцию в примере заполняется датасорс таблицы сертификатов. Объявление функции в хидере ManageCertsAndConts.h
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Эта функция ищет только сертификаты, связанные с закрытым ключом. Ваш сертификат не связан с закрытым ключом, поэтому он устанавливается в хранилище, но функция EnumCerts его не находит. |
Татьяна ООО Крипто-Про |
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Перечислить все сертификаты в хранилище можно при помощи CertEnumCertificatesInStore |
Татьяна ООО Крипто-Про |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.08.2013(UTC) Сообщений: 20  Откуда: Grodno Сказал(а) «Спасибо»: 2 раз
|
Татьяна, добрый день. Поднять tls соединение через stunnel с нашим локальным сервером получилось с выключенной проверкой сертификата пользователя на сервере. Немного не понятно где в таком случае клиент stunnel ищет root сертификат для сертификата предоставляемого сервером. Возможно в "ROOT" хранилище? При включении аутентификации пользователя по сертификату на сервере и соответственно редактировании конфига stunnel мы получаем следующую ошибку:
2013.08.12 14:44:51 LOG7[521:805257216]: test accepted FD=33 from 127.0.0.1:50456 2013.08.12 14:44:51 LOG7[521:88928256]: client start 2013.08.12 14:44:51 LOG7[521:88928256]: test started 2013.08.12 14:44:51 LOG7[521:88928256]: FD 33 in non-blocking mode 2013.08.12 14:44:51 LOG7[521:88928256]: TCP_NODELAY option set on local socket 2013.08.12 14:44:51 LOG5[521:88928256]: test connected from 127.0.0.1:50456 2013.08.12 14:44:51 LOG7[521:88928256]: FD 36 in non-blocking mode 2013.08.12 14:44:51 LOG7[521:88928256]: test connecting 2013.08.12 14:44:51 LOG7[521:88928256]: connect_wait: waiting 10 seconds 2013.08.12 14:44:51 LOG7[521:88928256]: connect_wait: connected 2013.08.12 14:44:51 LOG7[521:88928256]: Remote FD=36 initialized 2013.08.12 14:44:51 LOG7[521:88928256]: TCP_NODELAY option set on remote socket 2013.08.12 14:44:51 LOG7[521:88928256]: start SSPI connect 2013.08.12 14:44:51 LOG5[521:88928256]: mutual auth in on. try to read the certificate 2013.08.12 14:44:51 LOG7[521:88928256]: open file /var/mobile/Applications/5834F766-59C7-431C-B71F-FEE291F5D5E6/Documents/client.cer with certificate 2013.08.12 14:44:51 LOG3[521:88928256]: **** Error 0x80090304 returned by AcquireCredentialsHandle 2013.08.12 14:44:51 LOG3[521:88928256]: Credentials complete 2013.08.12 14:44:51 LOG3[521:88928256]: Error creating credentials 2013.08.12 14:44:51 LOG5[521:88928256]: Connection reset: 0 bytes sent to SSL, 0 bytes sent to socket 2013.08.12 14:44:51 LOG7[521:88928256]: free Buffers 2013.08.12 14:44:51 LOG7[521:88928256]: delete c->hContext 2013.08.12 14:44:51 LOG7[521:88928256]: delete c->hClientCreds 2013.08.12 14:44:51 LOG5[521:88928256]: incomp_mess = 0, extra_data = 0 2013.08.12 14:44:51 LOG7[521:88928256]: test finished (0 left)
Вероятно, наш сертификат должен быть привязан к ключу в контейнере ключей? Закрытый ключ в нашем примере пока нигде не используется. client.cer - сгенерирован на компьютере и подписан root_ca (наш корневой тестовый сертификат). Необходимо ли для корректной работы с сертификатами и ключами поднимать сервер выдачи сертификатов, генерировать ключевые пары на девайсе, создавать запрос на получение сертификата и получать сертификат через этот CA сервер? Все что мы хотим на данном этапе - поднять tls соединение с нашим тестовым сервером используя stunnel, все сертификаты и ключевые пары сгенерированы используя ГОСТовские алгоритмы на компьютере. Не моглы бы вы описать кратко последовательность необходимых действий для этого - возможно мы что то делаем не так. К серверу вопросов быть не должно - все проверено используя s-client - 2way аутентификация успешно проходит и соединение устанавливается.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Ищет ли клиент сертификат сервера зависит от настройки verify в конфиге. Если ищет, то да, в хранилище root. Да, чтобы пользоваться TLS с двухсторонней аутентификацией сертификат клиента должен быть привязан к ключу. Это можно сделать по-разному: - если нужно для тестов, то проще всего воспользоваться нашим тестовым сервером (в нашей панели есть кнопка "взаимодействие с УЦ", воспользовавшись которой можно выпустить тестовый сертификат). - можно аналогичным образом работать со своим УЦ - можно перенести уже существующие ключи на айпад и установить уже существующий сертификат с привязкой к этим ключам.
В первых двух случаях не надо писать код, всё уже написано, в последнем надо самим писать код. |
Татьяна ООО Крипто-Про |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.08.2013(UTC) Сообщений: 20  Откуда: Grodno Сказал(а) «Спасибо»: 2 раз
|
Татьяна, если Вас не затруднит - этот пункт подробнее: - можно перенести уже существующие ключи на айпад и установить уже существующий сертификат с привязкой к этим ключам.
Т.е. по существу - у нас есть ключевые пары в формате PEM или DER и есть сертификаты, также в виде файлов, как нам добавить сертификат в хранилище и одновременно связать с соответствующим ключом?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Я боюсь что с ключевыми парами в формате PEM или DER ничего не получится -- можно перенести ключи, сделанные нашим провайдером на любой ОС, а нас другой формат хранения контейнера (во многом его особенности обусловлены требованиями ФСБ, которые предъявляются к хранению ключевой информации, поэтому стандартный формат использовать не можем). Если ключи сделаны нашим CSP и при создании было разрешено их копирование (выставлен флаг CRYPT_EXPORTABLE), то его можно экспортировать и импортировать через CryptoAPI: на машине с ключом надо экспортировать его в блоб, на айпаде -- импортировать из блоба. У нас в SDK есть примеры на экспорт/импорт ключей: http://cpdn.cryptopro.ru/http://cpdn.cryptopro.ru...ngSessionKeyExample.htmlhttp://cpdn.cryptopro.ru...gCertificateExample.htmlЕсли ключи сделаны не нашим CSP, то всё равно надо переделывать -- в этом случае проще создавать ключи сразу на айпаде (не нужно переносить + не нужен наш CSP для десктопа + не нужно писать десктопную часть ПО для переноса ключа). |
Татьяна ООО Крипто-Про |
 1 пользователь поблагодарил Татьяна за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.08.2013(UTC) Сообщений: 20  Откуда: Grodno Сказал(а) «Спасибо»: 2 раз
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close