4

我使用 OpenSSL 创建了一个私钥和公钥对,然后生成了一个 .p12 文件以将其导入我的 Windows certstore。密钥对和 .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 对证书具有权限。
4

2 回答 2

4

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

问题是我以错误的方式导入 .p12。我双击它并按照步骤操作。这样做是将证书放在当前用户 - 个人证书存储中,所以我认为只需将证书从该存储移动到本地机器存储就足够了......但是哦,惊喜!不是。经过多次修改,我发现 IIS 具有从自身导入证书的能力,并且这会将证书直接放在本地机器证书存储中。如果有人有一些问题或只是想看看如何做到这一点,这些是步骤:

  • 打开 IIS。
  • 转到服务器证书(抱歉,如果您没有找到确切的字词,我的 Windows 是西班牙语)
  • 选择导入
  • 选择您的文件。如果您的文件是像我这样的 .p12 文件,则选择查看 *.*
  • 输入密码
  • 接受……然后瞧
于 2011-05-31T01:33:03.323 回答
1

是的,这是权限问题。前段时间我一直在努力解决这个问题。目前我使用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 帐户添加权限(文章未提及)。

于 2011-05-30T17:01:58.497 回答