微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 .NET 5 中设置证书私钥权限

如何解决在 .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 个问题

  1. 在将 certificate.PrivateKey 转换为 RSACryptoServiceProvider 的过程中,它返回 NULL。

  2. 在创建 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 的并且尚未移植(如果曾经计划移植)。关于您的问题的几句话:

  1. 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

  2. 在 Windows 上使用 X509Certificate2.GetRSAPrivateKey() 扩展方法时,它将返回一个 RSACng 类的实例,该类包含 Key 类型的属性,类型为 CngKey。然后使用 GetPropertySetProperty 方法读取和写入 Security Descr 属性。如果键支持 ACL,您可以检查 Security Descr Support 属性(如果支持,则为 1,任何其他值都表示该键不支持 ACL)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。