Atom Лента - Форум КриптоПро - Тема:Как подписать строку с помощью сертификата? - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Kakpodpisat'strokuspomoshch'jusertifikata?-10:1Copyright 2024 Форум КриптоПро2024-03-29T18:14:12Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruvanesrilaxhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=54035&name=vanesrilaxvanesrilaxhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=54035&name=vanesrilaxvanesrilaxhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=54035&name=vanesrilaxYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid110866:1Как подписать строку с помощью сертификата?<table class="content postContainer_Alt" width="100%"><tr><td>Если запускать пример через SimpleCS.exe то все работает, что я делаю не так?</td></tr></table>2019-12-24T12:47:18+03:002019-12-24T12:47:18+03:00vanesrilax<table class="content postContainer_Alt" width="100%"><tr><td>Если запускать пример через SimpleCS.exe то все работает, что я делаю не так?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid110823:1Как подписать строку с помощью сертификата?<table class="content postContainer" width="100%"><tr><td>Добрый день! Установил:<br />КриптоПро CSP 5.0 для Windows<br />КриптоПро .NET 1.0.7132.0 (NET-x64-rus.msi)<br />КриптоПро .NET SDK 1.0.7132.0 (NETSDK-x64-rus.msi)<br /><br />Взял пример с файла DetachedSignature.cs<br />Импортировал сертификат в хранилище, пытаюсь подписать строку, выдает мне следующее:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">Could not determine signature algorithm for the signer certificate.</code></pre>
</div></div><br />Вот мой код:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">using System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace MiacCrypto
{
class SingleSigner
{
public void MsgSegner(string msg)
{
Console.WriteLine("Полученное сообщение: " + msg);
Encoding unicode = Encoding.Unicode;
byte[] msgBytes = unicode.GetBytes(msg);
X509Certificate2 signerCert = GetSignerCert("ГБУЗ");
Console.WriteLine(signerCert.Subject);
try
{
byte[] encodedSignature = SingMsg(msgBytes, signerCert);
File.WriteAllBytes("signature.bin", encodedSignature);
}
catch (System.ArgumentNullException ex)
{
}
}
private static byte[] SingMsg(Byte[] msg, X509Certificate2 singleCert)
{
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(singleCert);
try
{
signedCms.ComputeSignature(cmsSigner);
return signedCms.Encode();
}
catch (System.Security.Cryptography.CryptographicException ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
static X509Certificate2 GetSignerCert(string signerName)
{
X509Store storeMy = new X509Store(StoreName.My,
StoreLocation.LocalMachine);
storeMy.Open(OpenFlags.ReadOnly);
Console.WriteLine("Число сертификатов: " + storeMy.Certificates.Count);
X509Certificate2Collection certColl =
storeMy.Certificates.Find(X509FindType.FindBySubjectName,
signerName, false);
Console.WriteLine(
"Найдено {0} сертификат(ов) в хранилище {1} для субъекта {2}",
certColl.Count, storeMy.Name, signerName);
if (certColl.Count == 0)
{
Console.WriteLine(
"Сертификат для данного примера не найден " +
"в хранилище. Выберите другой сертификат для подписи. ");
return null;
}
storeMy.Close();
return certColl[0];
}
}
}
</code></pre>
</div></div><br />Сертификат у меня гост 2012<br />Что я делаю не так?<br />Заранее большое спасибо!</td></tr></table>2019-12-23T15:40:48+03:002019-12-23T15:40:48+03:00vanesrilax<table class="content postContainer" width="100%"><tr><td>Добрый день! Установил:<br />КриптоПро CSP 5.0 для Windows<br />КриптоПро .NET 1.0.7132.0 (NET-x64-rus.msi)<br />КриптоПро .NET SDK 1.0.7132.0 (NETSDK-x64-rus.msi)<br /><br />Взял пример с файла DetachedSignature.cs<br />Импортировал сертификат в хранилище, пытаюсь подписать строку, выдает мне следующее:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">Could not determine signature algorithm for the signer certificate.</code></pre>
</div></div><br />Вот мой код:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">using System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace MiacCrypto
{
class SingleSigner
{
public void MsgSegner(string msg)
{
Console.WriteLine("Полученное сообщение: " + msg);
Encoding unicode = Encoding.Unicode;
byte[] msgBytes = unicode.GetBytes(msg);
X509Certificate2 signerCert = GetSignerCert("ГБУЗ");
Console.WriteLine(signerCert.Subject);
try
{
byte[] encodedSignature = SingMsg(msgBytes, signerCert);
File.WriteAllBytes("signature.bin", encodedSignature);
}
catch (System.ArgumentNullException ex)
{
}
}
private static byte[] SingMsg(Byte[] msg, X509Certificate2 singleCert)
{
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(singleCert);
try
{
signedCms.ComputeSignature(cmsSigner);
return signedCms.Encode();
}
catch (System.Security.Cryptography.CryptographicException ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
static X509Certificate2 GetSignerCert(string signerName)
{
X509Store storeMy = new X509Store(StoreName.My,
StoreLocation.LocalMachine);
storeMy.Open(OpenFlags.ReadOnly);
Console.WriteLine("Число сертификатов: " + storeMy.Certificates.Count);
X509Certificate2Collection certColl =
storeMy.Certificates.Find(X509FindType.FindBySubjectName,
signerName, false);
Console.WriteLine(
"Найдено {0} сертификат(ов) в хранилище {1} для субъекта {2}",
certColl.Count, storeMy.Name, signerName);
if (certColl.Count == 0)
{
Console.WriteLine(
"Сертификат для данного примера не найден " +
"в хранилище. Выберите другой сертификат для подписи. ");
return null;
}
storeMy.Close();
return certColl[0];
}
}
}
</code></pre>
</div></div><br />Сертификат у меня гост 2012<br />Что я делаю не так?<br />Заранее большое спасибо!</td></tr></table>