2009-12-13 96 views
5

在安装客户端证书的公共部分,我收到例外“对象只包含密钥对的公共部分,也必须提供私人密钥”。我的应用程序是通过ASP.NET平台运行的VC#.NET应用程序。该应用程序还使用WSE 2.0将证书导入制作SOAP请求。对象只包含密钥对

经研究,我发现,这个异常的类型System.Security.Cryptography.CryptographicException的。

我敢肯定的我所有的WSE设置是否正确配置,因为我可以按主题区分的名称来找到一个类似的证书。任何想法将不胜感激。

回答

12

我最近遇到了同样的问题。我发现one explanation here对我有用。具体来说就是私钥的权限。完整的信息复制如下。

有,我会 先看几件事情:

  1. 你有这个证书的私钥?
  2. 你为youf应用程序来访问私有 键获得许可?

可以建立你是否有通过Windows证书存储区查看证书 一个 私钥。 要实现此目的,请按照下列步骤操作:

  1. 从Windows开始菜单中选择运行。
  2. 在打开:字段中输入mmc。单击确定。
  3. 从文件菜单中选择“添加/删除管理单元”。
  4. 单击添加按钮。
  5. 从Available Standalone Snap-ins列表中选择“Certificates”。 点击添加按钮。
  6. 选择“计算机帐户”。点击下一步。
  7. 选择“本地计算机”。点击完成。
  8. 单击关闭。
  9. 单击确定。
  10. 展开控制台根目录下的证书节点并打开 个人存储。
  11. 双击您正在使用的证书。如果你有一个私人 键,显示画面也将在那说底部显示一个消息 “您有一个对应于这个 证书 私钥”。

如果你有一个私钥,然后确保 您的应用程序有权 访问密钥:

  1. 打开Windows资源管理器。
  2. 导航到C:\ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys 文件夹。
  3. 选择包含密钥的文件,WSE将需要 检索。
  4. 从文件菜单中选择属性。
  5. 在安全选项卡上,添加ASPNET帐户,然后选择完全控制选项 控制选项。
  6. 说明: 1.确定与证书关联的MachineKeys文件夹中的哪个密钥文件是 可能是 困难。一个简单的方法是注意 创建日期和时间 创建新证书。当您 查看MachineKeys 目录中的文件时,请检查Date Modified 字段中的相应日期和 时间。 2.如果您已将系统配置为在与ASPNET不同的 帐户下运行,请在授予访问 证书权限时使用该帐户 。
+1

谢谢。这有帮助。 (我有一个私钥,但我的应用程序无法访问它)。 – KKP 2010-12-22 00:25:40

+0

检查此答案关于如何找出哪个机器密钥对应于证书:http://serverfault.com/a/642279/401044 – jtate 2017-04-04 21:43:57

0

遇到相同的异常后:System.Security.Cryptography.CryptographicException,对象只包含密钥对的公共部分,我校对替代,但不太最佳解决方案。

情况:证书/密钥查找在Visual Studio IIS Express中运行良好,但是当Web应用程序在适当的IIS服务下运行时,我总是收到'仅包含公钥的一半'异常。

我使用WSE3 CertificateTool在文件系统上定位私钥部分,并试图根据上述答案调整用户权限设置以给予ASP用户权限。

我最终的修复不是很漂亮,是为我的Web服务代码创建一个新的IIS应用程序池,并设置用户标识池作为证书+私钥的本地机器所有者运行。

我安装证书的最终位置是“本地计算机/可信人员”。

使用WSE3 CustomPolicyAssertion,C#.NET:

clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine, 
    StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName); 

更新应用程序池标识后,没有私钥文件覆盖更改应用程序池所有者时是必要的。