获取私钥时,密钥无法在指定的状态错误中使用

时间:2016-01-21 11:27:29

标签: wcf cryptography rsa

我有一个由Windows服务托管的 wcf服务。我们使用RSA算法加密的私人证书加密密码。当用户A远程登录时,证书( pfx 文件)安装在服务器上。应用程序抛出异常" 密钥无法在指定状态下使用"当它试图获取私钥时。 Windows服务在帐户本地系统下运行。当在程序集中调用解密函数时,它在帐户A下运行(模拟用于wcf服务中的不同调用)。该服务器是64位Windows Server 2008 R2。相同的代码适用于在Windows Server 2012服务器上安装的其他应用程序中的解密。

我已经完成了以下操作,但最终会收到相同的错误消息:

  1. 再次安装证书(在certmgr.msc中卸载证书,在Crypto文件夹中删除密钥集,检查我收到不同的错误消息(密钥集不可用),重新启动服务器,重新安装相同的证书,重新启动服务器)。
  2. 删除加密文件夹,重新安装证书。
  3. 我信任系统范围内的证书(请参阅:https://superuser.com/questions/370217/trust-ssl-certificate-to-local-system-account
  4. 我已将Windows服务运行的用户更改为帐户A. 我已使用以下命令检查用户A是否可以访问私钥:winhttpcertcfg -l -c CURRENT_USER \ MY MyCertificate。
  5. 要解密的字符串与我们没有遇到此问题的其他应用程序使用的长度相同,因此我们不认为它与长度有关(字符串长度为137)。此外,我们特别知道它无法获取私钥。 (请参阅:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.encrypt.aspx(fOAEP设置为false)
  6. 我在用户A远程登录的服务器上创建了一个名称不同的新证书。
  7. 我已检查域,程序集和mscorlib是否完全受信任
  8. 需要专家的帮助!我可以使用没有证书的旧加密,但这不是那么安全。使用这么多时间而没有任何结果是非常令人沮丧的......

    最好的问候,克里斯汀。

1 个答案:

答案 0 :(得分:0)

我通过创建一个小应用程序来解决这个问题,该应用程序只执行了我在wcf服务中的代码失败的特定事情。每次它工作我都增加了一些复杂性。这样我就知道wcf服务必须像上面提到的用户A一样运行。此外,我发现如果没有我在WCFService上模仿的一些要求,它会工作。对于每种服务方法,我都有这个属性: [OperationBehavior(Impersonation = ImpersonationOption.Required)]。我仍然使用来自调用此WCFService的应用程序的模拟(因为WCF服务在域X中,并且调用它的应用程序在域Y中),但是当我删除属性时它可以工作。

克里斯汀:)