Здравствуйте, у меня есть сертификат GOST 2012, выданный с помощью программы CryptoPRO.
Мне необходимо написать программу на C# которая будет подписывать строку этим сертификатом.
Вот что я установил на компьютер:
- КриптоПро CSP 5.0 для Windows
- КриптоПро .NET 1.0.7132.0 (NET-x64-rus.msi)
- КриптоПро .NET SDK 1.0.7132.0 (NETSDK-x64-rus.msi)
Далее посмотрел пример по адресу:
C:\Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\CMS\cs\DetachedSignature.cs
Вроде все просто, написал код по примеру:
sing System;
using System.IO;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace MyCrypto
{
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);
signedCms.ComputeSignature(cmsSigner); //В этой строке выходит исключение:
//System.Security.Cryptography.CryptographicException: "Could not determine signature algorithm for the signer certificate."
return signedCms.Encode();
}
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];
}
}
}
Я так понял что ошибка в том что он не знает как работать с GOST сертификатами, но что я делаю не так? Заранее большое спасибо!