尝试从Windows证书存储读取PrivateKey时发生异常

本文关键字:PrivateKey 异常 读取 存储 Windows 证书 | 更新日期: 2023-09-27 17:58:11

我使用OpenSSL创建了一个私钥和公钥对,然后生成了一个.p12文件将其导入到我的Windows证书存储中。密钥对和.p12文件是在Windows XP中创建的,我正试图在Windows 7中使用它。我正在尝试从IIS中的Web服务(.svc)中访问密钥。如果我试图从独立的应用程序读取私钥,我可以毫无问题地完成,但当我试图从我的网络应用程序读取时,我总是会得到以下异常:

'cert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException'

这就是整个堆叠竞赛:

en System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
en System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
en System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
en System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
en System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
en ValidKeyDll.ValidKey.getLlaveDeAlmacen(String almacen, Boolean esLlavePrivada) en C:'Users'desarrollo'Documents'ValidKeyDll'ValidKeyDll'ValidKey.cs:línea 58
en ValidKeyDll.ValidKey.firmaCadena(String almacen, String cadenaFirmar) en C:'Users'desarrollo'Documents'ValidKeyDll'ValidKeyDll'ValidKey.cs:línea 117

这是我代码中读取密钥的部分:

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in store.Certificates)
{
   if (cert.Subject.Contains(almacen))
   {
      if (cert.NotAfter.CompareTo(System.DateTime.Now) <= 0)
         throw new CertificadoVencidoException();
      if (isPrivateKey)
         csp = (RSACryptoServiceProvider)cert.PrivateKey;
      else
         csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
      break;
   }
}

我想这与某种许可问题有关,但我不知道是什么…如果有人有任何建议,我们将不胜感激。

需要考虑的事项:

  • 私钥是可导出的
  • 用户IIS_IUSRS对证书具有权限

尝试从Windows证书存储读取PrivateKey时发生异常

我终于解决了这个问题,但直到现在才公布答案(因为我是一个初学者):

问题是我导入.p12的方式不对。我双击它并按照步骤进行操作。这样做的目的是将证书放在当前用户-个人证书存储中,所以我认为只需将证书从该存储移动到本地机器存储就足够了。。。但是,哦,惊喜!事实并非如此。经过多次修订,我发现IIS能够从其内部导入证书,这将证书直接放入本地计算机证书存储中。如果有人有一些问题,或者只是想看看如何做到这一点,以下是步骤:

  • 打开IIS
  • 转到服务器证书(很抱歉,如果你找不到确切的单词,我的Windows是西班牙语的)
  • 选择导入
  • 选择您的文件。如果你的文件和我的一样是.p12,那么选择查看**
  • 键入密码
  • 接受。。。瞧

是的,这是权限问题。一段时间前,我一直在与之斗争。目前,我使用winhttpcertcfg来添加适当的权限。

您还应该检查此链接:http://benoit808.wordpress.com/2008/10/31/cryptographicexception-the-handle-is-invalid/.

还有一篇关于它的文章http://www.stevefenton.co.uk/Content/Blog/Date/201101/Blog/X509-Certificates-On-Windows-Server-2003/.您可能还需要添加IIS_WPG和IUSR帐户的权限(文章没有提及)。