У меня проблема с сертификатом из магазина. В моем приложении пользователь может использовать сертификат из файла или сертификата из магазина. После загрузки сертификата я использую сертификат для данных знака.Использование сертификата из магазина для RSACryptoServiceProvider
Использование сертификата из файла в порядке, но я не могу использовать эквивалент из хранилища.
Код для знака:
// Sign data
using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
{
byte[] dataToSign = Encoding.UTF8.GetBytes(plainText);
csp.ImportParameters(((RSACryptoServiceProvider)_certPopl.PrivateKey).ExportParameters(true));
byte[] signature = csp.SignData(dataToSign, "SHA256");
// Verify signature
if (!csp.VerifyData(dataToSign, "SHA256", signature))
throw new Exception("Nepodařilo se vytvořit platný podpisový kód poplatníka.");
PKP = Convert.ToBase64String(signature);
}
Код сертификата для чтения из файла:
X509Certificate2Collection certStore = new X509Certificate2Collection();
certStore.Import(fileName, password, X509KeyStorageFlags.Exportable);
foreach (X509Certificate2 cert in certStore)
{
// Find the first certificate with a private key
if (cert.HasPrivateKey)
{
_certPopl = cert;
break;
}
}
Код сертификата для чтения из магазина. После загрузки сертификата из магазина я не могу подписать данные:
public void LoadCertificate(string certificateName, DateTime notAfter, string password)
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.MaxAllowed);
foreach (var certificate in store.Certificates)
{
if (certificate.FriendlyName.Equals(certificateName) && certificate.NotAfter.Equals(notAfter))
{
//X509Certificate2Collection certStore = new X509Certificate2Collection();
//certStore.Import(certificate.Export(X509ContentType.SerializedCert), password, X509KeyStorageFlags.Exportable);
//_certPopl = certStore[0];
X509Certificate2Collection certStore = new X509Certificate2Collection();
certStore.Import(certificate.GetRawCertData());
foreach (X509Certificate2 cert in certStore)
{
// Find the first certificate with a private key
if (cert.HasPrivateKey)
{
_certPopl = cert;
break;
}
}
break;
}
}
}
У меня нет опыта работы с сертификатами. Но мне нужен эквивалент получения сертификата из магазина для подписания.
System.Security.Cryptography.CryptographicException выбрано ExportParameters (true). Дополнительная информация об исключении: Ключ не действует для использования в указанном состоянии.
Спасибо.
'Я не могу подписать data' - это не говорит нам ничего полезного. Сообщение об ошибке и фрагмент кода, который вызывает ошибку, будет полезен. – Crypt32
Добавлена информация об исключении: System.Security.Cryptography.CryptographicException выбрано ExportParameters (true). Дополнительная информация об исключении: ключ не действителен для использования в указанном состоянии. –