| ||||
| ||||
Есть Сервер и Клиент. Клиент у себя генерит ключевую пару для ЭЦП (желательно без использования контейнеров), выгружает оба ключа в файлы, передает открытый ключ Серверу, и шлет ему подписанные на секретном ключе данные. Сервер проверяет подпись на полученном открытом ключе. Желательно НЕ хранить ключи в контейнерах на обеих сторонах. Как можно проще всего это реализовать? | ||||
Ответы: | ||||
| ||||
Ключевая пара подписи может храниться либо в контейнере (в реестре или на съемном носителе), либо в файле. С точки зрения пользователя, как мне кажется, большой разницы нет - для создания ЭЦП нужно предоставить носитель ключевой информации. При использовании нашего криптопровайдера возможности экспорта ключей в файл нет (по требованиям безопасности). Поэтому ключевая пара ЭЦП может храниться только в контейнере. | ||||
| ||||
"Ключевая пара подписи может храниться либо в контейнере, либо в файле." и "При использовании нашего криптопровайдера возможности экспорта ключей в файл нет (по требованиям безопасности)." 1. Чему верить? 2. По каким требованиям безопасности? Иметь ЗАКРЫТЫЙ ключ в файле это нормально и общепринято. 3. Что тогда выгружает CryptExportKey( ... PRIVATEKEYBLOB ... ) ? | ||||
| ||||
1. CSP бывают разные. Например, для MS CSP - ключевая пара может быть в контейнере или в файле сертификата. 2. Нормально-то нормально, но общепринято ли - большой вопрос. 3. Блоб закрытого ключа (который получается в результате CryptExportKey) - совсем другой объект, работать с ним можно только на более низком уровне, при этом всё равно потребуется импортировать этот блоб в контейнер. | ||||
| ||||
"общепринято ли - большой вопрос." А где ж ещё? В контейнерах? Дык это только в CSP они есть. А так везде в файлах. Могу ли я создать контейнер, выгрузить секретный/открытый блобы, не глядя в их нутрь сохранить в файл, удалить ключи из контейнера и потом по надобности импортировать обратно? | ||||
| ||||
Почему такая нелюбовь к контейнерам? :-) Ключевой контейнер нашего CSP, записанный на дискете (или другом съемном носителе), передставляет собой несколько файлов специального формата, в которых содержится, кроме собственно ключей, информация об алгоритмах и их параметрах, средства контроля целостности и восстановления при сбоях, а также может быть записан сертификат открытого ключа. Конечно, можно каждый раз создавать в памяти новый контейнер, импортировать в него из блоба закрытые ключи, но, ведь по сути дела ту же процедуру делает CSP при считывании ключа из контейнера. То есть Вы просто усложните себе жизнь - вместо пары вызовов для считывания ключа - CryptAcquireContext, CryptGetUserKey будет нужно больше: CryptAcquireContext, CryptSetProvParam, CryptImportKey, CryptSetKeyParam, кроме того, придётся разбираться с идентификаторами алгоритмов и других параметров, кроме того, нет явной связи с сертификатом открытого ключа (если его использовать для проверки ЭЦП, если не использовать - тогда совсем не ясна связь между ключом и его владельцем, то есть Вам придется делать свой вариант PKI для распределения ключей клиентам и проверки их на сервере) | ||||
| ||||
Да потому что не нужны мне эти контейнеры! Приведенную в моем первом посте схему я реализовал элементарно, без контейнеров, но на симметричных ключах. И все работает просто и понятно. На Сервере все ключи клиентов хранятся в моей базе в удобном мне формате. А тут я не понимаю как хранить в контейнере 500 ключей, и обращатся к нужным ключам. Или делать для каждого ключа контейнер? И как, например, делать бэкап контейнеров? Я делаю бэкап базы. Мне надо то только заменить симметричный ключ на пару, отдать клиенту файлик с закрытым ключем и прописать в СВОЕЙ, удобной МНЕ базе на Сервере открытый ключ. Может просто напишите 5 строк кода как же все-таки создать пару ключей и выгрузить эти блобы? Как я не пробовал, выдает ошибку NTE_BAD_KEY_STATE Спасибо. | ||||
| ||||
Контейнеры будут только у клиентов - по штуке на лицо. Вообще, считается, что свои закрытые ключи клиент хранит (и бэкапирует) сам и никому их не передаёт. Весь смысл ЭЦП в установлении авторства подписывателя. А для этого он должен быть уверен, что владеет ключом один. На сервере нужны только открытые ключи клиентов - в виде сертификатов или в виде блобов PUBLICKEYBLOB. Примеры есть в http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip | ||||