Электронная подпись по Российским нормативам: практическое использование на предприятиях

    Государственные и коммерческие предприятия


    В первой части статьи речь шла об использовании электронной подписи в коммерческих предприятиях. В государственных предприятиях и банках все немного иначе. Здесь нужно использовать сертифицированный криптопровайдер, а сами ключи должны храниться на токенах. Поэтому во второй части этой статьи будет показано, как использовать сертифицированный криптопровайдер и токены для хранения ключей вне компьютера. Сперва мы поговорим о криптопровайдере, а потом уже рассмотрим практическое использование программы.

    На просторах России сертифицированные криптопровайдеры предоставляют не так уж и много компаний: ООО «КРИПТО-ПРО», ООО «Лисси», ОАО «ИнфоТеКС», ЗАО «Сигнал-КОМ» и некоторые другие.
    Программа CyberSafe поддерживает работу с сертифицированным криптопровайдером от ООО «КРИПТО-ПРО», что обеспечивает возможность формирования и проверки электронной подписи в соответствии с отечественными стандартами ГОСТ Р 34.11-94 / ГОСТ Р 34.11-2012 и ГОСТ Р 34.10-2001 / ГОСТ Р 34.10-2012.

    Можно ли использовать программу CyberSafe?


    Одно дело — шифрование личных файлов, но государственный и банковский сектор — совсем другое. Какие нормы позволяют считать CyberSafe программой, использующей сертифицированное ФСБ России СКЗИ и не требующей соответствующей сертификации? Ответ на этот вопрос можно получить в паспорте (формуляре) на программный продукт КриптоПро CSP и в методических рекомендациях по обеспечению с помощью криптосредств безопасности персональных данных при их обработке в информационных системах персональных данных с использованием средств автоматизации. Последние утверждены ФСБ России 21 февраля 2008 года № 149/54-144.
    В паспорте на КриптоПро CSP читаем п. 1 из раздела 2:

    Допускается использование СКЗИ для криптографической защиты персональных данных


    Далее открываем методические рекомендации и читаем пункт 1 из раздела 5:

    5.1. Встраивание криптосредств класса КС1 и КС2 осуществляется без контроля со стороны ФСБ России (если этот контроль не предусмотрен техническим заданием на разработку (модернизацию) информационной системы).


    В соответствии с Требованиями к средствам ЭП и Требованиями к средствам УЦ, которые утверждены приказом ФСБ России от 27 декабря 2011 г. № 796, устанавливается шесть классов криптосредств – КС1, КС2, КС3, КВ1, КВ2, КА1. Встраивание криптосредств класса КС3, КВ1, КВ2 и КА1 осуществляется только под контролем со стороны ФСБ России. Что же касается классов КС1 и КС2, то никакого контроля со стороны ФСБ не осуществляется. Подробнее о классах криптографической защиты вы можете прочитать по ссылке, которая приводится в конце статьи.
    Как видите, CyberSafe использовать не только можно, но и нужно. Исходный код библиотеки шифрования, которую использует программа, доступен всем желающим (ссылка на него есть на главной странице сайта cybersafesoft.com) по адресу: www.assembla.com/spaces/cybersafe-encryption-library/wiki
    Далее приводится код функции шифрования и подписи, чтобы убедиться в надежности реализации (лист. 1).

    Листинг 1. Функция шифрования и подписи (ГОСТ)
    function EncryptAndSign(ASignCertContent: string; AEncCerts: TStringList;
      FileName, OutFileName: string; out ErrText: String): Boolean;
    var
      hProv: HCRYPTPROV;
      hStoreHandle: HCERTSTORE;
      pSignerCert: jwawincrypt.PCCERT_CONTEXT;
      encCert: jwawincrypt.CRYPT_DATA_BLOB;
      SigParams: jwawincrypt.CRYPT_SIGN_MESSAGE_PARA;
      pCertContext: PCCERT_CONTEXT;
      Stream: TMemoryStream;
      Certificates: array [0 .. 100] of PCCERT_CONTEXT;
      EncParams: CRYPT_ENCRYPT_MESSAGE_PARA;
      cbEncrypted: DWORD;
      i: Integer;
      pszObjId: LPSTR;
    begin
      Result := False;
      for i := 0 to 100 do
        Certificates[i] := nil;
    
      if not jwawincrypt.CryptAcquireContext(hProv, nil, nil, PROV_GOST_2001_DH,
        CRYPT_VERIFYCONTEXT) then
        Exit;
    
      hStoreHandle := CertOpenSystemStore(hProv, 'MY');
      if (hStoreHandle = nil) then
      begin
        ErrText := 'ErrorOpenStore';
        Exit;
      end;
    
      for i := 0 to AEncCerts.Count - 1 do
      begin
        try
          encCert := GetCertContent(FileToStr(AEncCerts.Strings[i]));
        except
          ErrText := 'ErrorCertLoad';
          Continue;
        end;
    
        pCertContext := jwawincrypt.CertCreateCertificateContext(MYTYPE,
          encCert.pbData, encCert.cbData);
        pCertContext := jwawincrypt.CertFindCertificateInStore(hStoreHandle, MYTYPE,
          0, CERT_FIND_EXISTING, pCertContext, nil);
        if (pCertContext = nil) then
        begin
          ErrText := 'ErrorCertInStoreNotFound';
          Continue;
        end;
        Certificates[i] := pCertContext;
      end;
    
      encCert := GetCertContent(FileToStr(ASignCertContent));
      // Открываем хранилище сертификатов
      pSignerCert := nil;
      pSignerCert := jwawincrypt.CertCreateCertificateContext(MYTYPE,
        encCert.pbData, encCert.cbData);
      pSignerCert := jwawincrypt.CertFindCertificateInStore(hStoreHandle, MYTYPE, 0,
        CERT_FIND_EXISTING, pSignerCert, nil);
      if (pSignerCert = nil) then
      begin
        Exit;
      end;
    
      with TMemoryStream.Create do
        try
          LoadFromFile(FileName);
          try
            try
              // Инициализация структуры, необходимой для цифровой подписи
              pszObjId := szOID_RSA_MD5; // получение алгоритма сертификата
              FillChar(SigParams, SizeOf(CRYPT_SIGN_MESSAGE_PARA), #0);
              SigParams.cbSize := SizeOf(CRYPT_SIGN_MESSAGE_PARA);
              SigParams.dwMsgEncodingType := MYTYPE;
              SigParams.pSigningCert := pSignerCert;
              SigParams.HashAlgorithm.pszObjId := pszObjId;
              // для Сигнал - Com szOID_RSA_MD5;//  1.2.643.2.2.21
              SigParams.HashAlgorithm.Parameters.cbData := 0;
              SigParams.cMsgCert := 1;
              SigParams.rgpMsgCert := @pSignerCert;
              SigParams.cAuthAttr := 0;
              SigParams.dwInnerContentType := 0;
              SigParams.cMsgCrl := 0;
              SigParams.cUnauthAttr := 0;
              SigParams.dwFlags := 0;
              SigParams.pvHashAuxInfo := nil;
              SigParams.rgAuthAttr := nil;
    
              ZeroMemory(@EncParams, SizeOf(CRYPT_ENCRYPT_MESSAGE_PARA));
              EncParams.cbSize := SizeOf(CRYPT_ENCRYPT_MESSAGE_PARA);
              EncParams.dwMsgEncodingType := MYTYPE;
              EncParams.HCRYPTPROV := hProv;
              EncParams.ContentEncryptionAlgorithm.pszObjId := szOID_CP_GOST_28147;
              // Алгоритм шифрования ГОСТ 28147-89 1.2.643.2.2.21
              if CryptSignAndEncryptMessage(@SigParams, @EncParams, AEncCerts.Count,
                @Certificates, Memory, Size, nil, cbEncrypted) then
              begin
                Stream := TMemoryStream.Create;
                try
                  Stream.SetSize(cbEncrypted);
                  if CryptSignAndEncryptMessage(@SigParams, @EncParams,
                    AEncCerts.Count, @Certificates, Memory, Size, Stream.Memory,
                    cbEncrypted) then
                  begin
                    Stream.SetSize(cbEncrypted);
                    Stream.SaveToFile(OutFileName);
                    Result := True;
                  end
                  else
                    ErrText := SysErrorMessage(GetLastError);
                finally
                  FreeAndNil(Stream);
                end;
              end
              else
                ErrText := SysErrorMessage(GetLastError);
            except
              ErrText := SysErrorMessage(GetLastError);
            end;
          finally
            CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG);
          end;
        finally
          Free;
        end;
    end;
    
    


    Практическое использование программы


    Первым делом нужно установить сертифицированный криптопровайдер «КриптоПро CSP». Скачать программный продукт можно абсолютно бесплатно, но после предварительной регистрации по адресу
    www.cryptopro.ru/downloads
    Скачайте и запустите установочный файл. Нажмите кнопку Установить и дождитесь сообщения, свидетельствующего об успешной установке программного продукта (рис. 1).


    Рис. 1. КриптоПро CSP успешно установлен

    Далее запустите программу CyberSafe. При первом запуске после установки КриптоПро CSP нужно обязательно установить сертификат CyberSafe GOST CA (рис. 2).


    Рис. 2. Установите сертификат

    После установки сертификата CyberSafe GOST CA самое время поговорить о токенах. Токен — это USB-устройство, которое используется для авторизации пользователя, защиты электронной переписки, безопасного доступа к удаленным информационным ресурсам, а также для хранения криптографических ключей. Поскольку токены — довольно дорогие устройства, программа CyberSafe может вместо них использовать обычные флешки. На флешке будут храниться помещенные на нее ключи. Однако на токенах ваши ключи защищены от копирования, а на флешке — нет. Но учитывая стоимость токенов, такое решение вполне оправдано. Другими словами, программа CyberSafe экономит ваши деньги.
    При использовании как токенов, так и обычных флешек для хранения ключей, ваши ключи будут храниться не на компьютере, а на внешнем носителе (токене или флешке).
    Итак, создадим сертификат Крипто-Про. Выберите команду меню Сертификаты, Создать. В окне Создание сертификата введите адрес электронной почты, пароль, наименование и другую информацию. Убедитесь, что вы включили флажок Создать Крипто-Про сертификат (рис. 3). Если этого флажка нет, убедитесь, что вы установили КриптоПро CSP и после установки перезапустили CyberSafe.


    Рис. 3. Создание сертификата Крипто-Про

    Следующий шаг — очень важен. Вам нужно выбрать, где именно хранить контейнер закрытого ключа — на USB-диске (рис. 4а) или на токене (рис. 4б). Выберите токен или съемный диск, на котором вы хотите хранить сертификат (только убедитесь в правильности выбора), или же выберите Реестр, если вы хотите хранить сертификат в компьютере.


    Рис. 4а. Сертификат будет храниться на флешке


    Рис. 4б. Сертификат будет храниться на токене

    Далее от вас понадобится немного физического труда — нужно нажимать клавиши на клавиатуре или перемещать указатель мыши, пока ключ не будет создан (рис. 5).


    Рис. 5. Процесс создания ключа

    Далее нужно создать пароль для самого контейнера (рис. 6а) или pin-код (рис. 6б) — для токена. Этот пароль должен отличаться от пароля сертификата по соображениям безопасности.


    Рис. 6а. Пароль контейнера (флешка)


    Рис. 6б. Pin-код для контейнера (токен)

    Далее вы увидите сообщение о том, что сертификат успешно создан (рис. 7), а после нажатия кнопки Готово вам нужно открыть свой почтовый ящик и найти там код подтверждения публикации сертификата (если, конечно, вы выбрали публикацию сертификата) и ввести его в появившееся окно (рис. 8).


    Рис. 7. Сертификат успешно создан


    Рис. 8. Введите код подтверждения публикации сертификата

    Во время публикации сертификата вы увидите, что он состоит из шести файлов (рис. 9). После публикации сертификата вы увидите сообщение об его успешной публикации на сервере. Ясное дело, что на момент публикации соединение с Интернетом должно быть установлено. Откройте Проводник и просмотрите содержимое флешки. В каталоге <наименование>.000 вы обнаружите закрытые ключи (рис. 10).


    Рис. 9. Процесс публикации сертификата


    Рис. 10. Закрытые ключи

    Перейдите в раздел Ключи и сертификаты, Все ключи и убедитесь в том, что созданный вами сертификат есть в списке сертификатов (рис. 11).


    Рис. 11. Созданный сертификат в общем списке

    Далее созданный сертификат можно использовать, как обычно (что было показано в первой части статьи). Например, его можно использовать для шифрования файлов. Процесс шифрования такой же, поэтому подробно его рассматривать не будем. Скажу лишь, что при шифровании файлов нужно выбрать криптопровайдер Крипто Про ГОСТ из списка Выберите крипто провайдер (рис. 12). Далее вы увидите список соответствующих этому криптопровайдеру ключей.


    Рис. 12. Шифрование файлов по ГОСТу

    Аналогично, при прозрачном шифровании папки (когда нужно зашифровать все файлы из этой папки) вам нужно выбрать криптопровайдер Крипто Про ГОСТ из соответствующего списка (рис. 13).


    Рис. 13. Выбор криптопровайдера при прозрачном шифровании

    Также выбрать шифрование по ГОСТу можно выбрать при шифровании диска/раздела (см. рис. 14). В списке Тип шифрования нужно выбрать ГОСТ и установить параметры шифрования.


    Рис. 14. Шифрование диска

    Выводы


    Программу CyberSafe не только можно, но и нужно использовать в государственных организациях и банках, поскольку программа поддерживает сертифицированный криптопровайдер (Крипто Про) и позволяет не хранить сертификаты (ключи) на компьютере, а вынести их на внешние носители.

    Ссылки


    Уровень криптографической защиты при реализации обмена электронными сообщениями, защищенными электронной подписью
    Формуляр ЖТЯИ.00050-03 30 01 (КриптоПро CSP)
    Методические рекомендации
    Исходный код библиотеки шифрования
    Первая часть статьи
    КиберСофт
    43,80
    Компания
    Поделиться публикацией

    Комментарии 17

      +3
      Первым делом нужно установить сертифицированный криптопровайдер «КриптоПро CSP». Скачать программный продукт можно абсолютно бесплатно

      Скачать-то можно бесплатно, а вот использовать можно только для ознакомления. Вот вам замечательная цитата из прайс-листа:

      Лицензия на право использования СКЗИ «КриптоПро CSP» версии 3.6 на одном рабочем месте MS Windows 1 800,00р


      (для 3.9 и 4.0 ситуация та же самая)
        0
        Видите как полезен Хабр: теперь даже Вы узнали, что Крипто-Про не бесплатный -)
          0
          Угу, три года заказываю лицензии на компанию — и не знал.
        +3
        программа поддерживает сертифицированный криптопровайдер (Крипто Про) и позволяет не хранить сертификаты (ключи) на компьютере, а вынести их на внешние носители.

        Вы жульничаете. Не ваша программа позволяет, а КриптоПро позволяет. Это хорошо видно из окна создания ключевого контейнера, которое чисто КриптоПро-шное.
          –2
          А Вы без нашей программы попробуйте -) честный Вы наш. Просто установив Крипто-Про. Крипто-Про работает только как криптопровайдер, каждый вендор встраивает его в свое решение. Если бы наша программа работала с ключами, то есть генерировала их на токенах и мы бы выдавали это за «сертифицированный криптопровайдер» это было бы жульничество. То есть, наша программа позволяет использовать функции Крипто-Про по хранению ключей на токенах. Так пойдет?
            0
            А Вы без нашей программы попробуйте

            Не только пробовал, но и делал.

            То есть, наша программа позволяет использовать функции Крипто-Про по хранению ключей на токенах. Так пойдет?

            Так пойдет.
              0
              Я уже решил не отвечать, но смотрю как мой ответ минусуют, думаю все-так задам вопрос:
              Просто установив Крипто-Про

              Не только пробовал, но и делал.

              Расскажите, как просто установив Крипто-Про Вы создали ключи, подписали файл, то есть то, что указано в данной статье. Только прошу не говорить, что Вы сделали это с помощью другого приложения. Вы ответили на мой вопрос, что делали это на голом крипто-про.
                0
                Вы ответили на мой вопрос, что делали это на голом крипто-про.

                Это где это?

                В вашем вопросе было «а вы без нашей программы попробуйте». Без вашей программы это прекрасно делается.
                  0
                  А Вы без нашей программы попробуйте

                  Просто установив Крипто-Про

                  Вы сказали, что мы жульничаем и все операции делает крипто-про. Я спросил сможете ли сделать это «просто установив крипто-про». Далее понятно… Вы выборочно читаете что я пишу.
                    0
                    Вы сказали, что мы жульничаем и все операции делает крипто-про.

                    Отнюдь. Я сказал, что хранение ключей на токене делает крипто-про. Все остальное вы мне приписали.
                      0
                      Тогда прошу прощения. Непонимание вышло.
          0
          Далее приводится код функции шифрования и подписи, чтобы убедиться в надежности реализации (лист. 1).

          Certificates: array [0 .. 100] of PCCERT_CONTEXT;


          for i := 0 to AEncCerts.Count - 1 do
          begin
          ....
           Certificates[i] := pCertContext;
          end;
          


          Я очень сильно надеюсь что ваш Паскаль проверяет границы при доступе к массивам на стеке.
          Но назвать это «надежной реализацией» я бы постеснялся. Если в первом же куске кода встерчаются такие перлы, то что там ещё может найтись?
            –1
            Для этого и приводим чтобы внимательная общественность деликатно, как Вы, указала неточности -)
              0
              знаете, если это ещё можно списать на невнимательность, то обращение с ErrText показывает на общий уровень культуры кода.
              В конце функцуии вы пишете ErrText := SysErrorMessage(GetLastError); и получете красиво сформатированое сообщение об ошибки которое можно вывести пользователю. Но вот в начале функции встреючатся вот такие вот куски: ErrText := 'ErrorCertLoad';
              Вы будете показывать пользователю окно с сообщением «ErrorCertLoad»? Я конечно понимаю, что работникам «государственных организаий и банков» не привыкать к отечественному софту, но это же не повод делать софт низкого качества, правда?
            0
            Документация Крипто-Про не является регулирующим документом и ссылаться на нее некорректно.
            Edit: грамматика.
              0
              Чем это решение отличается от КриптоАРМ компании Цифровые технологии?
                0
                Шифрованием разделов, скрытием файлов и разделов, созданием виртуальных криптодисков, блокировкой приложений при доступе к шифрованным папкам, прозрачным шифрованием файлов, шифрованием сетевых папок, шифрованием облачных ресурсов, двух факторной авторизацией.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое