1

我有一项使用私钥进行加密的服务。当我授予服务管理权限时,它可以工作。使用普通权限,它不会。调用 GetRSAPrivateKey() 时出现错误“指定的提供程序类型无效”。

var data = Convert.FromBase64String(cipherText);
var dataList = data.ToList();

using (var store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine))
using (var aesProvider = new AesCryptoServiceProvider())
{
    store.Open(OpenFlags.ReadOnly);
    byte[] key;
    using (var cert = store.Certificates.Find(X509FindType.FindBySubjectName, CertificateName, false)[0])
    {
        var publicKey = cert.GetRSAPublicKey();
        var encryptLength = publicKey.Encrypt(Encoding.UTF8.GetBytes("xxxxxxx"), RSAEncryptionPadding.OaepSHA512).Length;
        var encryptedKey = dataList.Take(encryptLength).ToArray();
        dataList.RemoveRange(0, encryptLength);
        var privateKey = cert.GetRSAPrivateKey();
        key = privateKey.Decrypt(encryptedKey, RSAEncryptionPadding.OaepSHA512);
    }

如果密钥不存在,则会在安装过程中以编程方式将其添加到存储中。

var rsa = RSA.Create(2048);
var request = new CertificateRequest($"cn={CertificateName}", rsa, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
var cert = request.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(50));
File.WriteAllBytes("c:\\temp\\EncryptionCert.pfx", cert.Export(X509ContentType.Pfx, _certificatePassword));
store.Open(OpenFlags.ReadWrite);
using (var cert = new X509Certificate2("c:\\temp\\EncryptionCert.pfx", _certificatePassword,
                    X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet))
{
    store.Add(cert);
}

是否有允许访问证书存储的非管理员帐户设置,或者我在加载代码时做错了什么?

4

1 回答 1

2

只有管​​理员和本地系统才能访问本地机器存储中的密钥。对于在不同安全上下文下运行的客户端应用程序,CurrentUser\My应使用存储。并且不要使用任何其他存储,而不是使用My私钥存储证书。否则,当本地计算机存储中的密钥向下传播到系统上的所有用户时,您可能会打开一个漏洞。只有My商店不会传播给其他用户。

于 2021-02-01T20:18:07.220 回答