Речь пойдет о файлах primary.key, masks.key и header.key, которые лежат в директории ххххх.000 на флешке. Данные файлы входят в состав криптоконтейнера закрытого ключа электронной подписи криптопровайдера КриптоПро, формат которого нигде не опубликован. Целью данной статьи является чтение контейнера и преобразование закрытого ключа в формат, который может быть прочитан в библиотеке OpenSSL. Долгое время было распространено ошибочное суждение, что достаточно сделать нечто вида (primary_key XOR masks_key) и мы получим закрытый ключ в чистом (raw) виде, однако забегая вперед, можно утверждать, что в КриптоПро было применено более сложное преобразование, в худшем случае состоящее из более чем 2000 (двух тысяч) операций хеширования.
Стоит упомянуть о существовании утилиты P12FromGostCSP
которая позволяет конвертировать ключ в формат P12, доступный для работы с OpenSSL, но утилита имеет следующие существенные недостатки:
- Читает контейнер не напрямую, а через криптопровайдер, поэтому там, где кроме OpenSSL ничего нет, не работает.
- Если в свойствах ключа не отмечено, что ключ «экспортируемый», то конвертировать его невозможно.
- В демо версии не формирует файл с ключом, эта возможность присутствует только в платной версии.
- Файл primary. key
- Файл masks. key
- Файл header. key
- Читаем закрытый ключ и конвертируем
- Сборка утилиты конвертирования ключа
- Компиляция OpenSSL библиотеки
- Компиляция privkey.c
- Формирование файла закрытого ключа private.key
- Пользуемся закрытым ключом private.key для подписывания файла file.txt
- Проверяем подпись
- Экспорт закрытого ключа
- (Рис. 8). Рис. 8. Экспортирование закрытого ключа Отметьте следующие пункты: «Файл обмена личной информацией – PKCS #12», «Включить по возможности все сертификаты в путь сертификации» и «Экспортировать все расширенные свойства» , затем нажмите кнопку «Далее» (Рис. 9). Рис. 9. Экспортированный сертификат Укажите пароль и подтверждение пароля , затем нажмите кнопку «Далее» (Рис. 10). Рис. 10. Безопасность Далее укажите имя файла, используя «Обзор» , затем нажмите кнопку «Далее» (Рис. 11). Рис. 11. Имя экспортируемого файла Далее нажмите «Готово» (Рис. 12). Рис. 12. Экспортирование закрытого ключа Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13). Рис. 13. Чтение ключевой информации Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14). Рис. 14. Завершение экспорта Импорт закрытого ключа Для установки закрытой части ключа откройте файл, сохранённый ранее (Рис. 15). Рис. 15. Файл, сохранённый ранее Откроется «Мастер импорта сертификатов», нажмите кнопку «Далее» (Рис. 16). Рис. 16. Мастер импорта сертификатов Укажите файл, который нужно импортировать, используя кнопку «Обзор», затем нажмите «Далее» (Рис. 17). Рис. 17. Импортируемый файл Далее введите пароль , отметьте пункт «Пометить этот ключ как экспортируемый, что позволит сохранять резервную копию ключа и перемещать его.» , затем нажмите кнопку «Далее» (Рис. 18). Рис. 18 Защита с помощью закрытого ключа Отметьте пункт «Поместить все сертификаты в следующее хранилище» , нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное» и нажмите «Ок» . В окне мастера настроек нажмите «Далее» (Рис. 19). Рис. 19. Выбор хранилища сертификата Нажмите «Готово» (Рис. 20). Рис. 20. Завершение мастера импорта сертификатов В открывшемся окне КриптоПро CSP выберите носитель, на который будет импортирован ключ, затем нажмите «Ок» (Рис. 21). Рис. 21. Выбор носителя Далее укажите новый пароль и его подтверждение (Рис. 22). Рис. 22. Указание пароля Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 23). Рис. 23. Чтение ключевой информации Далее введите пароль (Рис. 24). Рис. 24. Пароль для контейнера Далее нажмите «Ок» (Рис. 25). Рис. 25. Чтение ключевой информации Импорт успешно будет выполнен (Рис. 26). Рис. 26. Заверщение импорта Далее выполните установку личного сертификата по инструкции: /ru-ru/support/kb/333#1 . Как самостоятельно изготовить электронную подпись Время на прочтение Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста». Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз. Что такое электронная подпись Все термины и определения приведены в законе , поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок. Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова. Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации. Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла ), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа . Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно. Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку. Ситуация кардинально меняется, если изобретен замок с двумя ключами : один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания ), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал. Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш. Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки. Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа: изготавливает его хэш с помощью стандартного алгоритма; расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича; убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля! Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр). Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр , который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова. Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн. Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру ) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру. Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать. Генерирование открытого и секретного ключей Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key). Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win . Ниже будет описана работа из-под Линукса. Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root’а) команду gpg --full-generate-key В процессе генерирования вам будет предложено ответить на ряд вопросов: тип ключей можно оставить «RSA и RSA (по умолчанию)»; длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит; в качестве срока действия ключа для личного использования можно выбрать «не ограничен»; в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать; в качестве примечания можно указать город, либо иную дополнительную информацию. После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет. Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат: gpg --export -a "Иван Иванович Иванов" > public.key gpg --export-secret-key -a "Иван Иванович Иванов" > private.key Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим. Подписание документа Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате: gpg -ba имя_подписываемого_файла Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально. Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую: #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import * import os, sys, tkMessageBox def die(event): sys.exit(0) root = Tk() w = root.winfo_screenwidth()//2 - 400 h = root.winfo_screenheight()//2 - 300 root.geometry("800x600+{}+{}".format(w, h)) root.title("Подписать документ") flName = askopenfilename(title="Что подписываем?") if flName: os.system("gpg -ba " + flName) button = Button(text="ЭЦП создана") button.bind("<Button-1>", die) button.pack(expand=YES, anchor=CENTER) else: die() root.mainloop() Проверка подписи Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще: gpg --verify имя_файла_подписи имя_файла_документа В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации): открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG; веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами. Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала. К счастью для нас, имеется свободная библиотека OpenPGP.js ; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги): <!DOCTYPE html> <html> <head><meta charset="utf-8"></head> <body> <label for="doc">Загрузите файл с документом</label> <input id="doc" type="file" onChange="readDoc('doc')"> <label for="sig">Загрузите файл с подписью</label> <input id="sig" type="file" onChange="readDoc('sig')"> <button type="button" disabled onClick="check()">Проверить</button> <output></output> <script src="openpgp.min.js"></script> <script src="validate.js"></script> </body> </html> Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка. Вся работа по верификации подписей будет производиться подключенным скриптом validate.js : "use strict"; let cont = {doc:'', sig:''}, flag = {doc:false, sig:false}, pubkey = '', mess = ''; // Чтение файлов документа (как бинарного), // ключа и подписи (как текстовых) const readDoc = contKey => { let reader = new FileReader(); reader.onload = async e => { cont[contKey] = contKey == "sig" ? e.target.result : new Uint8Array(e.target.result); flag[contKey] = true; pubkey = await (await fetch("public.key")).text(); if (flag["doc"] && flag["sig"]) document.querySelector("button").disabled = false; } reader.onerror = err => alert("Ошибка чтения файла"); let fileObj = document.querySelector(`#${contKey}`).files[0]; if (contKey == "sig") reader.readAsText(fileObj); else reader.readAsArrayBuffer(fileObj); } // Верификация подписи const check = async () => { try { const verified = await openpgp.verify({ message: openpgp.message.fromBinary(cont["doc"]), signature: await openpgp.signature.readArmored(cont["sig"]), publicKeys: (await openpgp.key.readArmored(pubkey)).keys }); const {valid} = verified.signatures[0]; mess = "Электронная подпись НЕ является подлинной!"; if (valid) mess = "Электронная подпись является подлинной."; } catch(e) {mess = "Файл подписи имеет недопустимый формат.";} document.querySelector("output").innerHTML = mess; } Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку: Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть). Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись , обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур. Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й. 2. Если у вас токен (Рутокен например) Прежде чем система сможет с ним работать понадобится установить нужный драйвер. Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/ Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta Алгоритм такой: Скачиваем; Устанавливаем. Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей . 3. Если закрытый ключ в виде файлов Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key (Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр) Нашли файлы, записали на флешку, переходим к следующему шагу. 4. Установка сертификата из закрытого ключа Теперь нам нужно получить сертификат, сделать это можно следующим образом: Открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Просмотреть сертификаты в контейнере , нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее , появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да») После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер) 5. Использование электронной подписи без токена или флешки (установка в реестр) Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий: Выполните подготовку закрытого ключа, описанную в пунктах или Далее открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Скопировать С помощью кнопки Обзор выбираем наш ключ Нажимаем кнопку Далее , потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта . Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия. Время на прочтение Продолжая раскрывать тайное знание о цифровой подписи простым языком, разберем, что же нам надо для удобной и эффективной работы с ними, а также главное различие между лагерями S/MIME + X.509 и PGP. Перед тем, как рассматривать особенности этих двух больших лагерей, стоит рассмотреть, какая информация нужна получателю для проверки подписи (а наш зашифрованный хэш уже вполне можно называть подписью), и в каком виде ее можно ему передать. Значит, надо связать каждый открытый ключ с информацией о том, кому этот ключ принадлежит, и присылать это все одним пакетом. Тогда проблема реестра решается сама собой – пакет (а если более правильно, контейнер) с открытым ключом можно будет просто посмотреть и сразу понять его принадлежность. Но эту информацию все так же надо связать с подписью, пришедшей получателю. Как это сделать? Надо соорудить еще один контейнер, на сей раз для передачи подписи, и в нем продублировать информацию о том, кто эту подпись создавал. Продолжая нашу аналогию с красивым замком, мы пишем на ключе «Этот ключ открывает замок В. Пупкина». А на замке тоже пишем «Замок В. Пупкина». Имея такую информацию, получатель нашей коробочки не будет каждый из имеющихся у него ключей вставлять наугад в наш замок, а возьмет наш ключ и сразу его откроет. А собственно, что «и»? Мы ведь пока так и не решили проблему, как донести до получателя информацию о том, какая хэш-функция применялась для хэша, а ведь для проверки подписи эта информация необходима ! Решить ее можно достаточно просто: положить эту информацию в контейнер вместе с нашим открытым ключом. Ведь именно связка «хэширование – шифрование результата хеширования» считается процедурой создания цифровой подписи, а ее результат – подписью. А значит, достаточно логичным представляется объединение в связку алгоритма шифрования хэша и хэш-функции, с помощью которой он сформирован. И доставлять эту информацию тоже надо в связке. Теперь, ненадолго вернемся к информации о подписывающем. Какого рода эта информация должна быть? ФИО? Нет, В. Пупкиных много. Ф ИО + год рождения? Так и родившихся в один день В. Пупкиных тоже предостаточно! Более того, это может быть Василий, Виктор, или даже Василиса или Виктория Пупкины. Значит, информации должно быть больше. Ее должно быть столько, чтобы совпадение всех параметров, по которым мы идентифицируем человека, было максимально невероятным. Безусловно, такой пакет информации создать возможно. Вот только, работать с ним уже трудновато. Ведь надо наши контейнеры открытых ключей надо сортировать, хранить, использовать, в конце концов. А если для каждого использования придется указывать по полсотни параметров, то уже на втором контейнере станет понятно, что что-то надо менять. Решение этой проблемы, конечно же, было найдено. Чтобы понять, в чем же оно заключалось, обратимся к бумажному документу, который есть у всех нас: к паспорту. В нем можно найти и ФИО, и дату рождения, и пол, и много другой информации. Но, главное, в нем можно найти серию и номер. И именно серия и номер являются той уникальной информацией, которую удобно учитывать и сортировать. Кроме того, они существенно короче всей оставшейся информации вместе взятой, и при этом все так же позволяют опознать человека. Применяя этот же подход к контейнерам открытых ключей, мы получим, что у каждого контейнера должен быть некий номер, последовательность символов, уникальная для него. Эту последовательность символов принято называть идентификатором , а сами контейнеры – сертификатами , либо просто ключами. Вот здесь и начинаются принципиальные различия в идеологиях OpenPGP и S/MIME + X.509. Для краткого понимания их, вернемся к нашей аналогии с паспортом. Паспорт вы можете использовать при покупках билетов, при оформлении документов, для выдачи пропуска на какую-либо территорию и даже на территории других стран! То есть, вы используете его для идентификации вашей личности в самых различных, зачастую абсолютно не связанных друг с другом, местах, с самыми различными людьми. И везде ваш паспорт принимают. Гарантом того, что вы – это вы выступает третья сторона в ваших взаимоотношениях с другими: государство. Именно оно выдало вам ваш паспорт, специально оформленный, подписанный и заверенный, и именно поэтому ваш паспорт является таким универсальным документом. С другой стороны, в кругу друзей, или внутри компании вам достаточно представиться так: «В. Пупкин из твоей группы в институте» или же «В. Пупкин из отдела продаж». И людям, с которыми вы контактируете в этом кругу уже не нужна третья сторона, они и так помнят Пупкина из группы с которым проучились пять лет, или Пупкина из отдела продаж, с которым недавно ходили обедать, и предоставленной вами информации им вполне достаточно. Так же можно разделить и эти два лагеря. Сертификат X.509 – это аналог нашего паспорта. Здесь сертификаты вам выдаются суровой третьей стороной, гарантом вашей личности: Удостоверяющим Центром (УЦ). Получающий ваши подписи человек всегда может обратиться в УЦ и спросить интересующую его информацию по вот этому конкретному сертификату. PGP же (и стандарт OpenPGP, появившийся в дальнейшем) создавался на основе так называемых сетей доверия. Такая идея подразумевает, что обмениваются подписями люди, которым третья сторона для их взаимоотношений не нужна, а нужна только защита от нехороших лиц. Конечно, с течением времени такое разделение стало уже достаточно условным, так как на данный момент и в S/MIME+X.509 и в PGP можно использовать методы лагеря соперников. Но все же, стандарты достаточно продолжительное время развивались параллельно и развились до той степени, что взаимная совместимость между ними стала невозможной. Более популярным стандартном, в силу своей ориентированности на участие более компетентной третьей стороны, стал стандарт S/MIME + X.509, однако и у PGP есть некоторое количество козырей за пазухой, с помощью которых он не только не погибает, но и продолжает успешно развиваться. Более подробное рассмотрение каждого из форматов, а также рекомендации, когда, где и какой из них использовать вы сможете прочитать уже в следующих статьях. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установить личный сертификат можно двумя способами: Установка через меню «Просмотреть сертификаты в контейнере» 1. Выберите «Пуск» > «Панель управления» > «КриптоПро CSP», перейдите на вкладку «Сервис» и кликните по кнопке «Просмотреть сертификаты в контейнере». 2. В открывшемся окне нажмите на кнопку «Обзор», чтобы выбрать контейнер для просмотра. После выбора контейнера нажмите на кнопку «Ок». 3. В окне нажмите кнопку «Далее». 4. В окне нажмите на кнопку Установить», после чего утвердительно ответьте на уведомление о замене сертификата (если оно появится). 5. Если кнопка Установить отсутствует, то в окне Сертификат для просмотра нажмите на кнопку Свойства 6. В открывшемся окне выберите Установить сертификат. 7. В окне Мастер импорта сертификатов выберите Далее . В следующем окне оставьте переключатель на пункте Автоматически выбрать хранилище на основе типа сертификата и нажмите Далее. Сертификат будет установлен в хранилище Личные. 8. В следующем окне выберите Далее, затем нажмите на кнопку Готово и дождитесь сообщения об успешной установке. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установка через меню «Установить личный сертификат» 1. Выберите Пуск > Панель управления > КриптоПро CSP. В окне Свойства КриптоПро CSP перейдите на вкладку Сервис и кликните по кнопке Установить личный сертификат. 2. В окне Мастер импорта сертификатов» нажмите на кнопку Далее. В следующем окне кликните по кнопке Обзор файл сертификата. 3. Далее укажите путь к сертификату и нажмите на кнопку ОткрытьДалее . 4. В следующем окне кликните по кнопке Далее 5. Нажмите кнопку Обзор . 6. Укажите контейнер закрытого ключа, соответствующий сертификату, и нажмите кнопку Ок 7. После выбора контейнера нажмите на кнопку Далее . 8. В окне Выбор хранилища сертификатов кликните по кнопке Обзор Если установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, то поставьте галку Установить сертификат в контейнер 9. Выберите хранилище Личные и нажмите ОК. 10. После выбора хранилища нажмите на кнопку Далее, затем Готово. После нажатия на кнопку Готово может появиться вопрос о замене существующего сертификата новым. В окне запроса выберите Да. Дождитесь сообщения об успешной установке. Сертификат установлен. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Копирование контейнера закрытого ключа в реестр Рис. 1. Пуск Перейдите во вкладку «Сервис» (Рис. 2). Рис. 2. Сервис Далее в форме «Контейнер закрытого ключа» нажмите кнопку «Скопировать» (Рис. 3). Рис. 3. Контейнер закрытого ключа Далее используйте один из способов: Способ 1. Нажмите кнопку «Обзор» и выберите необходимый для копирования ключевой контейнер и нажмите «Ок» (Рис. 4). Рис. 4. Выбор ключевого контейнера Способ 2. Можно найти нужный контейнер по сертификату. Для этого нажмите кнопку «По сертификату», в открывшемся окне выберите сертификат для копирования в реестр и нажмите кнопку «Ок» (Рис. 5). Рис. 5. Выбор сертификата Нажмите кнопку «Далее» (Рис. 6). Рис. 6. Контейнер закрытого ключа В случае, если при создании ключа не был установлен флаг на разрешение его копирования, система выдаст ошибку. В этом случае обратитесь в Удостоверяющий центр, выдавший данный сертификат ЭП (Рис. 7). Рис. 7. Ошибка копирования контейнера Если ошибка не возникла, далее введите имя для создаваемого ключевого контейнера и нажмите кнопку «Готово» (Рис. 8). Рис. 8. Указание имени создаваемого ключевого контейнера Откроется окно, в котором нужно выбрать носитель для скопированного контейнера. Чтобы подписывать без USB-носителя, выберите «Реестр» и нажмите кнопку «Ок» (Рис. 9). Рис. 9. Выбор устройства Откроется окно для подтверждения, нажмите кнопку «Ок» (Рис. 10). Рис. 10. Чтение ключевой информации Далее откроется окно установки пароля на доступ к закрытому ключу. При необходимости введите пароль, подтвердите его, и нажмите кнопку «Ок» (Рис. 11-12). Рис. 11. Пароль для создаваемого контейнера В окне записи дважды нажмите «Ок» (Рис. 12). Рис. 12. Запись информации СКЗИ «КриптоПро CSP» скопирует контейнер закрытого ключа и по завершению отобразит соответствующее сообщение (Рис. 13). Рис. 13. Завершение копирования Далее нужно выполнить привязку личного сертификата к закрытому контейнеру, который находится в реестре. Для этого извлеките из ПК USB-накопитель и откройте «КриптоПро CSP» (Рис. 14). Рис. 14. Меню «Пуск» В открывшейся программе перейдите во вкладку «Сервис», затем нажмите «Просмотреть сертификаты в контейнере» (Рис. 15). Рис. 15. Вкладка «Сервис» В открывшемся окне нажмите кнопку «Обзор» (Рис. 16). Рис. 16. Окно «Сертификаты в контейнере закрытого ключа» Выберите ключевой контейнер из списка и нажмите кнопку «Ок» (Рис. 17). Рис. 17. Выбор ключевого контейнера В окне «Сертификаты в контейнере закрытого ключа» нажмите кнопку «Далее» (Рис. 18). Рис. 18. Окно «Сертификаты в контейнере закрытого ключа» Затем нажмите кнопку «Установить» (Рис. 19). Рис. 19. Просмотр сертификата Рис. 20. Предупреждающее окно Сертификат установится в хранилище «Личные» текущего пользователя.
- (Рис. 9). Рис. 9. Экспортированный сертификат Укажите пароль и подтверждение пароля , затем нажмите кнопку «Далее» (Рис. 10). Рис. 10. Безопасность Далее укажите имя файла, используя «Обзор» , затем нажмите кнопку «Далее» (Рис. 11). Рис. 11. Имя экспортируемого файла Далее нажмите «Готово» (Рис. 12). Рис. 12. Экспортирование закрытого ключа Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13). Рис. 13. Чтение ключевой информации Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14). Рис. 14. Завершение экспорта Импорт закрытого ключа Для установки закрытой части ключа откройте файл, сохранённый ранее (Рис. 15). Рис. 15. Файл, сохранённый ранее Откроется «Мастер импорта сертификатов», нажмите кнопку «Далее» (Рис. 16). Рис. 16. Мастер импорта сертификатов Укажите файл, который нужно импортировать, используя кнопку «Обзор», затем нажмите «Далее» (Рис. 17). Рис. 17. Импортируемый файл Далее введите пароль , отметьте пункт «Пометить этот ключ как экспортируемый, что позволит сохранять резервную копию ключа и перемещать его.» , затем нажмите кнопку «Далее» (Рис. 18). Рис. 18 Защита с помощью закрытого ключа Отметьте пункт «Поместить все сертификаты в следующее хранилище» , нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное» и нажмите «Ок» . В окне мастера настроек нажмите «Далее» (Рис. 19). Рис. 19. Выбор хранилища сертификата Нажмите «Готово» (Рис. 20). Рис. 20. Завершение мастера импорта сертификатов В открывшемся окне КриптоПро CSP выберите носитель, на который будет импортирован ключ, затем нажмите «Ок» (Рис. 21). Рис. 21. Выбор носителя Далее укажите новый пароль и его подтверждение (Рис. 22). Рис. 22. Указание пароля Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 23). Рис. 23. Чтение ключевой информации Далее введите пароль (Рис. 24). Рис. 24. Пароль для контейнера Далее нажмите «Ок» (Рис. 25). Рис. 25. Чтение ключевой информации Импорт успешно будет выполнен (Рис. 26). Рис. 26. Заверщение импорта Далее выполните установку личного сертификата по инструкции: /ru-ru/support/kb/333#1 . Как самостоятельно изготовить электронную подпись Время на прочтение Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста». Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз. Что такое электронная подпись Все термины и определения приведены в законе , поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок. Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова. Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации. Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла ), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа . Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно. Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку. Ситуация кардинально меняется, если изобретен замок с двумя ключами : один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания ), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал. Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш. Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки. Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа: изготавливает его хэш с помощью стандартного алгоритма; расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича; убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля! Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр). Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр , который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова. Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн. Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру ) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру. Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать. Генерирование открытого и секретного ключей Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key). Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win . Ниже будет описана работа из-под Линукса. Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root’а) команду gpg --full-generate-key В процессе генерирования вам будет предложено ответить на ряд вопросов: тип ключей можно оставить «RSA и RSA (по умолчанию)»; длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит; в качестве срока действия ключа для личного использования можно выбрать «не ограничен»; в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать; в качестве примечания можно указать город, либо иную дополнительную информацию. После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет. Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат: gpg --export -a "Иван Иванович Иванов" > public.key gpg --export-secret-key -a "Иван Иванович Иванов" > private.key Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим. Подписание документа Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате: gpg -ba имя_подписываемого_файла Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально. Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую: #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import * import os, sys, tkMessageBox def die(event): sys.exit(0) root = Tk() w = root.winfo_screenwidth()//2 - 400 h = root.winfo_screenheight()//2 - 300 root.geometry("800x600+{}+{}".format(w, h)) root.title("Подписать документ") flName = askopenfilename(title="Что подписываем?") if flName: os.system("gpg -ba " + flName) button = Button(text="ЭЦП создана") button.bind("<Button-1>", die) button.pack(expand=YES, anchor=CENTER) else: die() root.mainloop() Проверка подписи Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще: gpg --verify имя_файла_подписи имя_файла_документа В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации): открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG; веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами. Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала. К счастью для нас, имеется свободная библиотека OpenPGP.js ; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги): <!DOCTYPE html> <html> <head><meta charset="utf-8"></head> <body> <label for="doc">Загрузите файл с документом</label> <input id="doc" type="file" onChange="readDoc('doc')"> <label for="sig">Загрузите файл с подписью</label> <input id="sig" type="file" onChange="readDoc('sig')"> <button type="button" disabled onClick="check()">Проверить</button> <output></output> <script src="openpgp.min.js"></script> <script src="validate.js"></script> </body> </html> Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка. Вся работа по верификации подписей будет производиться подключенным скриптом validate.js : "use strict"; let cont = {doc:'', sig:''}, flag = {doc:false, sig:false}, pubkey = '', mess = ''; // Чтение файлов документа (как бинарного), // ключа и подписи (как текстовых) const readDoc = contKey => { let reader = new FileReader(); reader.onload = async e => { cont[contKey] = contKey == "sig" ? e.target.result : new Uint8Array(e.target.result); flag[contKey] = true; pubkey = await (await fetch("public.key")).text(); if (flag["doc"] && flag["sig"]) document.querySelector("button").disabled = false; } reader.onerror = err => alert("Ошибка чтения файла"); let fileObj = document.querySelector(`#${contKey}`).files[0]; if (contKey == "sig") reader.readAsText(fileObj); else reader.readAsArrayBuffer(fileObj); } // Верификация подписи const check = async () => { try { const verified = await openpgp.verify({ message: openpgp.message.fromBinary(cont["doc"]), signature: await openpgp.signature.readArmored(cont["sig"]), publicKeys: (await openpgp.key.readArmored(pubkey)).keys }); const {valid} = verified.signatures[0]; mess = "Электронная подпись НЕ является подлинной!"; if (valid) mess = "Электронная подпись является подлинной."; } catch(e) {mess = "Файл подписи имеет недопустимый формат.";} document.querySelector("output").innerHTML = mess; } Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку: Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть). Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись , обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур. Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й. 2. Если у вас токен (Рутокен например) Прежде чем система сможет с ним работать понадобится установить нужный драйвер. Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/ Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta Алгоритм такой: Скачиваем; Устанавливаем. Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей . 3. Если закрытый ключ в виде файлов Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key (Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр) Нашли файлы, записали на флешку, переходим к следующему шагу. 4. Установка сертификата из закрытого ключа Теперь нам нужно получить сертификат, сделать это можно следующим образом: Открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Просмотреть сертификаты в контейнере , нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее , появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да») После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер) 5. Использование электронной подписи без токена или флешки (установка в реестр) Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий: Выполните подготовку закрытого ключа, описанную в пунктах или Далее открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Скопировать С помощью кнопки Обзор выбираем наш ключ Нажимаем кнопку Далее , потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта . Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия. Время на прочтение Продолжая раскрывать тайное знание о цифровой подписи простым языком, разберем, что же нам надо для удобной и эффективной работы с ними, а также главное различие между лагерями S/MIME + X.509 и PGP. Перед тем, как рассматривать особенности этих двух больших лагерей, стоит рассмотреть, какая информация нужна получателю для проверки подписи (а наш зашифрованный хэш уже вполне можно называть подписью), и в каком виде ее можно ему передать. Значит, надо связать каждый открытый ключ с информацией о том, кому этот ключ принадлежит, и присылать это все одним пакетом. Тогда проблема реестра решается сама собой – пакет (а если более правильно, контейнер) с открытым ключом можно будет просто посмотреть и сразу понять его принадлежность. Но эту информацию все так же надо связать с подписью, пришедшей получателю. Как это сделать? Надо соорудить еще один контейнер, на сей раз для передачи подписи, и в нем продублировать информацию о том, кто эту подпись создавал. Продолжая нашу аналогию с красивым замком, мы пишем на ключе «Этот ключ открывает замок В. Пупкина». А на замке тоже пишем «Замок В. Пупкина». Имея такую информацию, получатель нашей коробочки не будет каждый из имеющихся у него ключей вставлять наугад в наш замок, а возьмет наш ключ и сразу его откроет. А собственно, что «и»? Мы ведь пока так и не решили проблему, как донести до получателя информацию о том, какая хэш-функция применялась для хэша, а ведь для проверки подписи эта информация необходима ! Решить ее можно достаточно просто: положить эту информацию в контейнер вместе с нашим открытым ключом. Ведь именно связка «хэширование – шифрование результата хеширования» считается процедурой создания цифровой подписи, а ее результат – подписью. А значит, достаточно логичным представляется объединение в связку алгоритма шифрования хэша и хэш-функции, с помощью которой он сформирован. И доставлять эту информацию тоже надо в связке. Теперь, ненадолго вернемся к информации о подписывающем. Какого рода эта информация должна быть? ФИО? Нет, В. Пупкиных много. Ф ИО + год рождения? Так и родившихся в один день В. Пупкиных тоже предостаточно! Более того, это может быть Василий, Виктор, или даже Василиса или Виктория Пупкины. Значит, информации должно быть больше. Ее должно быть столько, чтобы совпадение всех параметров, по которым мы идентифицируем человека, было максимально невероятным. Безусловно, такой пакет информации создать возможно. Вот только, работать с ним уже трудновато. Ведь надо наши контейнеры открытых ключей надо сортировать, хранить, использовать, в конце концов. А если для каждого использования придется указывать по полсотни параметров, то уже на втором контейнере станет понятно, что что-то надо менять. Решение этой проблемы, конечно же, было найдено. Чтобы понять, в чем же оно заключалось, обратимся к бумажному документу, который есть у всех нас: к паспорту. В нем можно найти и ФИО, и дату рождения, и пол, и много другой информации. Но, главное, в нем можно найти серию и номер. И именно серия и номер являются той уникальной информацией, которую удобно учитывать и сортировать. Кроме того, они существенно короче всей оставшейся информации вместе взятой, и при этом все так же позволяют опознать человека. Применяя этот же подход к контейнерам открытых ключей, мы получим, что у каждого контейнера должен быть некий номер, последовательность символов, уникальная для него. Эту последовательность символов принято называть идентификатором , а сами контейнеры – сертификатами , либо просто ключами. Вот здесь и начинаются принципиальные различия в идеологиях OpenPGP и S/MIME + X.509. Для краткого понимания их, вернемся к нашей аналогии с паспортом. Паспорт вы можете использовать при покупках билетов, при оформлении документов, для выдачи пропуска на какую-либо территорию и даже на территории других стран! То есть, вы используете его для идентификации вашей личности в самых различных, зачастую абсолютно не связанных друг с другом, местах, с самыми различными людьми. И везде ваш паспорт принимают. Гарантом того, что вы – это вы выступает третья сторона в ваших взаимоотношениях с другими: государство. Именно оно выдало вам ваш паспорт, специально оформленный, подписанный и заверенный, и именно поэтому ваш паспорт является таким универсальным документом. С другой стороны, в кругу друзей, или внутри компании вам достаточно представиться так: «В. Пупкин из твоей группы в институте» или же «В. Пупкин из отдела продаж». И людям, с которыми вы контактируете в этом кругу уже не нужна третья сторона, они и так помнят Пупкина из группы с которым проучились пять лет, или Пупкина из отдела продаж, с которым недавно ходили обедать, и предоставленной вами информации им вполне достаточно. Так же можно разделить и эти два лагеря. Сертификат X.509 – это аналог нашего паспорта. Здесь сертификаты вам выдаются суровой третьей стороной, гарантом вашей личности: Удостоверяющим Центром (УЦ). Получающий ваши подписи человек всегда может обратиться в УЦ и спросить интересующую его информацию по вот этому конкретному сертификату. PGP же (и стандарт OpenPGP, появившийся в дальнейшем) создавался на основе так называемых сетей доверия. Такая идея подразумевает, что обмениваются подписями люди, которым третья сторона для их взаимоотношений не нужна, а нужна только защита от нехороших лиц. Конечно, с течением времени такое разделение стало уже достаточно условным, так как на данный момент и в S/MIME+X.509 и в PGP можно использовать методы лагеря соперников. Но все же, стандарты достаточно продолжительное время развивались параллельно и развились до той степени, что взаимная совместимость между ними стала невозможной. Более популярным стандартном, в силу своей ориентированности на участие более компетентной третьей стороны, стал стандарт S/MIME + X.509, однако и у PGP есть некоторое количество козырей за пазухой, с помощью которых он не только не погибает, но и продолжает успешно развиваться. Более подробное рассмотрение каждого из форматов, а также рекомендации, когда, где и какой из них использовать вы сможете прочитать уже в следующих статьях. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установить личный сертификат можно двумя способами: Установка через меню «Просмотреть сертификаты в контейнере» 1. Выберите «Пуск» > «Панель управления» > «КриптоПро CSP», перейдите на вкладку «Сервис» и кликните по кнопке «Просмотреть сертификаты в контейнере». 2. В открывшемся окне нажмите на кнопку «Обзор», чтобы выбрать контейнер для просмотра. После выбора контейнера нажмите на кнопку «Ок». 3. В окне нажмите кнопку «Далее». 4. В окне нажмите на кнопку Установить», после чего утвердительно ответьте на уведомление о замене сертификата (если оно появится). 5. Если кнопка Установить отсутствует, то в окне Сертификат для просмотра нажмите на кнопку Свойства 6. В открывшемся окне выберите Установить сертификат. 7. В окне Мастер импорта сертификатов выберите Далее . В следующем окне оставьте переключатель на пункте Автоматически выбрать хранилище на основе типа сертификата и нажмите Далее. Сертификат будет установлен в хранилище Личные. 8. В следующем окне выберите Далее, затем нажмите на кнопку Готово и дождитесь сообщения об успешной установке. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установка через меню «Установить личный сертификат» 1. Выберите Пуск > Панель управления > КриптоПро CSP. В окне Свойства КриптоПро CSP перейдите на вкладку Сервис и кликните по кнопке Установить личный сертификат. 2. В окне Мастер импорта сертификатов» нажмите на кнопку Далее. В следующем окне кликните по кнопке Обзор файл сертификата. 3. Далее укажите путь к сертификату и нажмите на кнопку ОткрытьДалее . 4. В следующем окне кликните по кнопке Далее 5. Нажмите кнопку Обзор . 6. Укажите контейнер закрытого ключа, соответствующий сертификату, и нажмите кнопку Ок 7. После выбора контейнера нажмите на кнопку Далее . 8. В окне Выбор хранилища сертификатов кликните по кнопке Обзор Если установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, то поставьте галку Установить сертификат в контейнер 9. Выберите хранилище Личные и нажмите ОК. 10. После выбора хранилища нажмите на кнопку Далее, затем Готово. После нажатия на кнопку Готово может появиться вопрос о замене существующего сертификата новым. В окне запроса выберите Да. Дождитесь сообщения об успешной установке. Сертификат установлен. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Копирование контейнера закрытого ключа в реестр Рис. 1. Пуск Перейдите во вкладку «Сервис» (Рис. 2). Рис. 2. Сервис Далее в форме «Контейнер закрытого ключа» нажмите кнопку «Скопировать» (Рис. 3). Рис. 3. Контейнер закрытого ключа Далее используйте один из способов: Способ 1. Нажмите кнопку «Обзор» и выберите необходимый для копирования ключевой контейнер и нажмите «Ок» (Рис. 4). Рис. 4. Выбор ключевого контейнера Способ 2. Можно найти нужный контейнер по сертификату. Для этого нажмите кнопку «По сертификату», в открывшемся окне выберите сертификат для копирования в реестр и нажмите кнопку «Ок» (Рис. 5). Рис. 5. Выбор сертификата Нажмите кнопку «Далее» (Рис. 6). Рис. 6. Контейнер закрытого ключа В случае, если при создании ключа не был установлен флаг на разрешение его копирования, система выдаст ошибку. В этом случае обратитесь в Удостоверяющий центр, выдавший данный сертификат ЭП (Рис. 7). Рис. 7. Ошибка копирования контейнера Если ошибка не возникла, далее введите имя для создаваемого ключевого контейнера и нажмите кнопку «Готово» (Рис. 8). Рис. 8. Указание имени создаваемого ключевого контейнера Откроется окно, в котором нужно выбрать носитель для скопированного контейнера. Чтобы подписывать без USB-носителя, выберите «Реестр» и нажмите кнопку «Ок» (Рис. 9). Рис. 9. Выбор устройства Откроется окно для подтверждения, нажмите кнопку «Ок» (Рис. 10). Рис. 10. Чтение ключевой информации Далее откроется окно установки пароля на доступ к закрытому ключу. При необходимости введите пароль, подтвердите его, и нажмите кнопку «Ок» (Рис. 11-12). Рис. 11. Пароль для создаваемого контейнера В окне записи дважды нажмите «Ок» (Рис. 12). Рис. 12. Запись информации СКЗИ «КриптоПро CSP» скопирует контейнер закрытого ключа и по завершению отобразит соответствующее сообщение (Рис. 13). Рис. 13. Завершение копирования Далее нужно выполнить привязку личного сертификата к закрытому контейнеру, который находится в реестре. Для этого извлеките из ПК USB-накопитель и откройте «КриптоПро CSP» (Рис. 14). Рис. 14. Меню «Пуск» В открывшейся программе перейдите во вкладку «Сервис», затем нажмите «Просмотреть сертификаты в контейнере» (Рис. 15). Рис. 15. Вкладка «Сервис» В открывшемся окне нажмите кнопку «Обзор» (Рис. 16). Рис. 16. Окно «Сертификаты в контейнере закрытого ключа» Выберите ключевой контейнер из списка и нажмите кнопку «Ок» (Рис. 17). Рис. 17. Выбор ключевого контейнера В окне «Сертификаты в контейнере закрытого ключа» нажмите кнопку «Далее» (Рис. 18). Рис. 18. Окно «Сертификаты в контейнере закрытого ключа» Затем нажмите кнопку «Установить» (Рис. 19). Рис. 19. Просмотр сертификата Рис. 20. Предупреждающее окно Сертификат установится в хранилище «Личные» текущего пользователя.
- (Рис. 10). Рис. 10. Безопасность Далее укажите имя файла, используя «Обзор» , затем нажмите кнопку «Далее» (Рис. 11). Рис. 11. Имя экспортируемого файла Далее нажмите «Готово» (Рис. 12). Рис. 12. Экспортирование закрытого ключа Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13). Рис. 13. Чтение ключевой информации Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14). Рис. 14. Завершение экспорта Импорт закрытого ключа Для установки закрытой части ключа откройте файл, сохранённый ранее (Рис. 15). Рис. 15. Файл, сохранённый ранее Откроется «Мастер импорта сертификатов», нажмите кнопку «Далее» (Рис. 16). Рис. 16. Мастер импорта сертификатов Укажите файл, который нужно импортировать, используя кнопку «Обзор», затем нажмите «Далее» (Рис. 17). Рис. 17. Импортируемый файл Далее введите пароль , отметьте пункт «Пометить этот ключ как экспортируемый, что позволит сохранять резервную копию ключа и перемещать его.» , затем нажмите кнопку «Далее» (Рис. 18). Рис. 18 Защита с помощью закрытого ключа Отметьте пункт «Поместить все сертификаты в следующее хранилище» , нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное» и нажмите «Ок» . В окне мастера настроек нажмите «Далее» (Рис. 19). Рис. 19. Выбор хранилища сертификата Нажмите «Готово» (Рис. 20). Рис. 20. Завершение мастера импорта сертификатов В открывшемся окне КриптоПро CSP выберите носитель, на который будет импортирован ключ, затем нажмите «Ок» (Рис. 21). Рис. 21. Выбор носителя Далее укажите новый пароль и его подтверждение (Рис. 22). Рис. 22. Указание пароля Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 23). Рис. 23. Чтение ключевой информации Далее введите пароль (Рис. 24). Рис. 24. Пароль для контейнера Далее нажмите «Ок» (Рис. 25). Рис. 25. Чтение ключевой информации Импорт успешно будет выполнен (Рис. 26). Рис. 26. Заверщение импорта Далее выполните установку личного сертификата по инструкции: /ru-ru/support/kb/333#1 . Как самостоятельно изготовить электронную подпись Время на прочтение Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста». Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз. Что такое электронная подпись Все термины и определения приведены в законе , поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок. Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова. Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации. Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла ), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа . Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно. Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку. Ситуация кардинально меняется, если изобретен замок с двумя ключами : один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания ), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал. Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш. Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки. Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа: изготавливает его хэш с помощью стандартного алгоритма; расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича; убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля! Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр). Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр , который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова. Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн. Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру ) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру. Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать. Генерирование открытого и секретного ключей Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key). Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win . Ниже будет описана работа из-под Линукса. Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root’а) команду gpg --full-generate-key В процессе генерирования вам будет предложено ответить на ряд вопросов: тип ключей можно оставить «RSA и RSA (по умолчанию)»; длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит; в качестве срока действия ключа для личного использования можно выбрать «не ограничен»; в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать; в качестве примечания можно указать город, либо иную дополнительную информацию. После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет. Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат: gpg --export -a "Иван Иванович Иванов" > public.key gpg --export-secret-key -a "Иван Иванович Иванов" > private.key Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим. Подписание документа Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате: gpg -ba имя_подписываемого_файла Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально. Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую: #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import * import os, sys, tkMessageBox def die(event): sys.exit(0) root = Tk() w = root.winfo_screenwidth()//2 - 400 h = root.winfo_screenheight()//2 - 300 root.geometry("800x600+{}+{}".format(w, h)) root.title("Подписать документ") flName = askopenfilename(title="Что подписываем?") if flName: os.system("gpg -ba " + flName) button = Button(text="ЭЦП создана") button.bind("<Button-1>", die) button.pack(expand=YES, anchor=CENTER) else: die() root.mainloop() Проверка подписи Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще: gpg --verify имя_файла_подписи имя_файла_документа В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации): открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG; веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами. Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала. К счастью для нас, имеется свободная библиотека OpenPGP.js ; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги): <!DOCTYPE html> <html> <head><meta charset="utf-8"></head> <body> <label for="doc">Загрузите файл с документом</label> <input id="doc" type="file" onChange="readDoc('doc')"> <label for="sig">Загрузите файл с подписью</label> <input id="sig" type="file" onChange="readDoc('sig')"> <button type="button" disabled onClick="check()">Проверить</button> <output></output> <script src="openpgp.min.js"></script> <script src="validate.js"></script> </body> </html> Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка. Вся работа по верификации подписей будет производиться подключенным скриптом validate.js : "use strict"; let cont = {doc:'', sig:''}, flag = {doc:false, sig:false}, pubkey = '', mess = ''; // Чтение файлов документа (как бинарного), // ключа и подписи (как текстовых) const readDoc = contKey => { let reader = new FileReader(); reader.onload = async e => { cont[contKey] = contKey == "sig" ? e.target.result : new Uint8Array(e.target.result); flag[contKey] = true; pubkey = await (await fetch("public.key")).text(); if (flag["doc"] && flag["sig"]) document.querySelector("button").disabled = false; } reader.onerror = err => alert("Ошибка чтения файла"); let fileObj = document.querySelector(`#${contKey}`).files[0]; if (contKey == "sig") reader.readAsText(fileObj); else reader.readAsArrayBuffer(fileObj); } // Верификация подписи const check = async () => { try { const verified = await openpgp.verify({ message: openpgp.message.fromBinary(cont["doc"]), signature: await openpgp.signature.readArmored(cont["sig"]), publicKeys: (await openpgp.key.readArmored(pubkey)).keys }); const {valid} = verified.signatures[0]; mess = "Электронная подпись НЕ является подлинной!"; if (valid) mess = "Электронная подпись является подлинной."; } catch(e) {mess = "Файл подписи имеет недопустимый формат.";} document.querySelector("output").innerHTML = mess; } Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку: Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть). Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись , обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур. Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й. 2. Если у вас токен (Рутокен например) Прежде чем система сможет с ним работать понадобится установить нужный драйвер. Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/ Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta Алгоритм такой: Скачиваем; Устанавливаем. Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей . 3. Если закрытый ключ в виде файлов Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key (Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр) Нашли файлы, записали на флешку, переходим к следующему шагу. 4. Установка сертификата из закрытого ключа Теперь нам нужно получить сертификат, сделать это можно следующим образом: Открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Просмотреть сертификаты в контейнере , нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее , появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да») После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер) 5. Использование электронной подписи без токена или флешки (установка в реестр) Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий: Выполните подготовку закрытого ключа, описанную в пунктах или Далее открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Скопировать С помощью кнопки Обзор выбираем наш ключ Нажимаем кнопку Далее , потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта . Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия. Время на прочтение Продолжая раскрывать тайное знание о цифровой подписи простым языком, разберем, что же нам надо для удобной и эффективной работы с ними, а также главное различие между лагерями S/MIME + X.509 и PGP. Перед тем, как рассматривать особенности этих двух больших лагерей, стоит рассмотреть, какая информация нужна получателю для проверки подписи (а наш зашифрованный хэш уже вполне можно называть подписью), и в каком виде ее можно ему передать. Значит, надо связать каждый открытый ключ с информацией о том, кому этот ключ принадлежит, и присылать это все одним пакетом. Тогда проблема реестра решается сама собой – пакет (а если более правильно, контейнер) с открытым ключом можно будет просто посмотреть и сразу понять его принадлежность. Но эту информацию все так же надо связать с подписью, пришедшей получателю. Как это сделать? Надо соорудить еще один контейнер, на сей раз для передачи подписи, и в нем продублировать информацию о том, кто эту подпись создавал. Продолжая нашу аналогию с красивым замком, мы пишем на ключе «Этот ключ открывает замок В. Пупкина». А на замке тоже пишем «Замок В. Пупкина». Имея такую информацию, получатель нашей коробочки не будет каждый из имеющихся у него ключей вставлять наугад в наш замок, а возьмет наш ключ и сразу его откроет. А собственно, что «и»? Мы ведь пока так и не решили проблему, как донести до получателя информацию о том, какая хэш-функция применялась для хэша, а ведь для проверки подписи эта информация необходима ! Решить ее можно достаточно просто: положить эту информацию в контейнер вместе с нашим открытым ключом. Ведь именно связка «хэширование – шифрование результата хеширования» считается процедурой создания цифровой подписи, а ее результат – подписью. А значит, достаточно логичным представляется объединение в связку алгоритма шифрования хэша и хэш-функции, с помощью которой он сформирован. И доставлять эту информацию тоже надо в связке. Теперь, ненадолго вернемся к информации о подписывающем. Какого рода эта информация должна быть? ФИО? Нет, В. Пупкиных много. Ф ИО + год рождения? Так и родившихся в один день В. Пупкиных тоже предостаточно! Более того, это может быть Василий, Виктор, или даже Василиса или Виктория Пупкины. Значит, информации должно быть больше. Ее должно быть столько, чтобы совпадение всех параметров, по которым мы идентифицируем человека, было максимально невероятным. Безусловно, такой пакет информации создать возможно. Вот только, работать с ним уже трудновато. Ведь надо наши контейнеры открытых ключей надо сортировать, хранить, использовать, в конце концов. А если для каждого использования придется указывать по полсотни параметров, то уже на втором контейнере станет понятно, что что-то надо менять. Решение этой проблемы, конечно же, было найдено. Чтобы понять, в чем же оно заключалось, обратимся к бумажному документу, который есть у всех нас: к паспорту. В нем можно найти и ФИО, и дату рождения, и пол, и много другой информации. Но, главное, в нем можно найти серию и номер. И именно серия и номер являются той уникальной информацией, которую удобно учитывать и сортировать. Кроме того, они существенно короче всей оставшейся информации вместе взятой, и при этом все так же позволяют опознать человека. Применяя этот же подход к контейнерам открытых ключей, мы получим, что у каждого контейнера должен быть некий номер, последовательность символов, уникальная для него. Эту последовательность символов принято называть идентификатором , а сами контейнеры – сертификатами , либо просто ключами. Вот здесь и начинаются принципиальные различия в идеологиях OpenPGP и S/MIME + X.509. Для краткого понимания их, вернемся к нашей аналогии с паспортом. Паспорт вы можете использовать при покупках билетов, при оформлении документов, для выдачи пропуска на какую-либо территорию и даже на территории других стран! То есть, вы используете его для идентификации вашей личности в самых различных, зачастую абсолютно не связанных друг с другом, местах, с самыми различными людьми. И везде ваш паспорт принимают. Гарантом того, что вы – это вы выступает третья сторона в ваших взаимоотношениях с другими: государство. Именно оно выдало вам ваш паспорт, специально оформленный, подписанный и заверенный, и именно поэтому ваш паспорт является таким универсальным документом. С другой стороны, в кругу друзей, или внутри компании вам достаточно представиться так: «В. Пупкин из твоей группы в институте» или же «В. Пупкин из отдела продаж». И людям, с которыми вы контактируете в этом кругу уже не нужна третья сторона, они и так помнят Пупкина из группы с которым проучились пять лет, или Пупкина из отдела продаж, с которым недавно ходили обедать, и предоставленной вами информации им вполне достаточно. Так же можно разделить и эти два лагеря. Сертификат X.509 – это аналог нашего паспорта. Здесь сертификаты вам выдаются суровой третьей стороной, гарантом вашей личности: Удостоверяющим Центром (УЦ). Получающий ваши подписи человек всегда может обратиться в УЦ и спросить интересующую его информацию по вот этому конкретному сертификату. PGP же (и стандарт OpenPGP, появившийся в дальнейшем) создавался на основе так называемых сетей доверия. Такая идея подразумевает, что обмениваются подписями люди, которым третья сторона для их взаимоотношений не нужна, а нужна только защита от нехороших лиц. Конечно, с течением времени такое разделение стало уже достаточно условным, так как на данный момент и в S/MIME+X.509 и в PGP можно использовать методы лагеря соперников. Но все же, стандарты достаточно продолжительное время развивались параллельно и развились до той степени, что взаимная совместимость между ними стала невозможной. Более популярным стандартном, в силу своей ориентированности на участие более компетентной третьей стороны, стал стандарт S/MIME + X.509, однако и у PGP есть некоторое количество козырей за пазухой, с помощью которых он не только не погибает, но и продолжает успешно развиваться. Более подробное рассмотрение каждого из форматов, а также рекомендации, когда, где и какой из них использовать вы сможете прочитать уже в следующих статьях. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установить личный сертификат можно двумя способами: Установка через меню «Просмотреть сертификаты в контейнере» 1. Выберите «Пуск» > «Панель управления» > «КриптоПро CSP», перейдите на вкладку «Сервис» и кликните по кнопке «Просмотреть сертификаты в контейнере». 2. В открывшемся окне нажмите на кнопку «Обзор», чтобы выбрать контейнер для просмотра. После выбора контейнера нажмите на кнопку «Ок». 3. В окне нажмите кнопку «Далее». 4. В окне нажмите на кнопку Установить», после чего утвердительно ответьте на уведомление о замене сертификата (если оно появится). 5. Если кнопка Установить отсутствует, то в окне Сертификат для просмотра нажмите на кнопку Свойства 6. В открывшемся окне выберите Установить сертификат. 7. В окне Мастер импорта сертификатов выберите Далее . В следующем окне оставьте переключатель на пункте Автоматически выбрать хранилище на основе типа сертификата и нажмите Далее. Сертификат будет установлен в хранилище Личные. 8. В следующем окне выберите Далее, затем нажмите на кнопку Готово и дождитесь сообщения об успешной установке. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установка через меню «Установить личный сертификат» 1. Выберите Пуск > Панель управления > КриптоПро CSP. В окне Свойства КриптоПро CSP перейдите на вкладку Сервис и кликните по кнопке Установить личный сертификат. 2. В окне Мастер импорта сертификатов» нажмите на кнопку Далее. В следующем окне кликните по кнопке Обзор файл сертификата. 3. Далее укажите путь к сертификату и нажмите на кнопку ОткрытьДалее . 4. В следующем окне кликните по кнопке Далее 5. Нажмите кнопку Обзор . 6. Укажите контейнер закрытого ключа, соответствующий сертификату, и нажмите кнопку Ок 7. После выбора контейнера нажмите на кнопку Далее . 8. В окне Выбор хранилища сертификатов кликните по кнопке Обзор Если установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, то поставьте галку Установить сертификат в контейнер 9. Выберите хранилище Личные и нажмите ОК. 10. После выбора хранилища нажмите на кнопку Далее, затем Готово. После нажатия на кнопку Готово может появиться вопрос о замене существующего сертификата новым. В окне запроса выберите Да. Дождитесь сообщения об успешной установке. Сертификат установлен. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Копирование контейнера закрытого ключа в реестр Рис. 1. Пуск Перейдите во вкладку «Сервис» (Рис. 2). Рис. 2. Сервис Далее в форме «Контейнер закрытого ключа» нажмите кнопку «Скопировать» (Рис. 3). Рис. 3. Контейнер закрытого ключа Далее используйте один из способов: Способ 1. Нажмите кнопку «Обзор» и выберите необходимый для копирования ключевой контейнер и нажмите «Ок» (Рис. 4). Рис. 4. Выбор ключевого контейнера Способ 2. Можно найти нужный контейнер по сертификату. Для этого нажмите кнопку «По сертификату», в открывшемся окне выберите сертификат для копирования в реестр и нажмите кнопку «Ок» (Рис. 5). Рис. 5. Выбор сертификата Нажмите кнопку «Далее» (Рис. 6). Рис. 6. Контейнер закрытого ключа В случае, если при создании ключа не был установлен флаг на разрешение его копирования, система выдаст ошибку. В этом случае обратитесь в Удостоверяющий центр, выдавший данный сертификат ЭП (Рис. 7). Рис. 7. Ошибка копирования контейнера Если ошибка не возникла, далее введите имя для создаваемого ключевого контейнера и нажмите кнопку «Готово» (Рис. 8). Рис. 8. Указание имени создаваемого ключевого контейнера Откроется окно, в котором нужно выбрать носитель для скопированного контейнера. Чтобы подписывать без USB-носителя, выберите «Реестр» и нажмите кнопку «Ок» (Рис. 9). Рис. 9. Выбор устройства Откроется окно для подтверждения, нажмите кнопку «Ок» (Рис. 10). Рис. 10. Чтение ключевой информации Далее откроется окно установки пароля на доступ к закрытому ключу. При необходимости введите пароль, подтвердите его, и нажмите кнопку «Ок» (Рис. 11-12). Рис. 11. Пароль для создаваемого контейнера В окне записи дважды нажмите «Ок» (Рис. 12). Рис. 12. Запись информации СКЗИ «КриптоПро CSP» скопирует контейнер закрытого ключа и по завершению отобразит соответствующее сообщение (Рис. 13). Рис. 13. Завершение копирования Далее нужно выполнить привязку личного сертификата к закрытому контейнеру, который находится в реестре. Для этого извлеките из ПК USB-накопитель и откройте «КриптоПро CSP» (Рис. 14). Рис. 14. Меню «Пуск» В открывшейся программе перейдите во вкладку «Сервис», затем нажмите «Просмотреть сертификаты в контейнере» (Рис. 15). Рис. 15. Вкладка «Сервис» В открывшемся окне нажмите кнопку «Обзор» (Рис. 16). Рис. 16. Окно «Сертификаты в контейнере закрытого ключа» Выберите ключевой контейнер из списка и нажмите кнопку «Ок» (Рис. 17). Рис. 17. Выбор ключевого контейнера В окне «Сертификаты в контейнере закрытого ключа» нажмите кнопку «Далее» (Рис. 18). Рис. 18. Окно «Сертификаты в контейнере закрытого ключа» Затем нажмите кнопку «Установить» (Рис. 19). Рис. 19. Просмотр сертификата Рис. 20. Предупреждающее окно Сертификат установится в хранилище «Личные» текущего пользователя.
- (Рис. 11). Рис. 11. Имя экспортируемого файла Далее нажмите «Готово» (Рис. 12). Рис. 12. Экспортирование закрытого ключа Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13). Рис. 13. Чтение ключевой информации Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14). Рис. 14. Завершение экспорта Импорт закрытого ключа Для установки закрытой части ключа откройте файл, сохранённый ранее (Рис. 15). Рис. 15. Файл, сохранённый ранее Откроется «Мастер импорта сертификатов», нажмите кнопку «Далее» (Рис. 16). Рис. 16. Мастер импорта сертификатов Укажите файл, который нужно импортировать, используя кнопку «Обзор», затем нажмите «Далее» (Рис. 17). Рис. 17. Импортируемый файл Далее введите пароль , отметьте пункт «Пометить этот ключ как экспортируемый, что позволит сохранять резервную копию ключа и перемещать его.» , затем нажмите кнопку «Далее» (Рис. 18). Рис. 18 Защита с помощью закрытого ключа Отметьте пункт «Поместить все сертификаты в следующее хранилище» , нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное» и нажмите «Ок» . В окне мастера настроек нажмите «Далее» (Рис. 19). Рис. 19. Выбор хранилища сертификата Нажмите «Готово» (Рис. 20). Рис. 20. Завершение мастера импорта сертификатов В открывшемся окне КриптоПро CSP выберите носитель, на который будет импортирован ключ, затем нажмите «Ок» (Рис. 21). Рис. 21. Выбор носителя Далее укажите новый пароль и его подтверждение (Рис. 22). Рис. 22. Указание пароля Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 23). Рис. 23. Чтение ключевой информации Далее введите пароль (Рис. 24). Рис. 24. Пароль для контейнера Далее нажмите «Ок» (Рис. 25). Рис. 25. Чтение ключевой информации Импорт успешно будет выполнен (Рис. 26). Рис. 26. Заверщение импорта Далее выполните установку личного сертификата по инструкции: /ru-ru/support/kb/333#1 . Как самостоятельно изготовить электронную подпись Время на прочтение Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста». Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз. Что такое электронная подпись Все термины и определения приведены в законе , поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок. Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова. Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации. Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла ), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа . Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно. Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку. Ситуация кардинально меняется, если изобретен замок с двумя ключами : один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания ), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал. Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш. Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки. Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа: изготавливает его хэш с помощью стандартного алгоритма; расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича; убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля! Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр). Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр , который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова. Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн. Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру ) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру. Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать. Генерирование открытого и секретного ключей Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key). Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win . Ниже будет описана работа из-под Линукса. Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root’а) команду gpg --full-generate-key В процессе генерирования вам будет предложено ответить на ряд вопросов: тип ключей можно оставить «RSA и RSA (по умолчанию)»; длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит; в качестве срока действия ключа для личного использования можно выбрать «не ограничен»; в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать; в качестве примечания можно указать город, либо иную дополнительную информацию. После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет. Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат: gpg --export -a "Иван Иванович Иванов" > public.key gpg --export-secret-key -a "Иван Иванович Иванов" > private.key Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим. Подписание документа Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате: gpg -ba имя_подписываемого_файла Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально. Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую: #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import * import os, sys, tkMessageBox def die(event): sys.exit(0) root = Tk() w = root.winfo_screenwidth()//2 - 400 h = root.winfo_screenheight()//2 - 300 root.geometry("800x600+{}+{}".format(w, h)) root.title("Подписать документ") flName = askopenfilename(title="Что подписываем?") if flName: os.system("gpg -ba " + flName) button = Button(text="ЭЦП создана") button.bind("<Button-1>", die) button.pack(expand=YES, anchor=CENTER) else: die() root.mainloop() Проверка подписи Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще: gpg --verify имя_файла_подписи имя_файла_документа В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации): открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG; веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами. Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала. К счастью для нас, имеется свободная библиотека OpenPGP.js ; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги): <!DOCTYPE html> <html> <head><meta charset="utf-8"></head> <body> <label for="doc">Загрузите файл с документом</label> <input id="doc" type="file" onChange="readDoc('doc')"> <label for="sig">Загрузите файл с подписью</label> <input id="sig" type="file" onChange="readDoc('sig')"> <button type="button" disabled onClick="check()">Проверить</button> <output></output> <script src="openpgp.min.js"></script> <script src="validate.js"></script> </body> </html> Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка. Вся работа по верификации подписей будет производиться подключенным скриптом validate.js : "use strict"; let cont = {doc:'', sig:''}, flag = {doc:false, sig:false}, pubkey = '', mess = ''; // Чтение файлов документа (как бинарного), // ключа и подписи (как текстовых) const readDoc = contKey => { let reader = new FileReader(); reader.onload = async e => { cont[contKey] = contKey == "sig" ? e.target.result : new Uint8Array(e.target.result); flag[contKey] = true; pubkey = await (await fetch("public.key")).text(); if (flag["doc"] && flag["sig"]) document.querySelector("button").disabled = false; } reader.onerror = err => alert("Ошибка чтения файла"); let fileObj = document.querySelector(`#${contKey}`).files[0]; if (contKey == "sig") reader.readAsText(fileObj); else reader.readAsArrayBuffer(fileObj); } // Верификация подписи const check = async () => { try { const verified = await openpgp.verify({ message: openpgp.message.fromBinary(cont["doc"]), signature: await openpgp.signature.readArmored(cont["sig"]), publicKeys: (await openpgp.key.readArmored(pubkey)).keys }); const {valid} = verified.signatures[0]; mess = "Электронная подпись НЕ является подлинной!"; if (valid) mess = "Электронная подпись является подлинной."; } catch(e) {mess = "Файл подписи имеет недопустимый формат.";} document.querySelector("output").innerHTML = mess; } Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку: Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть). Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись , обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур. Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й. 2. Если у вас токен (Рутокен например) Прежде чем система сможет с ним работать понадобится установить нужный драйвер. Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/ Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta Алгоритм такой: Скачиваем; Устанавливаем. Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей . 3. Если закрытый ключ в виде файлов Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key (Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр) Нашли файлы, записали на флешку, переходим к следующему шагу. 4. Установка сертификата из закрытого ключа Теперь нам нужно получить сертификат, сделать это можно следующим образом: Открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Просмотреть сертификаты в контейнере , нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее , появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да») После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер) 5. Использование электронной подписи без токена или флешки (установка в реестр) Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий: Выполните подготовку закрытого ключа, описанную в пунктах или Далее открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Скопировать С помощью кнопки Обзор выбираем наш ключ Нажимаем кнопку Далее , потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта . Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия. Время на прочтение Продолжая раскрывать тайное знание о цифровой подписи простым языком, разберем, что же нам надо для удобной и эффективной работы с ними, а также главное различие между лагерями S/MIME + X.509 и PGP. Перед тем, как рассматривать особенности этих двух больших лагерей, стоит рассмотреть, какая информация нужна получателю для проверки подписи (а наш зашифрованный хэш уже вполне можно называть подписью), и в каком виде ее можно ему передать. Значит, надо связать каждый открытый ключ с информацией о том, кому этот ключ принадлежит, и присылать это все одним пакетом. Тогда проблема реестра решается сама собой – пакет (а если более правильно, контейнер) с открытым ключом можно будет просто посмотреть и сразу понять его принадлежность. Но эту информацию все так же надо связать с подписью, пришедшей получателю. Как это сделать? Надо соорудить еще один контейнер, на сей раз для передачи подписи, и в нем продублировать информацию о том, кто эту подпись создавал. Продолжая нашу аналогию с красивым замком, мы пишем на ключе «Этот ключ открывает замок В. Пупкина». А на замке тоже пишем «Замок В. Пупкина». Имея такую информацию, получатель нашей коробочки не будет каждый из имеющихся у него ключей вставлять наугад в наш замок, а возьмет наш ключ и сразу его откроет. А собственно, что «и»? Мы ведь пока так и не решили проблему, как донести до получателя информацию о том, какая хэш-функция применялась для хэша, а ведь для проверки подписи эта информация необходима ! Решить ее можно достаточно просто: положить эту информацию в контейнер вместе с нашим открытым ключом. Ведь именно связка «хэширование – шифрование результата хеширования» считается процедурой создания цифровой подписи, а ее результат – подписью. А значит, достаточно логичным представляется объединение в связку алгоритма шифрования хэша и хэш-функции, с помощью которой он сформирован. И доставлять эту информацию тоже надо в связке. Теперь, ненадолго вернемся к информации о подписывающем. Какого рода эта информация должна быть? ФИО? Нет, В. Пупкиных много. Ф ИО + год рождения? Так и родившихся в один день В. Пупкиных тоже предостаточно! Более того, это может быть Василий, Виктор, или даже Василиса или Виктория Пупкины. Значит, информации должно быть больше. Ее должно быть столько, чтобы совпадение всех параметров, по которым мы идентифицируем человека, было максимально невероятным. Безусловно, такой пакет информации создать возможно. Вот только, работать с ним уже трудновато. Ведь надо наши контейнеры открытых ключей надо сортировать, хранить, использовать, в конце концов. А если для каждого использования придется указывать по полсотни параметров, то уже на втором контейнере станет понятно, что что-то надо менять. Решение этой проблемы, конечно же, было найдено. Чтобы понять, в чем же оно заключалось, обратимся к бумажному документу, который есть у всех нас: к паспорту. В нем можно найти и ФИО, и дату рождения, и пол, и много другой информации. Но, главное, в нем можно найти серию и номер. И именно серия и номер являются той уникальной информацией, которую удобно учитывать и сортировать. Кроме того, они существенно короче всей оставшейся информации вместе взятой, и при этом все так же позволяют опознать человека. Применяя этот же подход к контейнерам открытых ключей, мы получим, что у каждого контейнера должен быть некий номер, последовательность символов, уникальная для него. Эту последовательность символов принято называть идентификатором , а сами контейнеры – сертификатами , либо просто ключами. Вот здесь и начинаются принципиальные различия в идеологиях OpenPGP и S/MIME + X.509. Для краткого понимания их, вернемся к нашей аналогии с паспортом. Паспорт вы можете использовать при покупках билетов, при оформлении документов, для выдачи пропуска на какую-либо территорию и даже на территории других стран! То есть, вы используете его для идентификации вашей личности в самых различных, зачастую абсолютно не связанных друг с другом, местах, с самыми различными людьми. И везде ваш паспорт принимают. Гарантом того, что вы – это вы выступает третья сторона в ваших взаимоотношениях с другими: государство. Именно оно выдало вам ваш паспорт, специально оформленный, подписанный и заверенный, и именно поэтому ваш паспорт является таким универсальным документом. С другой стороны, в кругу друзей, или внутри компании вам достаточно представиться так: «В. Пупкин из твоей группы в институте» или же «В. Пупкин из отдела продаж». И людям, с которыми вы контактируете в этом кругу уже не нужна третья сторона, они и так помнят Пупкина из группы с которым проучились пять лет, или Пупкина из отдела продаж, с которым недавно ходили обедать, и предоставленной вами информации им вполне достаточно. Так же можно разделить и эти два лагеря. Сертификат X.509 – это аналог нашего паспорта. Здесь сертификаты вам выдаются суровой третьей стороной, гарантом вашей личности: Удостоверяющим Центром (УЦ). Получающий ваши подписи человек всегда может обратиться в УЦ и спросить интересующую его информацию по вот этому конкретному сертификату. PGP же (и стандарт OpenPGP, появившийся в дальнейшем) создавался на основе так называемых сетей доверия. Такая идея подразумевает, что обмениваются подписями люди, которым третья сторона для их взаимоотношений не нужна, а нужна только защита от нехороших лиц. Конечно, с течением времени такое разделение стало уже достаточно условным, так как на данный момент и в S/MIME+X.509 и в PGP можно использовать методы лагеря соперников. Но все же, стандарты достаточно продолжительное время развивались параллельно и развились до той степени, что взаимная совместимость между ними стала невозможной. Более популярным стандартном, в силу своей ориентированности на участие более компетентной третьей стороны, стал стандарт S/MIME + X.509, однако и у PGP есть некоторое количество козырей за пазухой, с помощью которых он не только не погибает, но и продолжает успешно развиваться. Более подробное рассмотрение каждого из форматов, а также рекомендации, когда, где и какой из них использовать вы сможете прочитать уже в следующих статьях. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установить личный сертификат можно двумя способами: Установка через меню «Просмотреть сертификаты в контейнере» 1. Выберите «Пуск» > «Панель управления» > «КриптоПро CSP», перейдите на вкладку «Сервис» и кликните по кнопке «Просмотреть сертификаты в контейнере». 2. В открывшемся окне нажмите на кнопку «Обзор», чтобы выбрать контейнер для просмотра. После выбора контейнера нажмите на кнопку «Ок». 3. В окне нажмите кнопку «Далее». 4. В окне нажмите на кнопку Установить», после чего утвердительно ответьте на уведомление о замене сертификата (если оно появится). 5. Если кнопка Установить отсутствует, то в окне Сертификат для просмотра нажмите на кнопку Свойства 6. В открывшемся окне выберите Установить сертификат. 7. В окне Мастер импорта сертификатов выберите Далее . В следующем окне оставьте переключатель на пункте Автоматически выбрать хранилище на основе типа сертификата и нажмите Далее. Сертификат будет установлен в хранилище Личные. 8. В следующем окне выберите Далее, затем нажмите на кнопку Готово и дождитесь сообщения об успешной установке. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установка через меню «Установить личный сертификат» 1. Выберите Пуск > Панель управления > КриптоПро CSP. В окне Свойства КриптоПро CSP перейдите на вкладку Сервис и кликните по кнопке Установить личный сертификат. 2. В окне Мастер импорта сертификатов» нажмите на кнопку Далее. В следующем окне кликните по кнопке Обзор файл сертификата. 3. Далее укажите путь к сертификату и нажмите на кнопку ОткрытьДалее . 4. В следующем окне кликните по кнопке Далее 5. Нажмите кнопку Обзор . 6. Укажите контейнер закрытого ключа, соответствующий сертификату, и нажмите кнопку Ок 7. После выбора контейнера нажмите на кнопку Далее . 8. В окне Выбор хранилища сертификатов кликните по кнопке Обзор Если установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, то поставьте галку Установить сертификат в контейнер 9. Выберите хранилище Личные и нажмите ОК. 10. После выбора хранилища нажмите на кнопку Далее, затем Готово. После нажатия на кнопку Готово может появиться вопрос о замене существующего сертификата новым. В окне запроса выберите Да. Дождитесь сообщения об успешной установке. Сертификат установлен. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Копирование контейнера закрытого ключа в реестр Рис. 1. Пуск Перейдите во вкладку «Сервис» (Рис. 2). Рис. 2. Сервис Далее в форме «Контейнер закрытого ключа» нажмите кнопку «Скопировать» (Рис. 3). Рис. 3. Контейнер закрытого ключа Далее используйте один из способов: Способ 1. Нажмите кнопку «Обзор» и выберите необходимый для копирования ключевой контейнер и нажмите «Ок» (Рис. 4). Рис. 4. Выбор ключевого контейнера Способ 2. Можно найти нужный контейнер по сертификату. Для этого нажмите кнопку «По сертификату», в открывшемся окне выберите сертификат для копирования в реестр и нажмите кнопку «Ок» (Рис. 5). Рис. 5. Выбор сертификата Нажмите кнопку «Далее» (Рис. 6). Рис. 6. Контейнер закрытого ключа В случае, если при создании ключа не был установлен флаг на разрешение его копирования, система выдаст ошибку. В этом случае обратитесь в Удостоверяющий центр, выдавший данный сертификат ЭП (Рис. 7). Рис. 7. Ошибка копирования контейнера Если ошибка не возникла, далее введите имя для создаваемого ключевого контейнера и нажмите кнопку «Готово» (Рис. 8). Рис. 8. Указание имени создаваемого ключевого контейнера Откроется окно, в котором нужно выбрать носитель для скопированного контейнера. Чтобы подписывать без USB-носителя, выберите «Реестр» и нажмите кнопку «Ок» (Рис. 9). Рис. 9. Выбор устройства Откроется окно для подтверждения, нажмите кнопку «Ок» (Рис. 10). Рис. 10. Чтение ключевой информации Далее откроется окно установки пароля на доступ к закрытому ключу. При необходимости введите пароль, подтвердите его, и нажмите кнопку «Ок» (Рис. 11-12). Рис. 11. Пароль для создаваемого контейнера В окне записи дважды нажмите «Ок» (Рис. 12). Рис. 12. Запись информации СКЗИ «КриптоПро CSP» скопирует контейнер закрытого ключа и по завершению отобразит соответствующее сообщение (Рис. 13). Рис. 13. Завершение копирования Далее нужно выполнить привязку личного сертификата к закрытому контейнеру, который находится в реестре. Для этого извлеките из ПК USB-накопитель и откройте «КриптоПро CSP» (Рис. 14). Рис. 14. Меню «Пуск» В открывшейся программе перейдите во вкладку «Сервис», затем нажмите «Просмотреть сертификаты в контейнере» (Рис. 15). Рис. 15. Вкладка «Сервис» В открывшемся окне нажмите кнопку «Обзор» (Рис. 16). Рис. 16. Окно «Сертификаты в контейнере закрытого ключа» Выберите ключевой контейнер из списка и нажмите кнопку «Ок» (Рис. 17). Рис. 17. Выбор ключевого контейнера В окне «Сертификаты в контейнере закрытого ключа» нажмите кнопку «Далее» (Рис. 18). Рис. 18. Окно «Сертификаты в контейнере закрытого ключа» Затем нажмите кнопку «Установить» (Рис. 19). Рис. 19. Просмотр сертификата Рис. 20. Предупреждающее окно Сертификат установится в хранилище «Личные» текущего пользователя.
- Импорт закрытого ключа
- , затем нажмите кнопку «Далее» (Рис. 18). Рис. 18 Защита с помощью закрытого ключа Отметьте пункт «Поместить все сертификаты в следующее хранилище» , нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное» и нажмите «Ок» . В окне мастера настроек нажмите «Далее» (Рис. 19). Рис. 19. Выбор хранилища сертификата Нажмите «Готово» (Рис. 20). Рис. 20. Завершение мастера импорта сертификатов В открывшемся окне КриптоПро CSP выберите носитель, на который будет импортирован ключ, затем нажмите «Ок» (Рис. 21). Рис. 21. Выбор носителя Далее укажите новый пароль и его подтверждение (Рис. 22). Рис. 22. Указание пароля Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 23). Рис. 23. Чтение ключевой информации Далее введите пароль (Рис. 24). Рис. 24. Пароль для контейнера Далее нажмите «Ок» (Рис. 25). Рис. 25. Чтение ключевой информации Импорт успешно будет выполнен (Рис. 26). Рис. 26. Заверщение импорта Далее выполните установку личного сертификата по инструкции: /ru-ru/support/kb/333#1 . Как самостоятельно изготовить электронную подпись Время на прочтение Оговорюсь сразу — я почти дилетант в вопросах, связанных с электронной цифровой подписью (ЭЦП). Недавно, движимый естественным любопытством, я решил немного разобраться в этом и нашел в Интернете 100500 статей на тему получения сертификатов ЭЦП в различных удостоверяющих центрах, а также многочисленные инструкции по использованию различных готовых приложений для подписания документов. Кое-где при этом вскользь упоминалось, что неквалифицированную подпись можно изготовить самостоятельно, если воспользоваться услугами «опытного программиста». Мне тоже захотелось стать хоть немного «опытным» и разобраться в этой кухне изнутри. Для интереса я научился генерировать PGP-ключи, подписывать документы неквалифицированной подписью и проверять ее достоверность. Понимая, что никакой Америки не открыто, я, тем не менее, предлагаю этот краткий туториал для таких же, как и я, дилетантов в вопросах работы с ЭЦП. Я постарался особо не углубляться в теорию и в детали, а написать именно небольшое и краткое введение в вопрос. Тем, кто уже работает с ЭЦП, это вряд ли будет интересно, а вот новичкам, для первого знакомства — в самый раз. Что такое электронная подпись Все термины и определения приведены в законе , поэтому изложим всё, как говорится, своими словами, не претендуя при этом на абсолютную юридическую точность формулировок. Электронная цифровая подпись (ЭЦП) — это совокупность средств, позволяющих однозначно удостовериться в том, что автором документа (или исполнителем какого-то действия) является именно то лицо, которое называет себя автором. В этом смысле ЭЦП полностью аналогична традиционной подписи: если в обычном «бумажном» документе указано, что его автор Иванов, а внизу стоит подпись Петрова, вы справедливо можете усомниться в авторстве Иванова. Мне однажды встречался такой способ удостоверения подлинности электронных документов в одной организации: перед рассылкой документа изготавливался его хэш и подписывался в базу хэшей (обычный текстовый файл, лежащий на сервере). Далее любой желающий удостовериться в подлинности электронного документа заходил на официальный сайт этой организации (в официальности которого ни у кого сомнений не возникало) и с помощью специального сервиса проверял, содержится ли хэш проверяемого документа в базе. Замечательно при этом, что сам документ даже не нужно было загружать на сервер: хэш можно вычислить на клиентской стороне в браузере, а на сервер послать только маленький fetch- или ajax-запрос с этим хэшем. Безусловно, этот немудрёный способ можно с полным основанием назвать простой ЭЦП: подписью в данном случае является именно хэш документа, размещенный в базе организации. Поговорим теперь об усиленной электронной подписи. Она предполагает использование стандартных криптографических алгоритмов; впрочем, таких алгоритмов существует достаточно много, так что и здесь единого стандарта нет. Тем не менее де-факто усиленная ЭЦП обычно основана на асимметричном шифровании (абсолютно гениальном, на мой взгляд, изобретении Ральфа Меркла ), идея которого чрезвычайно проста: для шифрования и расшифровывания используются два разных ключа . Эти два ключа всегда генерируются парой; один называется открытым ключом (public key), а второй — секретным ключом (private key). При этом, имея один из двух ключей, второй ключ воспроизвести за разумное время невозможно. Представим себе, что Аня хочет послать Боре (почему в литературе по криптографии обычно фигурируют Алиса и Боб? пусть будут Аня и Боря) секретную посылочку, закрытую на висячий замочек, и при этом на почте работают злые люди, которые хотят эту посылочку вскрыть. Других каналов связи, кроме почты, у Ани и Бори нет, так что ключ от замочка Аня передать Боре никак не может. Если она пошлет ключ по почте, то злые люди его, конечно, перехватят и вскроют посылочку. Ситуация кардинально меняется, если изобретен замок с двумя ключами : один только для закрывания, а второй — только для открывания. Боря генерирует себе пару таких ключей (открытый и секретный) и открытый ключ шлет по почте Ане. Работники почты, конечно, потирая руки, делают себе копию этого ключа, но не тут-то было! Аня закрывает замок на посылке открытым ключом Бори и смело идет на почту. Работники почты вскрыть посылку открытым ключом не могут (он использовался для закрывания ), а Боря спокойно открывает ее своим секретным ключом, который он бережно хранил у себя и никуда не пересылал. Вернемся к усиленной электронной подписи. Предположим, некий Иван Иванович Иванов захотел подписать документ с помощью ЭЦП. Он генерирует себе два ключа: открытый и секретный. После этого изготавливает (стандартным способом) хэш документа и шифрует его с использованием своего секретного ключа. Можно, конечно, было зашифровать и весь документ, но полученный в результате такого шифрования файл может оказаться очень большим, поэтому шифруется именно небольшой по размеру хэш. Полученный в результате такого шифрования файл и будет являться усиленной электронной подписью. Её еще называют отсоединенной (detach), так как она хранится в отдельном от документа файле. Такой вариант удобен тем, что подписанный отсоединенной ЭЦП файл можно спокойно прочитать без какой-либо расшифровки. Что же теперь отправляет Иван Иванович получателям? А отправляет он три файла: сам документ, его электронную подпись и открытый ключ. Получатель документа: изготавливает его хэш с помощью стандартного алгоритма; расшифровывает электронную подпись, используя имеющийся у него открытый ключ Ивана Ивановича; убеждается, что хэш совпадает с тем, что указан в расшифрованной электронной подписи (то есть документ не был подменен или отредактирован). Вуаля! Из этой коллизии существует два выхода. Первый, самый простой, заключается в том, что Иванов может разместить свой открытый ключ на своем персональном сайте (или на официальном сайте организации, где он работает). Если подлинность сайта не вызывает сомнений (а это отдельная проблема), то и принадлежность открытого ключа Иванову сомнений не вызовет. Более того, на сайте можно даже разметить не сам ключ, а его отпечаток (fingerprint), то есть, попросту говоря, хэш открытого ключа. Любой, кто сомневается в авторстве Иванова, может сверить отпечаток ключа, полученного от Иванова, с тем отпечатком, что опубликован на его персональном сайте. В конце концов, отпечаток можно просто продиктовать по телефону (обычно это 40 шестнадцатеричных цифр). Второй выход, стандартный, состоит в том, что открытый ключ Иванова тоже должен быть подписан электронной подписью — того, кому все доверяют. И здесь мы приходим к понятию усиленной квалифицированной электронной подписи. Смысл ее очень прост: Иванов идет в специальный аккредитованный удостоверяющий центр , который подписывает открытый ключ Иванова своей электронной подписью (присоединив предварительно к ключу Иванова его персональные данные). То, что получилось, называется сертификатом открытого ключа Иванова. Теперь любой сомневающийся может проверить подлинность открытого ключа Иванова с помощью любого из многочисленных сервисов Интернета, то есть расшифровать его сертификат (онлайн, с помощью открытого ключа удостоверяющего центра) и убедиться, что ключ принадлежит именно Иванову. Более того, Иванову теперь достаточно послать своим корреспондентам только сам документ и его отсоединенную подпись (содержащую и сведения о сертификате): все необходимые проверки будут сделаны желающими онлайн. Справедливости ради необходимо отметить, что и неквалифицированная ЭЦП может быть сертифицирована: никто не мешает какому-то третьему лицу (например, неаккредитованному удостоверяющему центру ) подписать открытый ключ Иванова своей ЭЦП и получить таким образом сертификат открытого ключа. Правда, если удостоверяющий центр не аккредитован, степень доверия к подписи Иванова будет полностью зависеть от степени доверия к этому центру. Всё замечательно, да вот только услуги удостоверяющих центров по изготовлению для вас подписанных (снабженных сертификатом центра) ключей стоят денег (обычно несколько тысяч рублей в год). Поэтому ниже мы рассмотрим, как можно самостоятельно изготовить усиленную ЭЦП (неквалифицированную, не снабженную сертификатом открытого ключа от аккредитованного удостоверяющего центра). Юридической силы (например, в суде) такая подпись иметь не будет, так как принадлежность открытого ключа именно вам никем не подтверждена, но для повседневной переписки деловых партнеров или для документооборота внутри организации эту подпись вполне можно использовать. Генерирование открытого и секретного ключей Итак, вы решили самостоятельно изготовить усиленную неквалифицированную электронную подпись и научиться подписывать ею свои документы. Начать необходимо, конечно, с генерирования пары ключей, открытого (public key) и секретного (private key). Существует множество стандартов и алгоритмов асимметричного шифрования. Одной из библиотек, реализующих эти алгоритмы, является PGP (Pretty Good Privacy). Она была выпущена в 1991 году под проприетарной лицензией, поэтому имеются полностью совместимые с ней свободные библиотеки (например, OpenPGP). Одной из таких свободных библиотек является выпущенная в 1999 году GNU Privacy Guard (GnuPG, или GPG). Утилита GPG традиционно входит в состав почти всех дистрибутивов Линукса; для работы из-под Windows необходимо установить, например, gpg4win . Ниже будет описана работа из-под Линукса. Сначала сгенерируем собственно ключи, подав (из-под обычного юзера, не из-под root’а) команду gpg --full-generate-key В процессе генерирования вам будет предложено ответить на ряд вопросов: тип ключей можно оставить «RSA и RSA (по умолчанию)»; длину ключа можно оставить по умолчанию, но вполне достаточно и 2048 бит; в качестве срока действия ключа для личного использования можно выбрать «не ограничен»; в качестве идентификатора пользователя можно указать свои фамилию, имя и отчество, например, Иван Иванович Иванов ; адрес электронной почты можно не указывать; в качестве примечания можно указать город, либо иную дополнительную информацию. После ввода вами всех запрошенных данных утилита GPG попросит вас указать пароль, необходимый для доступа к секретному ключу. Дело в том, что сгененрированный секретный ключ будет храниться на вашем компьютере, что небезопасно, поэтому GPG дополнительно защищает его паролем. Таким образом, не знающий пароля злоумышленник, даже если и получит доступ к вашему компьютеру, подписать документы от вашего имени не сможет. Сгенерированные ключи (во всяком случае, открытый, но можно также и секретный, на тот случай, если ваш компьютер внезапно сломается) необходимо экспортировать в текстовый формат: gpg --export -a "Иван Иванович Иванов" > public.key gpg --export-secret-key -a "Иван Иванович Иванов" > private.key Понятно, что private.key вы должны хранить в секрете, а вот public.key вы можете открыто публиковать и рассылать всем желающим. Подписание документа Нет ничего проще, чем создать отсоединенную ЭЦП в текстовом (ASCII) формате: gpg -ba имя_подписываемого_файла Файл с подписью будет создан в той же папке, где находится подписываемый файл и будет иметь расширение asc . Если, например, вы подписали файл privet.doc , то файл подписи будет иметь имя privet.doc.asc . Можно, следуя традиции, переименовать его в privet.sig , хотя это непринципиально. Если вам не хочется каждый раз заходить в терминал и вводить руками имя подписываемого файла с полным путем, можно написать простейшую графическую утилиту для подписания документов, например, такую: #!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * from tkFileDialog import * import os, sys, tkMessageBox def die(event): sys.exit(0) root = Tk() w = root.winfo_screenwidth()//2 - 400 h = root.winfo_screenheight()//2 - 300 root.geometry("800x600+{}+{}".format(w, h)) root.title("Подписать документ") flName = askopenfilename(title="Что подписываем?") if flName: os.system("gpg -ba " + flName) button = Button(text="ЭЦП создана") button.bind("<Button-1>", die) button.pack(expand=YES, anchor=CENTER) else: die() root.mainloop() Проверка подписи Вряд ли, конечно, вам самому придется проверять достоверность собственной электронной подписи, но если вдруг (на всякий случай) вам захочется это сделать, то нет ничего проще: gpg --verify имя_файла_подписи имя_файла_документа В реальности гораздо полезнее опубликовать где-нибудь в открытом доступе (например, на вашем персональном сайте или на сайте вашей организации): открытый ключ public.key для того, чтобы все желающие могли проверить (верифицировать) вашу подпись с использованием, например, той же GPG; веб-интерфейс для проверки вашей подписи всеми желающими, не являющимися специалистами. Описанию такого веб-интерфейса (причем без использования серверных технологий, с проверкой подписи исключительно на клиентской стороне) и будет посвящена последняя часть моего краткого туториала. К счастью для нас, имеется свободная библиотека OpenPGP.js ; скачиваем самый маленький по размеру (на момент написания данного туториала — 506 КБ) файл dist/lightweight/openpgp.min.js и пишем несложную html-страничку (для упрощения восприятия я удалил все описания стилей и очевидные meta-тэги): <!DOCTYPE html> <html> <head><meta charset="utf-8"></head> <body> <label for="doc">Загрузите файл с документом</label> <input id="doc" type="file" onChange="readDoc('doc')"> <label for="sig">Загрузите файл с подписью</label> <input id="sig" type="file" onChange="readDoc('sig')"> <button type="button" disabled onClick="check()">Проверить</button> <output></output> <script src="openpgp.min.js"></script> <script src="validate.js"></script> </body> </html> Понятно, что файл с открытым ключом public.key и файл библиотеки openpgp.min.js должны лежать в той же папке, что и эта страничка. Вся работа по верификации подписей будет производиться подключенным скриптом validate.js : "use strict"; let cont = {doc:'', sig:''}, flag = {doc:false, sig:false}, pubkey = '', mess = ''; // Чтение файлов документа (как бинарного), // ключа и подписи (как текстовых) const readDoc = contKey => { let reader = new FileReader(); reader.onload = async e => { cont[contKey] = contKey == "sig" ? e.target.result : new Uint8Array(e.target.result); flag[contKey] = true; pubkey = await (await fetch("public.key")).text(); if (flag["doc"] && flag["sig"]) document.querySelector("button").disabled = false; } reader.onerror = err => alert("Ошибка чтения файла"); let fileObj = document.querySelector(`#${contKey}`).files[0]; if (contKey == "sig") reader.readAsText(fileObj); else reader.readAsArrayBuffer(fileObj); } // Верификация подписи const check = async () => { try { const verified = await openpgp.verify({ message: openpgp.message.fromBinary(cont["doc"]), signature: await openpgp.signature.readArmored(cont["sig"]), publicKeys: (await openpgp.key.readArmored(pubkey)).keys }); const {valid} = verified.signatures[0]; mess = "Электронная подпись НЕ является подлинной!"; if (valid) mess = "Электронная подпись является подлинной."; } catch(e) {mess = "Файл подписи имеет недопустимый формат.";} document.querySelector("output").innerHTML = mess; } Вот, собственно, и всё. Теперь вы можете в соответствии с пунктом 5.23 ГОСТ 7.0.97–2016 разместить на документе (в том месте, где должна стоять собственноручная подпись) вот такую красивую картинку: Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть). Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись , обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур. Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й. 2. Если у вас токен (Рутокен например) Прежде чем система сможет с ним работать понадобится установить нужный драйвер. Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/ Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta Алгоритм такой: Скачиваем; Устанавливаем. Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей . 3. Если закрытый ключ в виде файлов Закрытый ключ может быть в виде 6 файлов: header.key , masks.key , masks2.key , name.key , primary.key , primary2.key (Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр) Нашли файлы, записали на флешку, переходим к следующему шагу. 4. Установка сертификата из закрытого ключа Теперь нам нужно получить сертификат, сделать это можно следующим образом: Открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Просмотреть сертификаты в контейнере , нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее , появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да») После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер) 5. Использование электронной подписи без токена или флешки (установка в реестр) Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий: Выполните подготовку закрытого ключа, описанную в пунктах или Далее открываем КриптоПро CSP Заходим на вкладку Сервис Нажимаем кнопку Скопировать С помощью кнопки Обзор выбираем наш ключ Нажимаем кнопку Далее , потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта . Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия. Время на прочтение Продолжая раскрывать тайное знание о цифровой подписи простым языком, разберем, что же нам надо для удобной и эффективной работы с ними, а также главное различие между лагерями S/MIME + X.509 и PGP. Перед тем, как рассматривать особенности этих двух больших лагерей, стоит рассмотреть, какая информация нужна получателю для проверки подписи (а наш зашифрованный хэш уже вполне можно называть подписью), и в каком виде ее можно ему передать. Значит, надо связать каждый открытый ключ с информацией о том, кому этот ключ принадлежит, и присылать это все одним пакетом. Тогда проблема реестра решается сама собой – пакет (а если более правильно, контейнер) с открытым ключом можно будет просто посмотреть и сразу понять его принадлежность. Но эту информацию все так же надо связать с подписью, пришедшей получателю. Как это сделать? Надо соорудить еще один контейнер, на сей раз для передачи подписи, и в нем продублировать информацию о том, кто эту подпись создавал. Продолжая нашу аналогию с красивым замком, мы пишем на ключе «Этот ключ открывает замок В. Пупкина». А на замке тоже пишем «Замок В. Пупкина». Имея такую информацию, получатель нашей коробочки не будет каждый из имеющихся у него ключей вставлять наугад в наш замок, а возьмет наш ключ и сразу его откроет. А собственно, что «и»? Мы ведь пока так и не решили проблему, как донести до получателя информацию о том, какая хэш-функция применялась для хэша, а ведь для проверки подписи эта информация необходима ! Решить ее можно достаточно просто: положить эту информацию в контейнер вместе с нашим открытым ключом. Ведь именно связка «хэширование – шифрование результата хеширования» считается процедурой создания цифровой подписи, а ее результат – подписью. А значит, достаточно логичным представляется объединение в связку алгоритма шифрования хэша и хэш-функции, с помощью которой он сформирован. И доставлять эту информацию тоже надо в связке. Теперь, ненадолго вернемся к информации о подписывающем. Какого рода эта информация должна быть? ФИО? Нет, В. Пупкиных много. Ф ИО + год рождения? Так и родившихся в один день В. Пупкиных тоже предостаточно! Более того, это может быть Василий, Виктор, или даже Василиса или Виктория Пупкины. Значит, информации должно быть больше. Ее должно быть столько, чтобы совпадение всех параметров, по которым мы идентифицируем человека, было максимально невероятным. Безусловно, такой пакет информации создать возможно. Вот только, работать с ним уже трудновато. Ведь надо наши контейнеры открытых ключей надо сортировать, хранить, использовать, в конце концов. А если для каждого использования придется указывать по полсотни параметров, то уже на втором контейнере станет понятно, что что-то надо менять. Решение этой проблемы, конечно же, было найдено. Чтобы понять, в чем же оно заключалось, обратимся к бумажному документу, который есть у всех нас: к паспорту. В нем можно найти и ФИО, и дату рождения, и пол, и много другой информации. Но, главное, в нем можно найти серию и номер. И именно серия и номер являются той уникальной информацией, которую удобно учитывать и сортировать. Кроме того, они существенно короче всей оставшейся информации вместе взятой, и при этом все так же позволяют опознать человека. Применяя этот же подход к контейнерам открытых ключей, мы получим, что у каждого контейнера должен быть некий номер, последовательность символов, уникальная для него. Эту последовательность символов принято называть идентификатором , а сами контейнеры – сертификатами , либо просто ключами. Вот здесь и начинаются принципиальные различия в идеологиях OpenPGP и S/MIME + X.509. Для краткого понимания их, вернемся к нашей аналогии с паспортом. Паспорт вы можете использовать при покупках билетов, при оформлении документов, для выдачи пропуска на какую-либо территорию и даже на территории других стран! То есть, вы используете его для идентификации вашей личности в самых различных, зачастую абсолютно не связанных друг с другом, местах, с самыми различными людьми. И везде ваш паспорт принимают. Гарантом того, что вы – это вы выступает третья сторона в ваших взаимоотношениях с другими: государство. Именно оно выдало вам ваш паспорт, специально оформленный, подписанный и заверенный, и именно поэтому ваш паспорт является таким универсальным документом. С другой стороны, в кругу друзей, или внутри компании вам достаточно представиться так: «В. Пупкин из твоей группы в институте» или же «В. Пупкин из отдела продаж». И людям, с которыми вы контактируете в этом кругу уже не нужна третья сторона, они и так помнят Пупкина из группы с которым проучились пять лет, или Пупкина из отдела продаж, с которым недавно ходили обедать, и предоставленной вами информации им вполне достаточно. Так же можно разделить и эти два лагеря. Сертификат X.509 – это аналог нашего паспорта. Здесь сертификаты вам выдаются суровой третьей стороной, гарантом вашей личности: Удостоверяющим Центром (УЦ). Получающий ваши подписи человек всегда может обратиться в УЦ и спросить интересующую его информацию по вот этому конкретному сертификату. PGP же (и стандарт OpenPGP, появившийся в дальнейшем) создавался на основе так называемых сетей доверия. Такая идея подразумевает, что обмениваются подписями люди, которым третья сторона для их взаимоотношений не нужна, а нужна только защита от нехороших лиц. Конечно, с течением времени такое разделение стало уже достаточно условным, так как на данный момент и в S/MIME+X.509 и в PGP можно использовать методы лагеря соперников. Но все же, стандарты достаточно продолжительное время развивались параллельно и развились до той степени, что взаимная совместимость между ними стала невозможной. Более популярным стандартном, в силу своей ориентированности на участие более компетентной третьей стороны, стал стандарт S/MIME + X.509, однако и у PGP есть некоторое количество козырей за пазухой, с помощью которых он не только не погибает, но и продолжает успешно развиваться. Более подробное рассмотрение каждого из форматов, а также рекомендации, когда, где и какой из них использовать вы сможете прочитать уже в следующих статьях. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установить личный сертификат можно двумя способами: Установка через меню «Просмотреть сертификаты в контейнере» 1. Выберите «Пуск» > «Панель управления» > «КриптоПро CSP», перейдите на вкладку «Сервис» и кликните по кнопке «Просмотреть сертификаты в контейнере». 2. В открывшемся окне нажмите на кнопку «Обзор», чтобы выбрать контейнер для просмотра. После выбора контейнера нажмите на кнопку «Ок». 3. В окне нажмите кнопку «Далее». 4. В окне нажмите на кнопку Установить», после чего утвердительно ответьте на уведомление о замене сертификата (если оно появится). 5. Если кнопка Установить отсутствует, то в окне Сертификат для просмотра нажмите на кнопку Свойства 6. В открывшемся окне выберите Установить сертификат. 7. В окне Мастер импорта сертификатов выберите Далее . В следующем окне оставьте переключатель на пункте Автоматически выбрать хранилище на основе типа сертификата и нажмите Далее. Сертификат будет установлен в хранилище Личные. 8. В следующем окне выберите Далее, затем нажмите на кнопку Готово и дождитесь сообщения об успешной установке. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Установка через меню «Установить личный сертификат» 1. Выберите Пуск > Панель управления > КриптоПро CSP. В окне Свойства КриптоПро CSP перейдите на вкладку Сервис и кликните по кнопке Установить личный сертификат. 2. В окне Мастер импорта сертификатов» нажмите на кнопку Далее. В следующем окне кликните по кнопке Обзор файл сертификата. 3. Далее укажите путь к сертификату и нажмите на кнопку ОткрытьДалее . 4. В следующем окне кликните по кнопке Далее 5. Нажмите кнопку Обзор . 6. Укажите контейнер закрытого ключа, соответствующий сертификату, и нажмите кнопку Ок 7. После выбора контейнера нажмите на кнопку Далее . 8. В окне Выбор хранилища сертификатов кликните по кнопке Обзор Если установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, то поставьте галку Установить сертификат в контейнер 9. Выберите хранилище Личные и нажмите ОК. 10. После выбора хранилища нажмите на кнопку Далее, затем Готово. После нажатия на кнопку Готово может появиться вопрос о замене существующего сертификата новым. В окне запроса выберите Да. Дождитесь сообщения об успешной установке. Сертификат установлен. Подготовить, проверить и сдать отчетность в ФНС, ПФР, ФСС, Росстат, РАР, РПН через интернет Копирование контейнера закрытого ключа в реестр Рис. 1. Пуск Перейдите во вкладку «Сервис» (Рис. 2). Рис. 2. Сервис Далее в форме «Контейнер закрытого ключа» нажмите кнопку «Скопировать» (Рис. 3). Рис. 3. Контейнер закрытого ключа Далее используйте один из способов: Способ 1. Нажмите кнопку «Обзор» и выберите необходимый для копирования ключевой контейнер и нажмите «Ок» (Рис. 4). Рис. 4. Выбор ключевого контейнера Способ 2. Можно найти нужный контейнер по сертификату. Для этого нажмите кнопку «По сертификату», в открывшемся окне выберите сертификат для копирования в реестр и нажмите кнопку «Ок» (Рис. 5). Рис. 5. Выбор сертификата Нажмите кнопку «Далее» (Рис. 6). Рис. 6. Контейнер закрытого ключа В случае, если при создании ключа не был установлен флаг на разрешение его копирования, система выдаст ошибку. В этом случае обратитесь в Удостоверяющий центр, выдавший данный сертификат ЭП (Рис. 7). Рис. 7. Ошибка копирования контейнера Если ошибка не возникла, далее введите имя для создаваемого ключевого контейнера и нажмите кнопку «Готово» (Рис. 8). Рис. 8. Указание имени создаваемого ключевого контейнера Откроется окно, в котором нужно выбрать носитель для скопированного контейнера. Чтобы подписывать без USB-носителя, выберите «Реестр» и нажмите кнопку «Ок» (Рис. 9). Рис. 9. Выбор устройства Откроется окно для подтверждения, нажмите кнопку «Ок» (Рис. 10). Рис. 10. Чтение ключевой информации Далее откроется окно установки пароля на доступ к закрытому ключу. При необходимости введите пароль, подтвердите его, и нажмите кнопку «Ок» (Рис. 11-12). Рис. 11. Пароль для создаваемого контейнера В окне записи дважды нажмите «Ок» (Рис. 12). Рис. 12. Запись информации СКЗИ «КриптоПро CSP» скопирует контейнер закрытого ключа и по завершению отобразит соответствующее сообщение (Рис. 13). Рис. 13. Завершение копирования Далее нужно выполнить привязку личного сертификата к закрытому контейнеру, который находится в реестре. Для этого извлеките из ПК USB-накопитель и откройте «КриптоПро CSP» (Рис. 14). Рис. 14. Меню «Пуск» В открывшейся программе перейдите во вкладку «Сервис», затем нажмите «Просмотреть сертификаты в контейнере» (Рис. 15). Рис. 15. Вкладка «Сервис» В открывшемся окне нажмите кнопку «Обзор» (Рис. 16). Рис. 16. Окно «Сертификаты в контейнере закрытого ключа» Выберите ключевой контейнер из списка и нажмите кнопку «Ок» (Рис. 17). Рис. 17. Выбор ключевого контейнера В окне «Сертификаты в контейнере закрытого ключа» нажмите кнопку «Далее» (Рис. 18). Рис. 18. Окно «Сертификаты в контейнере закрытого ключа» Затем нажмите кнопку «Установить» (Рис. 19). Рис. 19. Просмотр сертификата Рис. 20. Предупреждающее окно Сертификат установится в хранилище «Личные» текущего пользователя.
- Как самостоятельно изготовить электронную подпись
- Что такое электронная подпись
- Генерирование открытого и секретного ключей
- Подписание документа
- Проверка подписи
- 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере
- 2. Если у вас токен (Рутокен например)
- 3. Если закрытый ключ в виде файлов
- 4. Установка сертификата из закрытого ключа
- 5. Использование электронной подписи без токена или флешки (установка в реестр)
- Установка через меню «Установить личный сертификат»
- Копирование контейнера закрытого ключа в реестр
Файл primary. key
Содержит 32 байта ключа в формате Asn1. Это только половина ключа, полный ключ получается при делении этого числа по модулю Q на маску. Поле, хранящее модуль Q в библиотеке OpenSSL имеет название order. Маска лежит в файле masks.key:
Файл masks. key
Содержит 32 байта маски ключа в формате Asn1, зашифрованного на ключе хранения pwd_key. Далее 12 байт «затравочной» информации для генерации ключа хранения pwd_key, если криптоконтейнер защищен паролем, то пароль также участвует в генерации ключа хранения.
Далее контрольная сумма (имитозащита) 4 байта. Контрольной информацией для простоты мы пользоваться не будем, общий контроль будет осуществляться путем генерации открытого ключа и сравнения первых 8 байт полученного ключа с соответствующим полем из файла header.key:
Файл header. key
Из этого файла нам потребуется параметры электронной подписи CryptoProParamSet (подчеркнуто красным).
- GostR3410_2001_CryptoPro_A_ParamSet — 1.2.643.2.2.35.1
- GostR3410_2001_CryptoPro_B_ParamSet — 1.2.643.2.2.35.2
- GostR3410_2001_CryptoPro_C_ParamSet — 1.2.643.2.2.35.3
- GostR3410_2001_CryptoPro_XchA_ParamSet — 1.2.643.2.2.36.0
- GostR3410_2001_CryptoPro_XchB_ParamSet — 1.2.643.2.2.36.1
А также первые 8 байт открытого ключа (подчеркнуто) для контроля правильности чтения закрытого.
Читаем закрытый ключ и конвертируем
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>
#include "gost_lcl.h"
/* Convert little-endian byte array into bignum */
BIGNUM *reverse32bn(char *b, BN_CTX *ctx)
{
BIGNUM *res;
char buf[32];
BUF_reverse(buf, b, 32);
res = BN_bin2bn(buf, 32, BN_CTX_get(ctx));
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
void xor_material(char *buf36, char *buf5C, char *src)
{
int i;
for(i = 0; i < 32; i++)
{
buf36[i] = src[i] ^ 0x36;
buf5C[i] = src[i] ^ 0x5C;
}
}
int make_pwd_key(char *result_key, char *start12, int start12_len, char *passw)
{
int result;
int i;
char pincode4[1024];
int pin_len;
char current[32];
char material36[32];
char material5C[32];
char hash_result[32];
gost_hash_ctx ctx;
init_gost_hash_ctx(&ctx, &GostR3411_94_CryptoProParamSet);
memset(pincode4, 0, sizeof(pincode4));
pin_len = strlen(passw);
if (pin_len*4 > sizeof(pincode4)) { result = 1; goto err; }
for(i = 0; i < pin_len; i++)
pincode4[i*4] = passw[i];
start_hash(&ctx);
hash_block(&ctx, start12, start12_len);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, hash_result);
memcpy(current, (char*)"DENEFH028.760246785.IUEFHWUIO.EF", 32);
for(i = 0; i < (pin_len?2000:2); i++)
{
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, hash_result, 32);
hash_block(&ctx, material5C, 32);
hash_block(&ctx, hash_result, 32);
finish_hash(&ctx, current);
}
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, start12, start12_len);
hash_block(&ctx, material5C, 32);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, current);
start_hash(&ctx);
hash_block(&ctx, current, 32);
finish_hash(&ctx, result_key);
result = 0; //ok
err:
return result;
}
BIGNUM *decode_primary_key(char *pwd_key, char *primary_key, BN_CTX *bn_ctx)
{
BIGNUM *res;
char buf[32];
gost_ctx ctx;
gost_init(&ctx, gost_cipher_list->sblock);
gost_key(&ctx, pwd_key);
gost_dec(&ctx, primary_key, buf, 4);
res = reverse32bn(buf, bn_ctx);
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
BIGNUM *remove_mask_and_check_public(char *oid_param_set8, BIGNUM *key_with_mask, BIGNUM *mask, char *public8, BN_CTX *ctx)
{
int result;
EC_KEY *eckey = NULL;
const EC_POINT *pubkey;
const EC_GROUP *group;
BIGNUM *X, *Y, *order, *raw_secret, *mask_inv;
char outbuf[32], public_X[32];
ASN1_OBJECT *obj;
int nid;
order = BN_CTX_get(ctx);
mask_inv = BN_CTX_get(ctx);
raw_secret = BN_CTX_get(ctx);
X = BN_CTX_get(ctx);
Y = BN_CTX_get(ctx);
if (!order || !mask_inv || !raw_secret || !X || !Y) { result = 1; goto err; }
obj = ASN1_OBJECT_create(0, oid_param_set8+1, *oid_param_set8, NULL, NULL);
nid = OBJ_obj2nid(obj);
ASN1_OBJECT_free(obj);
if (!(eckey = EC_KEY_new())) { result = 1; goto err; }
if (!fill_GOST2001_params(eckey, nid)) { result = 1; goto err; }
if (!(group = EC_KEY_get0_group(eckey))) { result = 1; goto err; }
if (!EC_GROUP_get_order(group, order, ctx)) { result = 1; goto err; }
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }
if (!EC_KEY_set_private_key(eckey, raw_secret)) { result = 1; goto err; }
if (!gost2001_compute_public(eckey)) { result = 1; goto err; }
if (!(pubkey = EC_KEY_get0_public_key(eckey))) { result = 1; goto err; }
if (!EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y, ctx)) { result = 1; goto err; }
store_bignum(X, outbuf, sizeof(outbuf));
BUF_reverse(public_X, outbuf, sizeof(outbuf));
if (memcmp(public_X, public8, 8) != 0) { result = 1; goto err; }
result = 0; //ok
err:
if (eckey) EC_KEY_free(eckey);
if (result == 0) return raw_secret;
return NULL;
}
int file_length(char *fname)
{
int len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return -1;
fseek(f, 0, SEEK_END);
len = ftell(f);
fclose(f);
return len;
}
int read_file(char *fname, int start_pos, char *buf, int len)
{
int read_len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return 1;
if (start_pos) fseek(f, start_pos, SEEK_SET);
read_len = fread(buf, 1, len, f);
fclose(f);
if (read_len != len) return 1;
return 0; //ok
}
int get_asn1_len(unsigned char *buf, int *size_hdr)
{
int n, i, res;
int pos = 0;
if ((buf[pos]&0x80) == 0) {
*size_hdr = 1;
return buf[pos];
}
n = buf[pos++]&0x7f;
res = 0;
for(i = 0; i < n; i++) {
res = res*256 + buf[pos++];
}
*size_hdr = n+1;
return res;
}
#define MAX_HEADER 20000
int read_container(char *fpath, int flag2, char *salt12, char *primary_key, char *masks_key, char *public8, char *oid_param_set8)
{
int result;
char primary_path[1024+30];
char masks_path[1024+30];
char header_path[1024+30];
char header_buf[MAX_HEADER];
int header_len;
int i, len, pos, size_hdr;
if (strlen(fpath)>1024) { result = 1; goto err; }
sprintf(header_path, "%s/header.key", fpath);
if (flag2 == 0)
{
sprintf(primary_path, "%s/primary.key", fpath);
sprintf(masks_path, "%s/masks.key", fpath);
}
else
{
sprintf(primary_path, "%s/primary2.key", fpath);
sprintf(masks_path, "%s/masks2.key", fpath);
}
if (read_file(primary_path, 4, primary_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 4, masks_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 0x26, salt12, 12)) { result = 1; goto err; }
header_len = file_length(header_path);
if (header_len < 0x42 || header_len > MAX_HEADER) { result = 1; goto err; }
if (read_file(header_path, 0, header_buf, header_len)) { result = 1; goto err; }
//------------- skip certificate ---------------------------
pos = 0;
for(i = 0; i < 2; i++)
{
get_asn1_len(header_buf+pos+1, &size_hdr);
pos += size_hdr+1;
if (pos > header_len-8) { result = 2; goto err; }
}
//------------------ get oid_param_set8 -----------------------
#define PARAM_SET_POS 34
if (memcmp(header_buf+pos+PARAM_SET_POS, "\x6\x7", 2) != 0) { result = 2; goto err; }
memcpy(oid_param_set8, header_buf+pos+PARAM_SET_POS+1, 8);
//------------------ get public8 -----------------------
result = 2; //not found
pos += 52;
for(i = 0; i < 3; i++)
{
len = get_asn1_len(header_buf+pos+1, &size_hdr);
if (len == 8 && memcmp(header_buf+pos, "\x8a\x8", 2) == 0)
{
memcpy(public8,header_buf+pos+2,8);
result = 0; //ok
break;
}
pos += len+size_hdr+1;
if (pos > header_len-8) { result = 2; goto err; }
}
err:
OPENSSL_cleanse(header_buf, sizeof(header_buf));
return result;
}
#define START_OID 0x12
#define START_KEY 0x28
unsigned char asn1_private_key[72] = {
0x30,0x46,2,1,0,0x30,0x1c,6,6,0x2a,0x85,3,2,2,0x13,0x30,0x12,6,7,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,6,7,0x2a,0x85,3,2,2,0x1e,1,4,0x23,2,0x21,0
};
int main(int argc, char **argv)
{
int result;
char *container_path;
char *passw;
char salt12[12];
char primary_key[32];
char masks_key[32];
char public8[8];
char oid_param_set8[8];
BN_CTX *ctx;
BIGNUM *key_with_mask;
BIGNUM *mask;
BIGNUM *raw_key;
char pwd_key[32];
char outbuf[32];
ctx = BN_CTX_new();
if (argc == 2)
{
container_path = argv[1];
passw = "";
}
else
if (argc == 3)
{
container_path = argv[1];
passw = argv[2];
}
else
{
printf("get_private container_path [passw]\n");
result = 1;
goto err;
}
if (read_container(container_path, 0, salt12, primary_key, masks_key, public8, oid_param_set8) != 0 &&
read_container(container_path, 1, salt12, primary_key, masks_key, public8, oid_param_set8) != 0)
{
printf("can not read container from %s\n", container_path);
result = 2;
goto err;
}
make_pwd_key(pwd_key, salt12, 12, passw);
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);
OPENSSL_cleanse(pwd_key, sizeof(pwd_key));
mask = reverse32bn(masks_key, ctx);
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);
if (raw_key)
{
BIO *bio;
store_bignum(raw_key, outbuf, sizeof(outbuf));
memcpy(asn1_private_key+START_OID, oid_param_set8, 8);
memcpy(asn1_private_key+START_KEY, outbuf, 32);
//bio = BIO_new_file("private.key", "w");
bio = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
PEM_write_bio(bio, "PRIVATE KEY", "", asn1_private_key, sizeof(asn1_private_key));
BIO_free(bio);
OPENSSL_cleanse(outbuf, sizeof(outbuf));
OPENSSL_cleanse(asn1_private_key, sizeof(asn1_private_key));
result = 0; //ok
}
else
{
printf("Error check public key\n");
result = 3;
}
err:
BN_CTX_free(ctx);
OPENSSL_cleanse(salt12, sizeof(salt12));
OPENSSL_cleanse(primary_key, sizeof(primary_key));
OPENSSL_cleanse(masks_key, sizeof(masks_key));
return result;
}
Основную работу выполняют следующие 3 функции:
1. Создаем ключ хранения исходя из 12-ти байтовой «соли» и пароля.
make_pwd_key(pwd_key, salt12, 12, passw);
2. Расшифровываем основной ключ на ключе хранения.
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);
3. Делим ключ с маской на маску.
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);
Но так как в библиотеке OpenSSL операция деления по модулю традиционно отсутствует, пользуемся операцией взятия обратного числа и умножением.
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }
Сборка утилиты конвертирования ключа
Далее сборка исходников описана для Linux версии.
Компиляция OpenSSL библиотеки
После скачивания
и распаковки исходных текстов openssl в целевой директории выполняем команды:
./config
make
Получаем готовую библиотеку libcrypto.a в текущей директории.
Также потребуются заголовочные файлы из директорий engines/ccgost и include.
Компиляция privkey.c
gcc -o privkey -Iengines/ccgost -Iinclude privkey.c libcrypto.a -pthread -ldl
Формирование файла закрытого ключа private.key
./privkey /mnt/usbflash/lp-9a0fe.000
Тестовый закрытый ключ в криптоконтейнере lp-9a0fe.000, сертификат открытого ключа signer.cer и другие файлы для тестирования можно взять отсюда
Получаем результат работы:
-----BEGIN PRIVATE KEY-----
MEYCAQAwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEEIwIhAKzsrv/l1Uwk
uzph/LQN9mux0Jz0yaW21kOYEFv0Xyut
-----END PRIVATE KEY-----
Cохраняем в private.key
Пользуемся закрытым ключом private.key для подписывания файла file.txt
openssl cms -sign -inkey private.key -in file.txt -CAfile CA.cer -signer signer.cer -engine gost -out test.sign -outform DER -noattr -binary
Проверяем подпись
openssl cms -verify -content file.txt -in test.sign -CAfile CA.cer -signer signer.cer -engine gost -inform DER -noattr -binary
Все работает просто замечательно!
Спасибо за внимание. Это была моя первая статья на хабре.
Экспорт закрытого ключа
Для экспорта закрытого ключа выполните следующие действия:
Откройте Крипто-Про CSP. Перейдите во вкладку «Сервис» и нажмите кнопку «Просмотреть сертификаты в контейнере» (Рис. 1).
В открывшемся окне укажите имя ключевого контейнера, нажав «Обзор» (Рис. 2).
Выберите ключевой контейнер пользователя, затем нажмите «Ок» (Рис. 3).
Нажмите «Далее» (Рис. 4).
Далее нажмите кнопку «Свойства» (Рис. 5).
В открывшемся окне перейдите во вкладку «Состав» и нажмите кнопку «Копировать в файл» (Рис. 6).
Откроется мастер экспорта сертификатов. Нажмите «Далее» (Рис. 7).
Далее отметьте «Да, экспортировать закрытый ключ»
и нажмите «Далее»
(Рис. 8).
Отметьте следующие пункты: «Файл обмена личной информацией – PKCS #12», «Включить по возможности все сертификаты в путь сертификации» и «Экспортировать все расширенные свойства»
, затем нажмите кнопку «Далее»
(Рис. 9).
Укажите пароль и подтверждение пароля
, затем нажмите кнопку «Далее»
(Рис. 10).
Далее укажите имя файла, используя «Обзор»
, затем нажмите кнопку «Далее»
(Рис. 11).
Далее нажмите «Готово» (Рис. 12).
Система сообщит о чтении ключевой информации, нажмите кнопку «Ок» (Рис. 13).
Откроется окно с информацией об успешном экспорте. Нажмите «Ок» (Рис. 14).
Импорт закрытого ключа
Для установки закрытой части ключа откройте файл, сохранённый ранее (Рис. 15).
Откроется «Мастер импорта сертификатов», нажмите кнопку «Далее» (Рис. 16).
Укажите файл, который нужно импортировать, используя кнопку «Обзор», затем нажмите «Далее» (Рис. 17).
Далее введите пароль
, отметьте пункт «Пометить этот ключ как экспортируемый, что позволит сохранять резервную копию ключа и перемещать его.»
, затем нажмите кнопку «Далее» (Рис. 18).
Отметьте пункт «Поместить все сертификаты в следующее хранилище»
, нажмите кнопку «Обзор», в открывшемся окне отметьте «Личное»
и нажмите «Ок»
. В окне мастера настроек нажмите «Далее»