如何解决在 .NET 5 中设置证书私钥权限
我有一个要求,我需要为证书私钥设置权限,我使用了下面的方法 (SetCertificatePrivateKeyPermissions),该方法与 .Net framework 4.7.2 一起使用 但现在我不得不将项目框架迁移到 .Net 5,由于这个项目框架升级,现有代码正在中断。
RSACryptoServiceProvider 和 CspParameters 类是指 System.Security.Cryptography.Csp.dll (C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0\System.Security .Cryptography.Csp.dll),有了这个 dll 引用,我面临着现有代码的 2 个问题
-
在将 certificate.PrivateKey 转换为 RSACryptoServiceProvider 的过程中,它返回 NULL。
-
在创建 CspParameters 实例时,我无法从 rsa 分配 CryptoKeySecurity 值,因为此属性在 .NET 5 的 RSACryptoServiceProvider 和 CspParameters 类中不可用/不支持,而在 .NET 4.7 中受支持。 2个版本。
请告诉我如何处理这个问题?或者是否有任何替代解决方案可以为 .NET 5 中的证书私钥设置权限?
代码片段:
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
public static void SetCertificatePrivateKeyPermissions(X509Certificate2 certificate,IdentityReference account,Operation operation)
{
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
if (rsa != null)//ISSUE 1: rsa is NULL
{
var cspParams = new CspParameters(rsa.CspKeyContainerInfo.ProviderType,rsa.CspKeyContainerInfo.ProviderName,rsa.CspKeyContainerInfo.KeyContainerName)
{
Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore,CryptoKeySecurity = rsa.CspKeyContainerInfo.CryptoKeySecurity//ISSUE 2: There is no CryptoKeySecurity property present
};
switch (operation)
{
case Operation.Add:
cspParams.CryptoKeySecurity.AddAccessRule(new CryptoKeyAccessRule(account,CryptoKeyRights.GenericRead,AccessControlType.Allow));
break;
case Operation.Remove:
cspParams.CryptoKeySecurity.RemoveAccessRule(new CryptoKeyAccessRule(account,CryptoKeyRights.GenericAll,AccessControlType.Allow));
break;
default:
throw new ArgumentException("Unhandled operation type");
}
using (var rsa2 = new RSACryptoServiceProvider(cspParams))
{
}
}
}
解决方法
.NET 5 没有 CryptoKeySecurity
,因为它是特定于 Windows 的并且尚未移植(如果曾经计划移植)。关于您的问题的几句话:
-
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
- 自 .NET Framework 4.6 起,此构造可被视为已过时且已弃用。如果您使用的是 4.6+,则在任何情况下都不应使用RSACryptoServiceProvider
。相反,您应该仅访问 X509Certificate2 class extension methods 以检索公钥/私钥句柄。我的博文中有更多详细信息:Accessing and using certificate private keys in .NET Framework/.NET Core。 -
在 Windows 上使用
X509Certificate2.GetRSAPrivateKey()
扩展方法时,它将返回一个RSACng
类的实例,该类包含 Key 类型的属性,类型为 CngKey。然后使用 GetProperty 和 SetProperty 方法读取和写入Security Descr
属性。如果键支持 ACL,您可以检查Security Descr Support
属性(如果支持,则为 1,任何其他值都表示该键不支持 ACL)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。