尝试从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对证书具有权限
我终于解决了这个问题,但直到现在才公布答案(因为我是一个初学者):
问题是我导入.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帐户的权限(文章没有提及)。