尝试从Windows certstore读取PrivateKey时出现exception

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

'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对证书具有权限。

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

问题是我以错误的方式导入.p12。 我双击它并按照步骤操作。 这样做的目的是将证书放在当前用户 – 个人证书存储区中,所以我认为只需将证书从该商店移到本地机器商店就足够了……但是太惊喜了! 它不是。 经过多次修订后,我发现IIS具有从内部导入证书的能力,并且这将证书直接放在本地计算机证书存储中。 如果有人遇到某些问题或只是想看看如何做到这一点,这些步骤如下:

  • 打开IIS。
  • 转到服务器证书(对不​​起,如果您没有找到确切的单词,我的Windows是西class牙语)
  • 选择导入
  • 选择你的文件。 如果您的文件是像我一样的.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帐户添加权限(文章没有提到它)。