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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mnsasha  
#1 Оставлено : 20 мая 2021 г. 12:33:17(UTC)
mnsasha

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

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

Сказал(а) «Спасибо»: 2 раз
Я перехожу с .net framework на .net core 3.1 и хочу перейти с подписи через SignedCms на подпись через Gost3410_2012_256CryptoServiceProvider:

В .net framework с пользовался SignedCms:
ContentInfo contentInfo = new ContentInfo(dataToSign);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
Byte[] signatureResult = signedCms.Encode();

В .net core я хочу перейти на Gost3410_2012_256CryptoServiceProvider:
var gostSk = certificate.ProviateKey as Gost3410_2012_256CryptoServiceProvider;
Byte[] signatureResult = gostSk.SignData(dataToSign, HashAlgorithmName.Gost3411_2012_256);

signatureResult сильно отличаются.
Результат подписи строки (поставил * вместо символов для маскировки :) ) «************************************************»
Для .net core (в base64):
vBRtgmH/QRvlgirghXRWHqB9+r2qwrgGo9XSWRvBELbfNbILWpb0I4sDBJydIvmUNaI8bOErX0dgXuTa4Wamlw==
Для .net framework (в base64):
MIIVTgYJKoZIhvcNAQcCoIIVPzCCFTsCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCCEW4wggegMIIHTaADAgECAgoXcDh9AAAAAAQFMAoGCCqFAwcBAQMCMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCwMS4wLAYDVQQJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKgYDVQQKDCPQnNC40L3QutC

Можете подсказать, что такое добавляет signedCms.Encode(), что результат такой длинный? Как добиться такого же в Gost3410_2012_256CryptoServiceProvider?
Online Андрей *  
#2 Оставлено : 20 мая 2021 г. 13:03:15(UTC)
Андрей *

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

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

Сказал «Спасибо»: 385 раз
Поблагодарили: 1563 раз в 1203 постах
Здравствуйте.

signedCms - делает CMS (подпись, сертификат(ы), атрибуты и т.п),
а Gost3410_2012_256CryptoServiceProvider - возвращает подпись.
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#3 Оставлено : 20 мая 2021 г. 13:04:43(UTC)
Андрей *

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

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

Сказал «Спасибо»: 385 раз
Поблагодарили: 1563 раз в 1203 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline mnsasha  
#4 Оставлено : 20 мая 2021 г. 14:51:16(UTC)
mnsasha

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

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

Сказал(а) «Спасибо»: 2 раз
Про CMS понял. А есть ли вариант сначала подписать Gost3410_2012_256CryptoServiceProvider, а затем добавить сертификат(ы), атрибуты и т.п., чтобы получить тот же результат?
Моя цель - использовать файл pfx, и не использовать хранилище сертификатов windows + ключи на флешке/в реестре.
Offline Санчир Момолдаев  
#5 Оставлено : 22 мая 2021 г. 21:25:54(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 65 раз
Поблагодарили: 158 раз в 154 постах
Автор: mnsasha Перейти к цитате
Про CMS понял. А есть ли вариант сначала подписать Gost3410_2012_256CryptoServiceProvider, а затем добавить сертификат(ы), атрибуты и т.п., чтобы получить тот же результат?
Моя цель - использовать файл pfx, и не использовать хранилище сертификатов windows + ключи на флешке/в реестре.


Добрый день!
Код:
            byte[] pfx = File.ReadAllBytes("../../../gost-pass-1.pfx");
            X509Certificate2 cert = new X509Certificate2(pfx, "1", X509KeyStorageFlags.CspNoPersistKeySet);
            Gost3410_2012_256 privateKey = cert.PrivateKey as Gost3410_2012_256;
            
            byte[] msg = File.ReadAllBytes("../../../data.txt");
            
            bool detached = false;
            ContentInfo contentInfo = new ContentInfo(msg);
            SignedCms signedCms = new SignedCms(contentInfo, detached);
            CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown,cert,privateKey);

            cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

            cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
            signedCms.ComputeSignature(cmsSigner);
            byte[] sign = signedCms.Encode();
            File.WriteAllBytes("../../../core_sign.sig", sign);
            Console.WriteLine("sign saved: core_sign.sig");

Отредактировано пользователем 16 июня 2021 г. 2:40:28(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
mnsasha оставлено 16.06.2021(UTC)
Offline mnsasha  
#6 Оставлено : 4 июня 2021 г. 0:46:34(UTC)
mnsasha

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

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

Сказал(а) «Спасибо»: 2 раз
Попробовал ваш код. Но тут я столкнулся с тем, что X509KeyStorageFlags.CspNoPersistKeySet определен в библиотеке, которая подключается по инструкции, описанной вот здесь: https://github.com/Crypt...b/master/docs/Windows.md
Т.е. у меня в файле проекте прописан путь:
..\corefx\artifacts\bin\runtime\netcoreapp-Windows_NT-Debug-x64\System.Security.Cryptography.Pkcs.dll

При этом типы ContentInfo, SignedCms, CmsSigner в этой библиотеке почему-то найти не удается. Что я не делаю не так?



И еще вопрос.
Я пробовал брать сертификат из виндовс-хранилища и использовать на .net core 3.1 вот так (этот код работал на .net framework):
ContentInfo contentInfo = new ContentInfo(dataToSign);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
Byte[] signatureResult = signedCms.Encode();

Я получаю Could not determine signature algorithm for the signer certificate. на строке signedCms.ComputeSignature(cmsSigner);
Тут типы ContentInfo, SignedCms, CmsSigner взяты из стандартной библиотеки .nuget\packages\system.security.cryptography.pkcs\5.0.1\ref\netcoreapp3.0\System.Security.Cryptography.Pkcs.dll
Крипто про обновлено до версии 5.

Вопрос: мне в .net core 3.1 для работы этого примера в любом случае надо следовать инструкции https://github.com/Crypt...b/master/docs/Windows.md ?
Offline Санчир Момолдаев  
#7 Оставлено : 4 июня 2021 г. 1:54:20(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 65 раз
Поблагодарили: 158 раз в 154 постах
использую Rider на Linux
я подключаю так:
Код:
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <RootNamespace>cms_pfx</RootNamespace>
    </PropertyGroup>

    <ItemGroup>
      <Reference Include="System.Security.Cryptography.Algorithms, Version=4.3.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Algorithms\netcoreapp-Unix-Debug\System.Security.Cryptography.Algorithms.dll</HintPath>
      </Reference>
      <Reference Include="System.Security.Cryptography.Csp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Csp\netcoreapp-Unix-Debug\System.Security.Cryptography.Csp.dll</HintPath>
      </Reference>
      <Reference Include="System.Security.Cryptography.Pkcs, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Pkcs\netcoreapp-Unix-Debug\System.Security.Cryptography.Pkcs.dll</HintPath>
      </Reference>
      <Reference Include="System.Security.Cryptography.Primitives, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Primitives\netcoreapp-Debug\System.Security.Cryptography.Primitives.dll</HintPath>
      </Reference>
      <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.X509Certificates\netcoreapp-Unix-Debug\System.Security.Cryptography.X509Certificates.dll</HintPath>
      </Reference>
    </ItemGroup>

    <ItemGroup>
      <PackageReference Include="BouncyCastle.NetCore" Version="1.8.8" />
    </ItemGroup>

</Project>


сделайте по подобию
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
mnsasha оставлено 05.06.2021(UTC)
Offline mnsasha  
#8 Оставлено : 5 июня 2021 г. 23:08:46(UTC)
mnsasha

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

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

Сказал(а) «Спасибо»: 2 раз
После подключения библиотек следующий код заработал! Спасибо!

ContentInfo contentInfo = new ContentInfo(dataToSign);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
Byte[] signatureResult = signedCms.Encode();


Буду пробовать использовать сертификат из файла pfx.

Отредактировано пользователем 5 июня 2021 г. 23:38:17(UTC)  | Причина: Не указана

Offline mnsasha  
#9 Оставлено : 16 июня 2021 г. 1:51:06(UTC)
mnsasha

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

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

Сказал(а) «Спасибо»: 2 раз
Код с использованием pfx файла для подписи работает! Спасибо большое за подсказку, выручили!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.