Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

5 Страницы«<2345>
Опции
К последнему сообщению К первому непрочитанному
Offline Stalker4  
#31 Оставлено : 28 февраля 2013 г. 17:49:30(UTC)
Stalker4

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2013(UTC)
Сообщений: 30
Украина

Сказал(а) «Спасибо»: 1 раз
Стал изучать описание функции CryptSignMessage, но не нашел где же ей указывать контейнер с закрытым ключом.
Там есть только параметр ссылка на сертификат, но ведь в сертификат содержит только открытый ключ.
Правда на msdn в описании параметра CRYPT_SIGN_MESSAGE_PARA.pSigningCert говориться, что
Цитата:
A pointer to the CERT_CONTEXT to be used in the signing.
Either the CERT_KEY_PROV_INFO_PROP_ID, or CERT_KEY_CONTEXT_PROP_ID property must be set for the context to provide
access to the private signature key.

но я честно говоря не понял, как именно надо привязать к сертификату ссылку на контейнер с закрытым ключом.
Offline Андрей Писарев  
#32 Оставлено : 28 февраля 2013 г. 17:53:40(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,770
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Автор: Stalker4 Перейти к цитате
Стал изучать описание функции CryptSignMessage, но не нашел где же ей указывать контейнер с закрытым ключом.
Там есть только параметр ссылка на сертификат, но ведь в сертификат содержит только открытый ключ.
Правда на msdn в описании параметра CRYPT_SIGN_MESSAGE_PARA.pSigningCert говориться, что
Цитата:
A pointer to the CERT_CONTEXT to be used in the signing.
Either the CERT_KEY_PROV_INFO_PROP_ID, or CERT_KEY_CONTEXT_PROP_ID property must be set for the context to provide
access to the private signature key.

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



У тебя сертификат уже имеет привязку к контейнеру (ссылка на закрытый ключ - на странице Общие при просмотре сертификата).
У пользователей - устанавливается через программу настройки КриптоПРО CSP (Сервис\Установить личный сертификат).

p.s. но сделать привязку можно и у себя в приложении, если такое необходимо...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#33 Оставлено : 28 февраля 2013 г. 17:58:35(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,770
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Юрий  
#34 Оставлено : 5 марта 2013 г. 11:16:59(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
Дабы немного привести в порядок знания участвующих в данном обсуждении уточню некоторые детали:
1) Основные функции CryptoAPI (функции непосредственно экспортируемые из криптопровайдеров) в качестве результата возвращают обычные бинарные данные, никак не кодированные;
2) Кроме базовых функций в CryptoAPI существуют и функции вторичного кодирования бинарных данных, полученных из криптопровайдеров. Кодируют эти функции в формат ASN.1;
3) DER - Distinguished Encoding Rules, определенный набор правил кодирования внутренних структур ASN.1. Для первичного понимания не нужен;
4) Формат ASN.1 в свою очередь представляет собой заранее известную последовательность закодированных данных. Описание структуры ASN.1 в которую кодируются первичные бинарные данные заранее согласован и, например, для сертификатов первично был обозначен в стандарте ITU-T X.509. Сейчас же принято опираться на другой стандарт - RFC5280 (или более раннюю версию этого же стандарта RFC3280);
5) Стандарт PKCS#7 абсолютно не имеет никакого отношения к кодированию сертификата. Он явился первичным стандартом к тому, что в современном мире называется CMS - Cryptographic Message Syntax;
С уважением,
Юрий Строжевский
thanks 1 пользователь поблагодарил Юрий за этот пост.
Андрей * оставлено 05.03.2013(UTC)
Offline Андрей Писарев  
#35 Оставлено : 5 марта 2013 г. 11:48:35(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,770
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Юрий, спасибо за упоминание про RFC5280
Техническую поддержку оказываем тут
Наша база знаний
Offline Stalker4  
#36 Оставлено : 7 марта 2013 г. 16:09:28(UTC)
Stalker4

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2013(UTC)
Сообщений: 30
Украина

Сказал(а) «Спасибо»: 1 раз
Поработал с некоторыми функциями для сертификатов и подписи и возникли по ним
некоторые вопросы:

1) Функция CertSetCertificateContextProperty(CERT_KEY_PROV_INFO_PROP_ID)
привязывает сертификат к контейнеру с ключами.
При этом оказывается, что она не проверяет ни существование самого контейнера
ни наличие в контейнере ключей ни соответствие ключей из контейнера сертификату.

1.1) Это я ей не указал какие то параметры или она действительно не умеет это
делать ?
1.2) В привязки сертификата к контейнеру с ключами мне не понравился один
момент: получается, что после привязки, любой человек сможет на этом компе
подписать этим сертификатом (ключом) данные. Можно конечно динамически до
привязки создавать контейнер с ключами, а после подписания удалять контейнер
но это ИМНО не лучший вариант.
Вопрос: Можно ли создавать контейнер с ключами по пути указанным мною
(скажем этот контейнер будет на флешке) ?

2) Для подписи данных (файла) с сохранением подписи+сертификат в отдельном
файле (.p7s) использовал функцию CryptSignMessage. Кроме того добавил в
подпись через CRYPT_SIGN_MESSAGE_PARA (cAuthAttr, rgAuthAttr) время создания
подписи (szOID_RSA_signingTime).

2.1) Правильно ли я понимаю, что если в CRYPT_SIGN_MESSAGE_PARA (rgpMsgCert, cMsgCert)
указать не один сертификат (скажем сертификат автора подписи), а несколько
(скажем еще и сертификат издателя), то в файл .p7s будут сохранены все эти
сертификаты ?

2.2) Обнаружил, что CryptSignMessage не проверяет соответствие ключей в
контейнере привязанному к этому контейнеру сертификату
CRYPT_SIGN_MESSAGE_PARA.pSigningCert.
Так же CryptSignMessage не проверяет срок действия сертификата, подозреваю что
она вообще не делает ни каких проверок сертификата - можно ли этим сертификатом
подписывать данные.
Вопрос: Может я ей что то не указал, из за чего она не делает эти проверки ?
Или мне надо самому перед ее вызовом делать необходимые проверки ?

2.2.1)
Если самому, то какие функции CryptoAPI надо использовать для построение
цепочки сертификатов от сертификата пользователя до сертификата
самого верхнего уровня находящегося на текущем компе и выполнения проверок
для этих сертификатов
- подпись издателя на сертификате
- срок действия сертификата
- неотозваность сертификата
Или может для всех этих проверок есть некая одна высокоуровневая функция ?

Кстати, а в подписи издателя под сертификатом пользователя присутствует дата
подписи ? Если да, то надо ли ее проверять ?

3) Для проверки подписи использовал CryptVerifyDetachedMessageSignature.
Параметр PCRYPT_VERIFY_MESSAGE_PARA.pfnGetSignerCertificate не указывал, так
что функция брала сертификат из файла подписи (.p7s).

Похоже, что функция не делает ни каких проверок кроме простой проверки
хешей на манер CryptVerifySignature, разве что ключ она извлекает из
сертификата.
Вопрос: Может я ей что то не указал, из за чего она не делает эти проверки
(п. 2.2.1)?
Или мне надо самому перед (или после) ее вызова делать необходимые проверки ?

3.1) Получилось извлечь из .p7s кол-во подписей и дату самой подписи.
Для этого использовал CryptMsgOpenToDecode, CryptMsgUpdate(,True),
CryptMsgGetParam(,CMSG_SIGNER_COUNT_PARAM,),
CryptMsgGetParam(,CMSG_SIGNER_AUTH_ATTR_PARAM,).
Вопрос: Может есть более высокоуровневая функция для вытягивания из подписи
разных полей ?
Offline Юрий  
#37 Оставлено : 7 марта 2013 г. 20:12:45(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
1.1) Там просто записывается в определенное поле строка с именем контейнера и всё;
1.2) Контейнеры ключей существуют все зависимости от привязки к сертификату, это совершенно отдельные сущности. Для их защиты есть пароли на доступ к контейнерам, а также возможно создавать их на флешке. Наиболее интересные варианты - специализированные хранилища ключей вроде RuToken;

2.1) Да, там сохранятся все сертификаты. Советую все-таки почитать стандарт создания сертификатов (см. моё предыдущее сообщение);
2.2) Ещё раз - контейнеры ключей и сертификаты это совершенно разные сущности и связываются они искусственно;
2.2.1) Читать про "certificate verification chain" (CertCreateCertificateChainEngine);

3) Функция реально проверяет подпись и все. Никаких проверок на отозванность сертификатов она не делает;
3.1) Это и есть самые что ни на есть высокоуровневые функции, выше только звезды;

Отредактировано пользователем 8 марта 2013 г. 10:51:06(UTC)  | Причина: Не указана

С уважением,
Юрий Строжевский
Offline Stalker4  
#38 Оставлено : 9 марта 2013 г. 17:46:36(UTC)
Stalker4

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2013(UTC)
Сообщений: 30
Украина

Сказал(а) «Спасибо»: 1 раз
Автор: Юрий Перейти к цитате
Для их защиты есть пароли на доступ к контейнерам

То. что для экспорта/импорта из/в контейнер ключевой пары используется пароль я знаю.
А вот как просто для доступа к контейнеру задать пароль я не знаю. Как это можно сделать ?

Автор: Юрий Перейти к цитате
а также возможно создавать их на флешке

Вопрос: Как можно создать контейнер на флешке ?


4) Присутствует ли дата подписи в подписи издателя под сертификатом пользователя ? Если да, то надо ли ее проверять, в смысле надо ли проверять что сертификат пользователя был подписан в период действия сертификата издателя ? Или такие проверки не делаются, а весь вопрос заключается в том, доверяем ли мы издателю (СЦ) или нет ?

5) Как проверить, что файл подписан во время действия сертификата я знаю - берем из подписи ранее сохраненную туда дату подписи и сравниваем ее с периодом действия сертификата.
Вопрос: А вот как проверить, что на момент подписания файла сертификат не был отозван ? Может у отозванных сертификатов есть что то типа "даты отзыва" ?
Offline Андрей Писарев  
#39 Оставлено : 9 марта 2013 г. 18:37:23(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,770
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Автор: Stalker4 Перейти к цитате

Автор: Юрий Перейти к цитате
а также возможно создавать их на флешке

Вопрос: Как можно создать контейнер на флешке ?

При создании контейнера\его копировании - указывать путь (съемный диск:\имя контейнера)

Автор: Stalker4 Перейти к цитате

4) Присутствует ли дата подписи в подписи издателя под сертификатом пользователя ? Если да, то надо ли ее проверять, в смысле надо ли проверять что сертификат пользователя был подписан в период действия сертификата издателя ? Или такие проверки не делаются, а весь вопрос заключается в том, доверяем ли мы издателю (СЦ) или нет ?

Дата не присутствует.
Определить, что сертификат был издан в период действия сертификата УЦ - ... по дате начала действия пользовательского сертификата... она должна быть позже начала действия сертификата УЦ... и раньше окончания срока действия сертификата УЦ (точнее, думаю, раньше окончания срока действия закрытого ключа УЦ, обычно, 1 год)

Автор: Stalker4 Перейти к цитате

5) Как проверить, что файл подписан во время действия сертификата я знаю - берем из подписи ранее сохраненную туда дату подписи и сравниваем ее с периодом действия сертификата.

Здесь нельзя доказать, что время в подписи "корректно".
Что мешает пользователю с просроченным сертификатом изменить локальное время и сделать подписание "в прошлом", когда сертификат действовал? Для решения этой "проблемы" - есть штампы времени (TSP)...
Time Stamp Protocol

Автор: Stalker4 Перейти к цитате

Вопрос: А вот как проверить, что на момент подписания файла сертификат не был отозван ? Может у отозванных сертификатов есть что то типа "даты отзыва" ?

2 варианта:
1) CRL (дата\время и причина отзыва) - по текущему локальному или полученному от УЦ - для проверки наличия в отозванных...
2) OCSP - онлайн проверка статуса сертификата
(Online Certificate Status Protocol)
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#40 Оставлено : 9 марта 2013 г. 18:50:04(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,770
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Автор: Stalker4 Перейти к цитате

Автор: Юрий Перейти к цитате
а также возможно создавать их на флешке

Вопрос: Как можно создать контейнер на флешке ?


Рекомендую, все же скачать SDK - там есть примеры по работе с CryptoAPI

\sdk\samples\CSP\CreatingKeyContainer\CreatingKeyContainer.c



Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
5 Страницы«<2345>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.