gpt4 book ai didi

c# - 尝试从 Windows certstore 读取私钥时出现异常

转载 作者:太空狗 更新时间:2023-10-30 01:09:42 24 4
gpt4 key购买 nike

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

'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

这是我读取 key 的代码部分:

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,那么选择查看*.*
  • 输入密码
  • 接受...然后瞧

关于c# - 尝试从 Windows certstore 读取私钥时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6178711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com