На Хабре есть великолепная статья "Побег из Крипто Про. Режиссерская версия, СМЭВ-edition", но наступил 2019 год и все УЦ стали выдавать ЭЦП по ГОСТ 34.10-2012 вместо ГОСТ 34.10-2001.

Под катом рассказ как можно модифицировать свой софт на Bouncy Castle для поддержки работы с ключами по новым гостам.

image

Disclaimer


О юридических тонкостях подписывания документов через Bouncy Castle и прочих СКЗИ я ничего не знаю и общаться не готов. Перед использованием кода в продакшене проконсультируйтесь с юристом.

А зачем это вообще надо? хорошо написанно оригинальной статье. Повторяться не буду.

Получение ключа с Токена


image

Все известные мне УЦ выдают ключи с сертификатами на подобных токенах. На токен записан контейнер КриптоПро с приватным ключом и сертификатом. При экспорте ключа через CryptoPro CSP он экспортируется в особый «КриптоПро pfx» не совместимый ни с чем.

Просьбы выдать ключ в стандартном pfx или любом другом типовом контейнере УЦ игнорируют.
Если кто знает УЦ выдающие подписи в стандартных контейнерах поделитесь координатами в комментариях. Хороших людей не стыдно попиарить.

Для преобразования контейнера КриптоПро в стандартный pfx мы как и в оригинальной статье будем использовать P12FromGostCSP. Старые взломанные версии не работают с ключами по 2012 Госту. Идем на сайт авторов и покупаем новую.

Итак мы получили стандартный pfx с ключом и сертификатом.

Обновление Bouncy Castle

Обновляем Bouncy Castle до 1.60 Старые версии могут не поддерживать алгоритмы ГОСТ 2012.

		
<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcprov-jdk15on</artifactId>
	<version>1.60</version>
</dependency>
<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcpkix-jdk15on</artifactId>
	<version>1.60</version>
</dependency>

Инициализация Bouncy Castle

    static {
        BouncyCastleProvider bcProvider = new BouncyCastleProvider();
        String name = bcProvider.getName();
        Security.removeProvider(name); // remove old instance
        Security.addProvider(bcProvider);
    }

Разбор pfx

               
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
ByteArrayInputStream baos = new ByteArrayInputStream(pfxFileContent);
keyStore.load(baos, password.toCharArray());

Enumeration<String> aliases = keyStore.aliases();

while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    if (keyStore.isKeyEntry(alias )) {
        Key key = keyStore.getKey(alias , keyPassword.toCharArray());
        java.security.cert.Certificate certificate = keyStore.getCertificate(alias );
        addKeyAndCertificateToStore((PrivateKey)key, (X509Certificate)certificate);
    }
}

Алиасы обязательно изменяем. Утилита P12FromGostCSP задает всегда один и тот же алиас «csp_exported» и при обработке уже второго ключа будут проблемы.

Для удобства работы ключ из pfx необходимо загрузить в стандартный Java KeyStore и дальше работать только с ним.

Загрузка KeyStore

FileInputStream is = new FileInputStream(keystorePath);
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
char[] passwd = keystorePassword.toCharArray();
keystore.load(is, passwd);

Сохранение ключа с сертификатом в KeyStore


public void addKeyAndCertificateToStore(PrivateKey key, X509Certificate certificate) {
    synchronized (this) {
        keystore.setKeyEntry(alias.toLowerCase(), key, keyPassword.toCharArray(), new X509Certificate[] {certificate});

        FileOutputStream out = new FileOutputStream(keystorePath);
        keystore.store(out, keystorePassword.toCharArray());
        out.close();
   }
}

Загрузка ключей и сертификатов из KeyStore


Enumeration<String> aliases = keystore.aliases();

while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();

    if (keystore.isKeyEntry(alias)) {
        Key key = keystore.getKey(alias, keyPassword.toCharArray());
        keys.put(alias.toLowerCase(), key); //any key,value collection

        Certificate certificate = keystore.getCertificate(alias);
        if (certificate instanceof X509Certificate)
            certificates.put(alias.toLowerCase(), (X509Certificate) certificate); //any key,value collection
    }
}

Подпись файла


CMSProcessableByteArray msg = new CMSProcessableByteArray(dataToSign);
 
List certList = new ArrayList();
certList.add(cert);

Store certs = new JcaCertStore(certList);
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner signer = new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder("GOST3411WITHECGOST3410-2012-256").setProvider("BC").build(privateKey);

gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(signer, certificate));
gen.addCertificates(certs);
CMSSignedData sigData = gen.generate(msg, false);
byte[] sign = sigData.getEncoded(); //result here

Есть вариант JcaContentSignerBuilder(«GOST3411WITHECGOST3410-2012-512») для 512 битовых ключей. Мои УЦ выдают 256 битные ничего не спрашивая и игнорируют уточняющие вопросы.

Проверка подписи


byte[] data = ...; //signed file data
byte[] signature = ...;//signature
boolean checkResult = false;

CMSProcessable signedContent = new CMSProcessableByteArray(data);
CMSSignedData signedData;
try {
    signedData = new CMSSignedData(signedContent, signature);
} catch (CMSException e) {
    return SIGNATURE_STATUS.ERROR;
}

SignerInformation signer;
try {
    Store<X509CertificateHolder> certStoreInSing = signedData.getCertificates();
    signer = signedData.getSignerInfos().getSigners().iterator().next();

    Collection certCollection = certStoreInSing.getMatches(signer.getSID());
    Iterator certIt = certCollection.iterator();

    X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next();
    X509Certificate certificate = new JcaX509CertificateConverter().getCertificate(certHolder);

    checkResult = signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificate));

} catch (Exception ex) {
    return SIGNATURE_STATUS.ERROR;
}

Проверка подписи полностью аналогична проверке по Госту 2001 года. Можно ничего не менять.

Резюме


В результате всех вышеописанных действий мы получили относительно легий способ избавиться от тяжкой ноши Крипто Про в 2019 году.

Комментарии (72)


  1. Neraverin
    19.02.2019 16:17
    +1

    Давайте я вместо юриста сразу проконсультирую:
    63-ФЗ Статья 5. Виды электронных подписей пункт 4:
    «Квалифицированной электронной подписью является электронная подпись, которая соответствует всем признакам неквалифицированной электронной подписи и следующим дополнительным признакам:
    1) ключ проверки электронной подписи указан в квалифицированном сертификате;
    2) для создания и проверки электронной подписи используются средства электронной подписи, имеющие подтверждение соответствия требованиям, установленным в соответствии с настоящим Федеральным законом

    КриптоПро CSP таким средством электронной подписи является, Java KeyStore нет.
    Эта схема конечно будет работать. Но первая же проверка может аннулировать все подписи, которые были выполнены этой системой.


    1. MisterParser
      19.02.2019 21:23

      А кто даст копаться в коде проприетарного проекта частной компании?


      1. Neraverin
        19.02.2019 21:42
        +2

        Я писал про юридическую сторону вопроса и последствия. Вы можете нарушать закон и скрывать это как угодно. Только факт нарушения это не отменяет. И от ответственности не освобождает.


      1. matabili1973
        20.02.2019 14:29

        Любой судья, если сочтет необходимым вынести такое решение. Представьте себе, что вам потребовалось подтвердить юридическую значимость подписи.


    1. ggo
      20.02.2019 09:46

      Что означает «имеющие подтверждение соответствия требованиям»?


      1. Neraverin
        20.02.2019 09:56

        Имеет сертификат ФСБ на соответствие требованиям к средствам криптографической защиты информации и средствам электронной подписи


        1. ggo
          20.02.2019 10:33
          +1

          Такое ощущение, что закон про соответствие требованиям имеет ввиду следующее.

          Есть отсылка на некие требования к средствам электронной подписи.

          для создания и проверки электронной подписи используются средства электронной подписи, имеющие подтверждение соответствия требованиям, установленным в соответствии с настоящим Федеральным законом.


          Сами требования к средствам электронной подписи:
          Статья 12. Средства электронной подписи
          1. Для создания и проверки электронной подписи, создания ключа электронной подписи и ключа проверки электронной подписи должны использоваться средства электронной подписи, которые:
          1) позволяют установить факт изменения подписанного электронного документа после момента его подписания;
          2) обеспечивают практическую невозможность вычисления ключа электронной подписи из электронной подписи или из ключа ее проверки.

          4. Средства электронной подписи, предназначенные для создания электронных подписей в электронных документах, содержащих сведения, составляющие государственную тайну, или предназначенные для использования в информационной системе, содержащей сведения, составляющие государственную тайну, подлежат подтверждению соответствия обязательным требованиям по защите сведений соответствующей степени секретности в соответствии с законодательством Российской Федерации. Средства электронной подписи, предназначенные для создания электронных подписей в электронных документах, содержащих информацию ограниченного доступа (в том числе персональные данные), не должны нарушать конфиденциальность такой информации.


          Т.е. специальное подтверждение нужно для гос.тайны, что логично.

          Из всего этого проистекает, что нельзя использовать BC?

          Прочие мысли вслух:
          А если я подписал документ в помощью устройства, которое сейчас недоступно, и доказать что на том устройстве был КРиптоПро, подписал я с помощью КриптоПро у меня возможности нет. То все, подписанный документ нелегитимен?
          И как доказать что документ подписан именно в BC, а не в КриптоПро?


          1. Neraverin
            20.02.2019 11:31

            Требования, они так и называются. А Статья 12 требованиями не является.
            Приказ ФСБ РФ от 27 декабря 2011 г. № 796 «Об утверждении Требований к средствам электронной подписи и Требований к средствам удостоверяющего центра» — https://www.garant.ru/products/ipo/prime/doc/70039150/

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


            1. ggo
              21.02.2019 09:57

              Т.е. юридическая значимость эцп зависит от лицензии на скзи?

              А используешь ли ты данный скзи для создания эцп, и не используешь — для юридической значимости эцп значения не имеет?


              1. Neraverin
                22.02.2019 10:11

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


                1. ggo
                  22.02.2019 10:50
                  +1

                  Ну давайте пофантазируем.

                  Вот два субъекта в судебном порядке выясняют между собой кто прав. Один (или оба, неважно) предоставляет электронный документ с электронной же подписью, под капотом которой ГОСТ. И прилагает еще лицензию о законном приобретении СКЗИ.

                  Как судья будет выяснять значимость представленного документа? Наверно судья пригласит эксперта в этой области. Пусть будет экспертом сотрудник какого-нибудь Всероссийского Национального Удостоверяющего Центра. Что будет делать данный эксперт с электронным документом и подписью? Наверно проведет экспертизу и вынесет официальным вердикт о соответствии документа подписи, и действительности сертификата подписанта в момент подписи.

                  Будет ли эксперт выяснять, а запускалось ли СКЗИ в момент подписания?

                  далее сугубо имхо.
                  Мне лично понятна идея для чего нужна сертификация СКЗИ. Ровно для того же, для чего нужна сертификация бытовой электроники. Чтобы у обывателей не возникало вопросов, а выполняет ли свою основную функцию продаваемое изделие. Я как обыватель совершенно не понимаю, а всем ли стандартам связи соответствует покупаемой мной мобильный телефон. Пусть специалисты в этой области выясняют это.
                  Но сертификация СКЗИ из средства защиты потребителей, превратилась в средство оказания давления на потребителей же.
                  У потребителя цель — получать юридически значимые электронные документы и подписи. Если на выходе документы валидны, то способ их получения становится вторичным.
                  (оставляем за скобками разные специфичные кейсы, вроде гостайн)


                  1. Neraverin
                    22.02.2019 13:14

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


                  1. a1ien_n3t
                    22.02.2019 14:49

                    Как правильно выше написали сертефикацией СКЗИ хотят обезопасить вас. Саму идея сертефикации СКЗИ я не точтобы сильно приветствую, но если бы она была реализованна адекватно то ее назначения понять можно.
                    Пример того что сертефикация СКЗИ могла бы делать(неуверен что она реально это делает): если взять подпись на эллиптической кривых. И у вас 1) есть возможность подписывать произвольные данные. 2) в реализации алгоритма подписи используется предсказуемый генератор случайных чисел то возможна утечка приватного ключа(привет PlayStation 3).
                    И возможно еще есть какието моменты.


                    1. BugM Автор
                      22.02.2019 14:52

                      Подпись произвольных данных это обычный юзкейс. Используется везде. docx это самые что ни на есть произвольные данные для любой библиотеки реализующей подпись.


                      1. a1ien_n3t
                        22.02.2019 14:55

                        Почитайте алгоритм подписи на эллиптической кривых. Я же специально в комментариях про них упомянул.

                        en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_generation_algorithm


  1. leveler
    19.02.2019 17:00

    Идем на сайт авторов и покупаем новую.

    Зашел на сайт, посмотрел цену. Смысл побега из Крипто Про стал не совсем ясен.


    1. BugM Автор
      19.02.2019 17:25

      Деньги
      BouncyCastle:
      3к в год на организацию. И все.
      На любом количестве виртуалок или докеров будет работать любое количество ЭЦП.

      КриптоПро:
      Лицензия на право использования СКЗИ «КриптоПро CSP» версии 5.0 на одном рабочем месте
      Лицензия на рабочее место не позволит использовать КриптоПро CSP в среде серверных операционных систем 2700 Без НДС.
      Лицензия на право использования СКЗИ «КриптоПро CSP» версии 5.0 на сервере 37500 Без НДС.

      Разница по деньгам более чем на порядок.

      Удобство
      Разница в удобстве просто несравнима.
      Один раз экспортнули и дальше везде типовой софт VS платная проприетарщина на каждом сервере.


      1. insomnium-r
        19.02.2019 17:48

        СКЗИ «КриптоПро CSP» версии 5.0

        насколько я знаю на данный момент она не сертифицирована, странно что они ее продают…
        А вообще, ветер дует в сторону HSM. Там уже будет не обойтись без покупки лицензии.


      1. man41k
        22.02.2019 14:32

        BouncyCastle:
        3к в год на организацию. И все.


        Она же вроде под MIT идет?


        1. BugM Автор
          22.02.2019 14:33

          Утилита для экпорта ключей P12FromGostCSP платная. Без нее совсем никак.


          1. man41k
            22.02.2019 14:39

            сразу не понял что вы про P12FromGostCSP


  1. insomnium-r
    19.02.2019 17:35

    Вообще формат pfx по отношению к ГОСТ не совсем применим. К тому же КриптоПро в плане pfx на данный момент не придерживается рекомендации ТК26, потому контейнеры и нельзя использовать скажем в ViPNet CSP, который тоже поддерживает pfx. А стандартный контейнер под КриптоПРО CSP — это папка с 6 файлами вида exampl.000
    Описанный вами сценарий применим в случае использования в каком-то внутреннем документообороте, где не важно, квалифицированная у вас подпись или нет.
    К вопросу о цене. Что мешает вам найти УЦ, который выпускает ЭП под ViPNet CSP, или выпускает ЭП со вшитой лицензией для КриптоПРО?


    1. BugM Автор
      19.02.2019 17:49

      Из КриптоПро CSP можно экспортировать ключ в .pfx файл. И он получается не совместимым ни с чем. Претензия именно к этому. Раз делаете стандартное расширение используйте стандартный формат.

      Подписи получаются технически абсолютно валидные. Остальное к юристам. Я, как уже и говорил, не специалист в юридических вопросах.

      VipNet не менее платный и не менее проприетарный чем КриптоПро. Соответственно с теми же проблемами. Как лицензировать и да и вообще как оно будет себя вести при автодеплое кучи инстансов непонятно. Да и платить за каждый сервер не очень идея.


      1. insomnium-r
        19.02.2019 18:05

        .pfx файл. И он получается не совместимым ни с чем

        правда чудесно быть монополистом?) (всякие лисси, агавы и прочее не конкуренты, единственный кто пытается посоперничать — випнет)
        Подписи получаются технически абсолютно валидные

        Я вам верю, но вряд-ли получится убедить в этом ФСБ
        VipNet не менее платный и не менее проприетарный

        VipNet CSP бесплатный. По поводу поведения при автодеплое — сталкивался с организациями, в которых ПО деловая почта, используя VipNet CSP, автопроцессингом подписывала и шифровала около 1000 писем в час. (такс… читаю что написал, и даже самому показалось что я топлю за випнет… нене, это не так)


      1. Neraverin
        19.02.2019 19:52

        И он получается не совместимым ни с чем. Претензия именно к этому. Раз делаете стандартное расширение используйте стандартный формат.

        Предположу, что слово стандартный Вами и государством трактуется по разному. Вы ожидаете PKCS #12: Personal Information Exchange Syntax, а КриптоПро обязано соблюдать Р 50.1.112–2016 Транспортный ключевой контейнер


      1. Serge3leo
        20.02.2019 14:24

        Подписи получаются технически абсолютно валидные

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

        Однако если взглянуть на потенциальные каналы взаимодействия с нарушителем, то всё не так однозначно. Ясное дело, чисто формально не проведена сертификация КС1, КС2,… (помнится в начале 2000-х Волчков из ЛанКрипто бегал по всем форумам и площадкам за Репаном из Бифита (или наоборот) и доказывал на конкретных примерах и испытаниях, что Java криптография не так проста, как кажется)

        Но и по сути, прошёл год, другой, срок действия закрытого ключа истёк, наверное надо что-то стереть. Вопрос что стереть и как стереть не так уж тривиален, как может показаться.


  1. Igorjan
    19.02.2019 19:33
    +1

    Разве закрытый ключ не должен быть неизвлекаемым?


    1. Neraverin
      19.02.2019 19:43
      +1

      Должен. Но мечта каждого программиста положить его на сервер в pfx и подписывать все подряд потоком без просмотра. Им же потом не отвечать за деньги\имущество и прочее, что можно присвоить подписав левый документ КЭП


    1. BugM Автор
      19.02.2019 19:58
      +1

      Может быть неизвлекаемым — да. Обязан — нет. Есть море вариантов когда документы надо подписывать на сервере без участия человека.


      Например, выписки из любых гос реестров. Они должны быть подписаны, но участие человека в этом процессе не нужно.


      1. a1ien_n3t
        19.02.2019 20:01

        А как связана извлекаемость ключа и возможность автоматического подписания?


        1. BugM Автор
          19.02.2019 20:12

          Возьмем для примера простенький сервис. Он крутится на виртуалках в 3 разных ЦОДах. Цоды географически расположены в разных регионах. Сервис работает в рид онли режиме и формирует выписки из абстрактного реестра. Онлайн. Человек оплатил услугу, ему тут же упала выписка. Обновление реестра с задержкой в сутки нас устраивает, синхронизация тривиальна.


          Как будем подписывать неизвлекаемым ключом? Сертификат, естественно, должен быть везде одинаковым.


          Пользователь вообще не в курсе что там куча нод стоит. Не надо его нагружать лишней информацией.


          1. a1ien_n3t
            19.02.2019 20:28

            А что мешает взять выпустить 3 сертефиката для разных приватных ключей. И в каждом цоде у вас будет свой hsm со свои приватным ключем. Это если у вас очень критично к отказоустойчивости и доступности. Если нет делаем сервис который просто подписывает то, что ему прислали.


            1. BugM Автор
              19.02.2019 20:33

              Сертификаты разные. Пользователь запрашивает 2 одинаковые выписки и получает подписи с разными сертификатами. Пользователь негодует и начинает писать в техподдержку. Мол какой из них настоящий?


              Hcm не взлетит. Он не совместим с виртуализацией, докерами и прочими автодеплоями нод.


              1. a1ien_n3t
                19.02.2019 21:07

                А в чем проблемма то разных сертефикатов. У вас когда срок сертефиката заканчивается он у вас тоже другой. У вас в этих сертефикатов отличие будет только в публичном ключе. У тогоже гугла куча сертов которые отличаются только публиным ключем ну и немного временем выпуска.
                Вот просто первые которые нашел.
                crt.sh/?id=1214370195
                crt.sh/?id=1214423012
                Просто тут зависит от того что на этих подписях завязанно. Если это просто сайтик то тогда там естественно нет смысла в hsm.
                И прокинуть hsm в докер не проблемма. Просто нода которая у вас отвечает за подпись будет всегда в в на конкретном сервере. Если мы говорим совсем про полностью облачную стуктуру, то тут вопрос в том, что на ключе этом завязанно, так-ка вы его посторонним отдаете. А если инфраструктура ваша, то воткнуть в сервер hsm не кажется большой проблеммой.
                Посылк к тому, что спроектировать инфраструктуру сервиса с hsm на неизвлекаемых ключах вполне реально.


                1. BugM Автор
                  19.02.2019 21:22

                  Подавляющее большинство (если не все) российских УЦ не способны csr подписать. А вы от них космических технологий хотите.

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


          1. ne_kotin
            19.02.2019 21:45

            Как будем подписывать неизвлекаемым ключом?

            Эээээ… PKCS#11? Не, не слышал. Java с аппаратными токенами тоже умеет работать через JCE, насколько помню.

            У вас токен с ключепарой. Он сам по себе может подписывать, шифровать, проверять. Это криптоустройство, а не тупая флэшка с хранением ключей.
            Единственный минус — производительность. ruToken ГОСТ, афаик, пару секунд тратил на вычисление подписи файла в несколько килобайт.

            Ну так для описанных случаев, как вам выше сказали — покупается сертифицированный HSM, и долбитесь в него как положено.
            Всё уже придумано до вас.


            1. Neraverin
              20.02.2019 10:00

              Модели ruToken ГОСТ никогда не существовало, путаете с etoken.
              Актуальная модель Рутокен ЭЦП 2.0 вычисляет подпись за 0.3сек, а аппаратно хэширует со скоростью порядка 100Кб\с. Есть и более быстрые модели — 0.1 секунды и 250Кб\с соответственно. Можно сделать и быстрее, но это просто никому не нужно.


              1. ne_kotin
                20.02.2019 12:59

                Да, eToken. У меня как раз он, модель которая лет пять назад выдавалась в УЦ Ростелекома для доступа к Госуслугам.
                Более быстрые модели нужны всегда. Скорость — это ресурс, его много не бывает.


                1. Neraverin
                  20.02.2019 13:23

                  Более быстрые модели нужны всегда

                  Рынок говорит об обратном. Люди просто не готовы платить лишние деньги за скорость.


                  1. BugM Автор
                    20.02.2019 13:36

                    Ну действительно а зачем платить больше?
                    Для личного использования скорости вашей Рутокен ЭЦП 2.0 хватает с головой. Продукт замечательный.

                    Для серверного использования любая железка для эцп получается плохой и неудобной. Хочется все программно делать.

                    И в итоге быстрые железки рынку действительно не нужны.


                    1. Neraverin
                      20.02.2019 13:40

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


                      1. BugM Автор
                        20.02.2019 13:55

                        Я, как разработчик, не участвую в прибылях и соответственно не беру на себя риски за потери.

                        А что даст железка? Я реально не понимаю. Берем ваш Рутокен ЭЦП 2.0. Считаем что пин введен и сохранен заранее. Нам надо подписывать регулярно, каждый раз пин требовать пользователи взбунтуются. Процесс подписи выглядит ровно так же как и с BC. Берем буфер и отправляем его на подпись на токен. Получаем готовую подпись и сохраняем. Вся разница в том кто математику считает BC или железка. Ну и в том что токен можно вынуть и унести.

                        Подмена буфера выглядит одинаково при любом из двух процессов подписи. Он и в том и в другом случае успешно подпишется.
                        Дополнительная защита только в возможности вынуть токен физически. Для серверов она не применима.


                        1. Neraverin
                          20.02.2019 14:12

                          Я, как разработчик, не участвую в прибылях и соответственно не беру на себя риски за потери.


                          Позиция понятно. Вот только бизнес в таких вопросах обычно не компетентен. И идет на поводу у разработчиков. А страдают потом пользователи. Вам на них, похоже, наплевать.

                          Я уже писал, что удобство и безопасность всегда противоречат друг другу. Мы даем средства, которые позволяют сделать безопасно. У нас есть тот же Рутокен ЭЦП PINPad, который защищает от подмены буфера.


                          1. BugM Автор
                            20.02.2019 14:27

                            Мы говорим про использование на серверах.
                            Там по определению жать кнопочку на устройстве некому.

                            Для работы у пользователей вариант интересный. А как именно он визуализирует? Подписываем pdf или docx или вообще xml. Что он будет отображать?


                      1. ggo
                        20.02.2019 14:51

                        А как банки свои платежки между банками гоняют?
                        Там суммы существенно больше 10 млн…


      1. Neraverin
        19.02.2019 20:05

        КЭП — это личная подпись. А выписки из любых гос.реестров по хорошему должны быть подписаны не лично человеком, а гос. органом. В этом случае КЭП не нужен.


        1. BugM Автор
          19.02.2019 20:30

          Увы в российских реалиях это не так работает.
          Чтобы далеко за примером не ходить: У меня на полисе Е-ОСАГО написано что его выдал менеджер Иванов И.И. и транзакция в РСА наверняка была заверена его ЭЦП.


          1. Neraverin
            19.02.2019 21:23

            Иванов И.И. видел, что подписывает ваш полис Е-ОСАГО, а не документы о продаже своей квартиры. И делалось это скорее всего не потоком, без его участия.


            1. BugM Автор
              19.02.2019 21:33
              +1

              Ага, аж 2 раза видел. Именно в те 10 секунд которые прошли от момента оплаты до момента появления полиса в почте. Вроде взрослые люди, в сказки верить поздно уже.


              1. Neraverin
                19.02.2019 21:46

                То что другие совершают ошибки реализации и делают проблемные системы, это не повод их копировать. Сами сетуете на то, что УЦ не умеют или не могут что-то сделать и одновременно продвигаете свои костыли. А где-то потом другой разработчик будет страдать.


                1. astralNord
                  20.02.2019 13:17

                  Разработчики таких систем вынуждены выкручиваться из иезуитских требований законодателей, регуляторов и экспертов у которых в голове похоже следующая каша:

                  1. ЭЦП, шифрование и СЗКИ это практичеки панацения от всех без в области защиты информации.
                  2. Работа с ПДн, договорами и т.д. в бизнесе это как работа с грифованными документами только в электронном виде.
                  Иначе такой результат мог выдать только сумрачный гений лоббирующий услуги УЦ =)
                  Резюмировл это ещё Виктор Степаныч: «Хотели как лучше, а получилось как всегда».

                  Судя по комментариям вы со СМЭВ не работали =)
                  Попробуйте прикинуть на примере крупного банка во сколько обойдется реализации идентификации клиентов по уприд с соблюдением духа и буквы соотв. законов, подзаконных актов и многочисленных регламентов и инструкций. А главное взвесте с ценностью, которую получит бизнес.

                  Подсказка, каждому оператору ПД (сиречь операционисту) понадобится ЭП-ОВ, рабочее место с СЗКИ и т.д. и тп… В этом случае без бумажки ты букашка, даже продлить такую ЭЦП удаленно без доставки бумажного заявления с подписью и печатью нельзя, даже когда ничего не менялось.

                  А проверку через уприд надо делать не раз в жизни клиента, ПОД-ФТ может по такой пьянке захотеть перестраховаться и проверять при оформлении каждого нового как минимум кредитного продукта, также минимум раз в год для каждого клиента (это уже требовния закона).

                  Сколько таких Ивановых потребуется для Сбера к примеру, сколько это будет стоить так чтобы уровень сервиса не просел?


                  1. Neraverin
                    20.02.2019 13:31

                    Безопасность и удобство это всегда противоречащие друг друга требования. Вы хотите сделать удобно и небезопасно, и еще чтобы это небезопасно вам ФСБ разрешило. Так, очевидно, никогда не будет.
                    Проблем много, я с этим не спорю. Писать комментарии на Хабре просто, что-то реально изменить — куда сложнее. ТК26 принимает желающих, только почему-то очереди туда вступить я не видел.


                    1. astralNord
                      20.02.2019 14:28

                      Ну вот про это я и писал в п1. — «панацея». Посмотрите более широко на проблему защиты скажем тех же персональных данных в банках / телекоме / фин. орг. и т.д. где много клиентов и нужно реализовать сценарии массового обслуживания.
                      Воспринимайте систему не как исключительно техническую, но и охватите весь процесс целиком в котором присутствуют и люди.

                      Требуемое на практике усложнение и удорожание процедур работы с такими данными приводит к тому, что потребуется больше низкоквалицированных людей (вставить ключ, нажать несколько кнопок и ввести пин код ключа — вы же призываете понижать защищённость и отказываться от пинкода или упаси боже запоминать его?) и больше затрат на обеспечение их деятельности, чтобы полностью соблюсти все требования. В итоге первый кто будет выполнять все-все требования как вы за них пропагандируете, да ещё и будет перестраховываться в мутных нечётко сформулированных местах (а это практически best-practice в законодательстве) — сильно обрушит уровень обслуживания клиентов, повысит издержки на процесс и закономерно потеряет долю рынка или вообще вылетит.

                      Но самое печальное, что защищённости данных это не повысит, так как сейчас доминирующие каналы утечки ПДн — это люди. А людей в такой системе станет больше, они будут менее квалифицированы и менее оплачиваемы, соответственно, у них будет больше соблазнов подзаработать на сливе ПДн.

                      Т.е. по факту ухудшается и безопасность и удобство всей системы в целом.

                      Причем здесь ТК26? Я не говорю что стандарты криптографической защиты серии ГОСТ плохие, я говорю что регламенты и процедуры излишне усложнены и требования к мерам криптозащиты во многих местах неразумно завышены, также по факту навязывается не самая их лучшая реализация.

                      Как-то так кристаллизуются мои мысли по опыту работы со СМЭВ почти пару лет.
                      Не говоря уже про обычные косяки работы госзаказами и монополистами. Сначала правой рукой ставим сроки перехода на ГОСТ Р 34.10-2012, левой их срываем, для себя правой рукой подмахиваем поблажку, а проблемами обычных пользователей при этом особо никого не волнуют.


  1. DonAlPAtino
    19.02.2019 20:05
    +1

    А можно вопрос немного не в тему (просто увидел ключевые слова CryptoPro и сертификаты) — есть какой-нибудь простой способ из командной строки получить сроки валидности сертификатов из контейнеров Crypto Pro? Очень хочется в zabbix дату окончания сертификата запихнуть для мониторинга, а то пользователи за ними не смотрят, а потом децибеллы извергают ;-(


    1. BugM Автор
      19.02.2019 20:35

      Сертификаты без проблем экспортируются в нормальные открытые форматы. Я не понимаю в чем проблема? openssl справится.


      1. DonAlPAtino
        20.02.2019 10:22

        CryptoPro хранит все в своих специфических контейнерах. Способо экспортировать из этого контейнера в cer, например, я не нашел


        1. BugM Автор
          20.02.2019 13:20

          Сертификат можно скопировать в стандартный .cer. И дальше можно делать с ним что угодно любым типовым ПО.
          Проблема только с приватными ключами.


          1. DonAlPAtino
            20.02.2019 14:18

            Чем? Вернее чем из командной строки? Приватные ключи мне не интересны. Вернее с ними как раз замечательно справилась стандартная криптопрошная тулза.


            1. astralNord
              20.02.2019 14:38

              Как и написали — экспортируйте ручками через крипто-про CSP сам сертификат в name.cer, далее можно таким скриптиком в bash
              #!/bin/bash

              end_date=`openssl x509 -noout -enddate -in name.cer | cut -d '=' -f 2`
              if [ -n "$end_date" ]; then
              end_date_seconds=`date '+%s' --date "$end_date"`
              now_seconds=`date '+%s'`
              echo "($end_date_seconds-$now_seconds)/86400" | bc
              fi

              В результате даст вам к-во дней до окончания сертификата.


    1. Neraverin
      19.02.2019 21:50

      1. DonAlPAtino
        20.02.2019 10:20
        -1

        ну я спрашивал про «простой» способ. А тут получается надо устанавливать сертификат в систему, прочитать дату, удалить. И так каждый день.


        1. Neraverin
          20.02.2019 11:35

          Почему каждый день? Если сертификат в систему импортировать, то потом его можно экспортировать как cer. Windows это вполне штатными средствами умеет. Насчет командной строки не помню (в mmc точно можно), но скорее всего certutil может.


          1. DonAlPAtino
            20.02.2019 11:46

            У меня сертификаты в контейнерах для пол-сотни юрлиц. Обновляют их рядовые сотрудники когда их система (КриптоПро, Такском, 1С) спросит. А не спросит — не обновят. Так что там все меняется динамически мне надо как-то это контролировать.


            1. Neraverin
              20.02.2019 12:26

              Рядовые сотрудники в Windows все равно не смогут пользоваться контейнером пока не установят его в систему. Каждый день запускаете 1 раз certutil перебирая все сертификаты. Если у сертификата приближается срок действия — поднимаете сигнал. Если появился новый сертификат, когда его обновили, то как только его установят в систему, Вы будете и его мониторить.


              1. DonAlPAtino
                20.02.2019 13:21

                Благополучно пользуются — контейнеры CryptoPro все подключены, а обновление сертификатов внутри контейнеров особых прав не требует. Для работы устанавливать эти сертификаты в систему не надо, их и не ставят.
                Мой вопрос был как раз как перебрать и получить даты окончания срока действия из сертификатов лежащих ВНУТРИ контейнеров CRyptoPro.


    1. Kocmohabt314
      20.02.2019 14:06

      1. DonAlPAtino
        20.02.2019 14:27

        Оно! Спасибо огромное.


  1. Greyushko
    20.02.2019 15:01

    Я не эксперт, но ведь в статье на которую вы ссылаетесь явно сказано «Поэтому все нижеописанное относится девелоперскому или тестовому окружению, где мы сами себе хозяева.». А что мешает взять для тестового окружения ключ сгенерированный самостоятельно на коленке с самоподписанным сертификатом?

    Использовать ключ от чужого СКЗИ в отрыве от этого СКЗИ довольно странно: кто обеспечит контроль корректности его использования?
    На вопрос «да что там использовать, берешь описание алгоритма да реализуешь» можете обратиться к простым материалам:
    cryptopro.ru/blog/2014/08/25/nemnogo-ob-atakakh-po-pobochnym-kanalam
    cryptopro.ru/blog/2017/05/17/o-nagruzke-na-klyuch-chast-1
    cryptopro.ru/blog/2017/05/29/o-nagruzke-na-klyuch-chast-2


    1. astralNord
      20.02.2019 15:09

      В среду разработки/тестирования СМЭВ, к примеру, вы не сможете успешно отправить сообщение подписанное ключом сгенерированным самостоятельно на коленке с самоподписанным сертификатом.
      Получите ошибку, а не ожидаемый ответ.
      Соответственно, не сможете проверить, а правильно ли всё реализовали.


      1. Greyushko
        20.02.2019 15:29

        То есть, я правильно понимаю, что вопрос в том, что есть некоторая тестовая удаленная система с документированным интерфейсом, которая принимает только запросы, подписанные ключом с квалифицированным сертификатом?
        Тогда не очень понятно следующее:
        1) Автор предлагает выгрузить закрытый ключ, подпись которым обладает юридической значимостью, на десятки (сотни) машин? Если только на одну «эталонную» для тестирования, то опять же разницы между покупкой КриптоПро CSP и этой хакерской тулзы нет никакой. А если на огромное количество, как будет контролироваться то, что ключ никто не использует для «неподходящих» действий. Если бы для тестовой системы, которую разрабатывает моя компания, потребовалось положить на десятки машин мой ключ с квалифицированным сертификатом для Госуслуг, я бы, мягко говоря, остерёгся.
        2) Почему нельзя приобрести ключ со встроенной в сертификат лицензией на CSP? Тогда не нужны кучи лицензий на машины.
        3) Почему нельзя вести разработку с тестовым окружением (сделанный на коленке стенд, эмулирующий сервер), а затем уже доводить напильником на машине с легальным CSP?


        1. astralNord
          20.02.2019 16:07

          Ну как документированным… В лучших традициях госзаказчиков. Неполно, неактуально, не для людей, зато формально по ГОСТ.

          1) Ну если строго следовать букве и духу то да, надо получать тысячи ключей и т.д.
          А вас не напрягает необходимость подписывать вашей ЭЦП тысячи сообщений в час, где этапа подписи человеком вообще не должно быть? =)

          2) CSP — это windows, который кстати при подключении рутокена на котором это ключ распространяется иногда начинает жутко тормозить и делает еще некоторые выкрутасы. Вы же покупате лицензию в составе ключа, как не нужна? :) Только платите не сразу а по факту за 2 года стоимость лицензий.

          3) эм… Ну после таких предложений хочется поступить как поддержка смэв с ответом на любой конкретный вопрос и адресовать вас к документации, вас ждут там сюрпризы =) Готов поклониться 100 раз в ноги если быстро на коленке сделаете стенд эмулирующий сервер смэв, включая проверку реализации подписи согласно всем методическим материалам =)

          Корень проблемы в другом. Есть в некоторых случаях весьма нагруженный обмен сервер — сервер, для которого какой-то сумрачный гений придумал требовать усиленную эцп на должностное лицо и соблюдать кучу других требований и прописал это в законах и подзаконных актах.
          Такой порядок уместен для работы с секретными бумажками именно как бумажками, но не для случая работы ИС на потоке с большой нагрузкой.


  1. astralNord
    20.02.2019 16:07

    не в ту ветку — del