Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

36 Страницы«<2829303132>»
Опции
К последнему сообщению К первому непрочитанному
Offline dmi-viktor  
#291 Оставлено : 23 октября 2022 г. 20:55:53(UTC)
dmi-viktor

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.10.2022(UTC)
Сообщений: 3
Мужчина
Российская Федерация
Откуда: Новосибирск

Сказал «Спасибо»: 2 раз
Всем здравствуйте! Пожалуйста подскажите какой пример могу использовать в своем проекте(.net core), для подписания строки присоединённой подписью. Данная работа необходима с целью подписания данных и передачи их в "Честный знак".

С целью подписания скачал приложение КриптоАрм Гост, с его помощью в ручном режиме без проблем подписал и получил заветный токен.

Чтобы автоматизировать данный процесс взял за основу примеры из архива C:\Program Files(x86)\CryptoPro\.NETSDK\Examples\simple.zip. У меня получилась подписать нужный файл, получив на выходе массив типа byte, который в свою очередь конвертировал в base64(Convert.ToBase64String(encodedSignature)), но строка вышла длинее примерно на 2000 символов и самое главное не проходит проверку в честном знаке. Сравнивая полученные варианты из программы КриптоАрм Гост и из того демонстрационного проекта что у меня получился, я вижу отличия как по длине так и по содержанию. К примеру, сколько бы я не подписывал данные в КриптоАрм Гост, он отдаст строку в base64, которая будет начинаться с подстроки "MIA" и заканчиваться на "AAAAAAAA", в демонстрационном проекте начинается с "MIIYJAY" или "MAY" в зависимости от настроек, так же может меняться и длина.

Убрал конвертирование в Base64 и тип кодировки сменил на Der в КриптоАрм Гост. Попытался примерно сравнить результаты(кодировок Der) и тоже увидел отличия. Скорее всего я не понимаю основного, т.к. с целью проверки попробовал самостоятельно конвертировать результат работы ПО КриптоАрм Гост из Der кодировки в Base64 и у меня также ничего не получилось.

Опыта ранее в подписании не имел, очень рассчитываю на Ваши подсказки, заранее спасибо.


Offline Артём Макаров  
#292 Оставлено : 24 октября 2022 г. 11:17:18(UTC)
Артём Макаров

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 216

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: Андрей Врагов Перейти к цитате
Коллеги из КриптоПро,

вот такая конструкция дает ошибку "Value was invalid":

Код:

           _gostParamSet.DigestParamSet = "1.2.643.7.1.1.2.2";
            _gostParamSet.PublicKeyParamSet = "1.2.643.2.2.36.0";

            Gost3410_2012_256EphemeralCryptoServiceProvider sender = new Gost3410_2012_256EphemeralCryptoServiceProvider(_gostParamSet);
            var exportedParameters = sender.ExportParameters(true);


При этом с параметром false все работает, но приватный ключ тогда получить нельзя. Отсюда вопрос, можно ли с помощью этого класса сгенерировать временные (не долгосрочные) ключи и без использования контейнера. Насколько я понимаю, этот класс должен создавать именно временные ключи, которые после удаления объекта также должны удаляться


Экспорт эфемерных закрытых ключей запрещён.

Если вы не хотите оставлять ключевой контейнер на машине после использования классов GostCryptoServiceProvider - проще его просто удалить после использования.

Для этого выставить у ключа (AsymmetricAlgorithm) PersistKeyInCsp=true; после чего сделать Dispose объекта.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Врагов  
#293 Оставлено : 24 октября 2022 г. 15:59:46(UTC)
Андрей Врагов

Статус: Участник

Группы: Участники
Зарегистрирован: 11.04.2017(UTC)
Сообщений: 25

Сказал(а) «Спасибо»: 1 раз
Автор: Артём Макаров Перейти к цитате
Автор: Андрей Врагов Перейти к цитате
Коллеги из КриптоПро,

вот такая конструкция дает ошибку "Value was invalid":

Код:

           _gostParamSet.DigestParamSet = "1.2.643.7.1.1.2.2";
            _gostParamSet.PublicKeyParamSet = "1.2.643.2.2.36.0";

            Gost3410_2012_256EphemeralCryptoServiceProvider sender = new Gost3410_2012_256EphemeralCryptoServiceProvider(_gostParamSet);
            var exportedParameters = sender.ExportParameters(true);


При этом с параметром false все работает, но приватный ключ тогда получить нельзя. Отсюда вопрос, можно ли с помощью этого класса сгенерировать временные (не долгосрочные) ключи и без использования контейнера. Насколько я понимаю, этот класс должен создавать именно временные ключи, которые после удаления объекта также должны удаляться


Экспорт эфемерных закрытых ключей запрещён.

Если вы не хотите оставлять ключевой контейнер на машине после использования классов GostCryptoServiceProvider - проще его просто удалить после использования.

Для этого выставить у ключа (AsymmetricAlgorithm) PersistKeyInCsp=true; после чего сделать Dispose объекта.


Артем, задача состоит в том, чтобы на одной машине сгенерировать эфимерные ключи и отправить открытый ключ с параметрами на другую машину.
На второй машине будут выработан ключ согласования и симметричный ключ шифрования. После чего симметричный ключ будет зашифрован на ключе согласования и отправлен на первую машину вместе с собственным открытым ключем и его параметрами. На первой машине на основе полученного открытого ключа и собственного закрытого ключа также будет выработан ключ согласования и расшифрован симметричный ключ. Просто хотелось бы на первой машине использовать именно временные ключи, чтобы не создавать контейнер на носителе. PersistKeyInCsp=true просто удаляет контейнер, а хотелось бы иметь ключи просто внутри самого csp. Тем более, что они действительно будут существовать крайне непродолжительное время. Или это невозможно в принципе?
Offline Higen  
#294 Оставлено : 25 октября 2022 г. 18:06:27(UTC)
Higen

Статус: Новичок

Группы: Участники
Зарегистрирован: 01.03.2018(UTC)
Сообщений: 8
Российская Федерация

Здравствуйте!

Подписываю вложение для СМЭВ 3 с помощью net core 3.1 из данной темы и возвращается ошибка, о том что подпись неверна. Поддержка СМЭВ ответила следующее:
"зафиксировано что данная подпись не содержит messageDigest (1.2.840.113549.1.9.4) - ГОСТ-digest подписываемого файла. Подпись вложения необходимо формировать в соответствии со спецификацией PKCS#7 (RFC-2315) версии 1.5. В элементе SignerInfo должны присутствовать следующие authenticated attributes: - contentType (1.2.840.113549.1.9.3), всегда имеет значение 1.2.840.113549.1.7.1. - messageDigest (1.2.840.113549.1.9.4), содержит ГОСТ-digest подписываемого файла Просьба ознакомиться с п.6.3.1. "Подписи в формате PKCS#7" документа "Методические рекомендации СМЭВ 3" и направить запрос в соответствии с указанной информацией. В случае возникновения ошибки снова, необходимо приложить xml конверт запроса и подписываемое вложение."

Код для подписания использую такой же как в net 4.5, в которой подпись принималась.

Код:
var _contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(buffer);
            var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(_contentInfo, true);
            var signer = new System.Security.Cryptography.Pkcs.CmsSigner(gostCert);
            signedCms.ComputeSignature(signer);
            var signedData = signedCms.Encode();


Не подскажите в чем может быть проблема?

Спасибо!

Отредактировано пользователем 26 октября 2022 г. 9:41:13(UTC)  | Причина: Не указана

Offline emejibka  
#295 Оставлено : 27 октября 2022 г. 12:56:11(UTC)
emejibka

Статус: Участник

Группы: Участники
Зарегистрирован: 05.09.2017(UTC)
Сообщений: 14

Сказал(а) «Спасибо»: 2 раз
Здравствуйте, коллеги.

Подскажите, пожалуйста, способ как проверить экспортируемость закрытого ключа сертификата, кроме как попытаться экспортировать сертификат. В приложении certmgr, поставляемым c csp, есть просмотр сертификатов, там есть информация о провайдере (например, Инфо о провайдере : Тип провайдера: 80, тип ключа: 1, флаги: 0x0), где найти документацию по этим флагам?
Offline emejibka  
#296 Оставлено : 9 ноября 2022 г. 13:58:49(UTC)
emejibka

Статус: Участник

Группы: Участники
Зарегистрирован: 05.09.2017(UTC)
Сообщений: 14

Сказал(а) «Спасибо»: 2 раз
Здравствуйте, коллеги.
У вас есть платная поддержка?
У меня два вопроса, оба про подписание. Как я уже писал выше, на некоторых сертификатах при вычислении подписи с помощью SignedCms мы получаем ошибку
Цитата:

Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Cryptography error
at Internal.NativeCrypto.CapiHelper.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.get_SafeProvHandle()
at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.get_SafeKeyHandle()
at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider..ctor(CspParameters parameters)
at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKey[T](X509Certificate2 certificate, Boolean silent, Boolean preferNCrypt)
at Internal.Cryptography.Pal.Windows.PkcsPalWindows.GetPrivateKeyForSigning[T](X509Certificate2 certificate, Boolean silent)
at System.Security.Cryptography.Pkcs.CmsSignature.Gost2012_256CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& signatureAlgorithm, Byte[]& signatureValue)
at System.Security.Cryptography.Pkcs.CmsSignature.Sign(ReadOnlySpan`1 dataHash, HashAlgorithmName hashAlgorithmName, X509Certificate2 certificate, AsymmetricAlgorithm key, Boolean silent, Oid& oid, ReadOnlyMemory`1& signatureValue)
at System.Security.Cryptography.Pkcs.CmsSigner.Sign(ReadOnlyMemory`1 data, String contentTypeOid, Boolean silent, X509Certificate2Collection& chainCerts)
at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent)
at MedInfoCenter.CryptoApi.Controllers.DetachedSignatureController.ComputeSignature(ComputeSignatureRequest computeSignatureRequest, String thumbprint) in
...

причём ошибка воспроизводится только на откреплённой подписи, если в параметр detached передать true, ошибка не воспроизводится.
Второй вопрос тот же что @Higen, мы портируем наши приложения на linux и подписи, сделанные на .net core не принимаются СМЭВ, возвращает ошибку
Подпись в формате PKCS7. Нет атрибута [1.2.840.113549.1.9.4] (хеш подписанных данных)

Отредактировано пользователем 9 ноября 2022 г. 13:59:33(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#297 Оставлено : 9 ноября 2022 г. 14:28:59(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Добрый день.

Платная техподдержка есть, но по нашим лицензируемым продуктам. По вопросам с .NET Core я бы пока рекомендовал создавать issue на github -- так оперативнее получится.

На второй вопрос -- добавьте любой подписанный атрибут в подпись (например, signing time или signing certificate) -- тогда появится и необходимый хэш.
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#298 Оставлено : 9 ноября 2022 г. 14:31:14(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,391
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Автор: emejibka Перейти к цитате
Здравствуйте, коллеги.

Подскажите, пожалуйста, способ как проверить экспортируемость закрытого ключа сертификата, кроме как попытаться экспортировать сертификат. В приложении certmgr, поставляемым c csp, есть просмотр сертификатов, там есть информация о провайдере (например, Инфо о провайдере : Тип провайдера: 80, тип ключа: 1, флаги: 0x0), где найти документацию по этим флагам?


экспортируемость можно проверить вызов KP_PERMISSIONS и проверить наличие бита CRYPT_EXPORT
Флаги возможны вот такие (WinCrypt.h):
Код:
// dwFlags definitions for CryptAcquireContext
#define CRYPT_VERIFYCONTEXT     0xF0000000
#define CRYPT_NEWKEYSET         0x00000008
#define CRYPT_DELETEKEYSET      0x00000010
#define CRYPT_MACHINE_KEYSET    0x00000020
#define CRYPT_SILENT            0x00000040
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define CRYPT_DEFAULT_CONTAINER_OPTIONAL 0x00000080
#endif //(NTDDI_VERSION >= NTDDI_VISTA)
Знания в базе знаний, поддержка в техподдержке
Offline pvarfalameev  
#299 Оставлено : 15 ноября 2022 г. 16:35:48(UTC)
pvarfalameev

Статус: Новичок

Группы: Участники
Зарегистрирован: 15.11.2022(UTC)
Сообщений: 1
Российская Федерация

Добрый день!
Подскажите, пожалуйста, является ли сертифицированным решением использование КриптоПРО внутри docker контейнера?
Интересует именно вопрос сертификации,чтобы избежать возможных проблем с проверяющими органами.
Offline VitalyKrasovsky  
#300 Оставлено : 16 ноября 2022 г. 18:17:36(UTC)
VitalyKrasovsky

Статус: Новичок

Группы: Участники
Зарегистрирован: 16.11.2022(UTC)
Сообщений: 2

Коллеги из КриптоПро, подскажите куда конкретно в linux (ubuntu 20.04) устанавливается сертификат, импортированный в систему из pfx-файла штатной утилитой Инструменты КриптоПро (cptools) и как его получить в .net core под linux?

Подробнее:
В ubuntu 20.04 установлен КриптоПро CSP 5.0 R2 по инструкции отсюда (https://support.cryptopro.ru/index.php?/Knowledgebase/Article/View/390/0/rbot-s-kriptopro-csp-v-linux-n-primere-debian-11).
В системе также стоят .net core 3.1 (sdk и runtime), как этого требует ваше тестовое приложение (https://github.com/CryptoPro/DotnetCoreSampleProject/blob/master/docs/Linux.md).
В систему также импортирован сертификат штатной утилитой Инструменты КриптоПро (Вкладка Сертификаты -> Импортировать ключи -> Указан pfx-файл и задан пароль). Сертификат отображается в "Личное", а на вкладке Контейнеры сказано, что считывателем является HDIMAGE. Тестирование контейнер проходит.

В вашем тестовом приложении DotnetCoreSampleProject сертификат для теста добавлен прямо в код в виде массива байтов. Далее он у вас загружается в in-memory store:
Код:

var gostCert = new X509Certificate2(Gost2012_256Pfx, "1", X509KeyStorageFlags.CspNoPersistKeySet)

Нам такой вариант создания сертификата не подходит. Мы бы хотели его получать из хранилища, как это делалось в Windows. В windows этот код упрощенно выглядит примерно так:
Код:

public static X509Certificate2 GetCertificate(Credentials credentials)
{
    var storeNameTag = (StoreName)Enum.Parse(typeof(StoreName), credentials.CertificateStoreName);
    var storeLocationTag = (StoreLocation)Enum.Parse(typeof(StoreLocation), credentials.CertificateStoreLocation);
    var certificateStore = new X509Store(storeNameTag, storeLocationTag);

    certificateStore.Open(OpenFlags.ReadOnly);

    var findByTag = (X509FindType)Enum.Parse(typeof(X509FindType), "FindByThumbprint");
    var certificateCollection = certificateStore.Certificates.Find(findByTag, credentials.CertificateThumbprint, false);
    return certificateCollection.Count != 0 ? certificateCollection[0] : null;
}

В ubuntu же с какими бы мы параметрами не открывали хранилище X509Store, оно ни в одном из вариантов не содержит нужного нам сертификата, добавленного штатной утилитой Инструменты КриптоПро, всегда хранилище не содержит ни одного сертификата. Подскажите пожалуйста как его можно получить из кода?

В ходе экспериментов мы выявили следующую интересную особенность:
Если хотя бы 1 раз в коде выполнить вот такую строчку:
Код:

var cert = new X509Certificate2(File.ReadAllBytes("test.pfx"), "SomePassword");

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

var store = new X509Store();
store.Open(OpenFlags.ReadOnly);

С найденным сертификатом все хорошо, с его помощью можно выполнять подпись, все работает, но на поверку оказалось, что это другой сертификат (точнее его копия, но отпечаток другой). В итоге получается, что по сути один и тот же сертификат у нас в двух хранилищах: один сертификат КриптоПро куда-то запрятал и доступ к нему из кода мы получить не можем, а второй по всей видимости добавляется куда-то в хранилище .net и из кода виден. Нам бы все же хотелось добавлять сертификат штатной утилитой Инструменты КриптоПро и иметь доступ к нему из кода. Просим подсказать с примером кода как это можно осуществить.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
36 Страницы«<2829303132>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.