Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Несколько общих вопросов по работе с сертификатами и ЭЦП
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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. но я честно говоря не понял, как именно надо привязать к сертификату ссылку на контейнер с закрытым ключом.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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. но сделать привязку можно и у себя в приложении, если такое необходимо... |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,770   Сказал «Спасибо»: 579 раз Поблагодарили: 2307 раз в 1807 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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; |
С уважением, Юрий Строжевский |
 1 пользователь поблагодарил Юрий за этот пост.
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,770   Сказал «Спасибо»: 579 раз Поблагодарили: 2307 раз в 1807 постах
|
Юрий, спасибо за упоминание про RFC5280 |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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,). Вопрос: Может есть более высокоуровневая функция для вытягивания из подписи разных полей ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
С уважением, Юрий Строжевский |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 19.02.2013(UTC) Сообщений: 30  Сказал(а) «Спасибо»: 1 раз
|
Автор: Юрий  Для их защиты есть пароли на доступ к контейнерам То. что для экспорта/импорта из/в контейнер ключевой пары используется пароль я знаю. А вот как просто для доступа к контейнеру задать пароль я не знаю. Как это можно сделать ? Автор: Юрий  а также возможно создавать их на флешке Вопрос: Как можно создать контейнер на флешке ? 4) Присутствует ли дата подписи в подписи издателя под сертификатом пользователя ? Если да, то надо ли ее проверять, в смысле надо ли проверять что сертификат пользователя был подписан в период действия сертификата издателя ? Или такие проверки не делаются, а весь вопрос заключается в том, доверяем ли мы издателю (СЦ) или нет ? 5) Как проверить, что файл подписан во время действия сертификата я знаю - берем из подписи ранее сохраненную туда дату подписи и сравниваем ее с периодом действия сертификата. Вопрос: А вот как проверить, что на момент подписания файла сертификат не был отозван ? Может у отозванных сертификатов есть что то типа "даты отзыва" ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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) |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,770   Сказал «Спасибо»: 579 раз Поблагодарили: 2307 раз в 1807 постах
|
Автор: Stalker4  Автор: Юрий  а также возможно создавать их на флешке Вопрос: Как можно создать контейнер на флешке ? Рекомендую, все же скачать SDK - там есть примеры по работе с CryptoAPI \sdk\samples\CSP\CreatingKeyContainer\ CreatingKeyContainer.c |
|
|
|
|
Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Несколько общих вопросов по работе с сертификатами и ЭЦП
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close