J'ai un problème avec le certificat du magasin. Dans mon application, l'utilisateur peut utiliser le certificat du fichier ou le certificat du magasin. Après le chargement du certificat, j'utilise un certificat pour les données de signe.Utilisation du certificat du magasin pour RSACryptoServiceProvider
L'utilisation du certificat du fichier est OK, mais je ne peux pas utiliser l'équivalent du magasin.
Code pour signe:
// 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);
}
Code pour le certificat de lecture du fichier:
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;
}
}
Code pour le certificat de lecture du magasin. Après le certificat de chargement du magasin, je suis incapable de signer des données:
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;
}
}
}
Je n'ai aucune expérience dans l'utilisation des certificats. Mais j'ai besoin d'équivalent d'obtenir un certificat du magasin pour la signature.
System.Security.Cryptography.CryptographicException est lancé sur ExportParameters (true). Informations supplémentaires sur Exception: Clé non valide pour une utilisation dans un état spécifié.
Merci.
'Je suis incapable de signer data' - cela ne nous dit pas quelque chose d'utile. Un message d'erreur et un élément de code qui déclenche l'erreur seraient utiles. – Crypt32
Ajout d'informations sur exception: System.Security.Cryptography.CryptographicException est lancé sur ExportParameters (true). Informations supplémentaires sur Exception: La clé n'est pas valide pour une utilisation dans un état spécifié. –