5

安装客户端证书后,我收到异常“对象仅包含密钥对的公共部分。还必须提供私钥”。我的应用程序是一个在 ASP.NET 平台上运行的 VC#.NET 应用程序。该应用程序还使用 WSE 2.0 将证书导入到发出 SOAP 请求中。

经过研究,我发现此异常属于 System.Security.Cryptography.CryptographicException 类型。

我非常肯定我的所有 WSE 设置都配置正确,因为我能够通过主题可分辨名称找到类似的证书。任何想法将不胜感激。

4

3 回答 3

15

我最近遇到了同样的问题。我在这里找到了一种对我有用的解释。具体来说,私钥的权限。完整信息复制如下。

我首先要看几件事:

  1. 你有这个证书的私钥吗?
  2. 您是否允许您的应用程序访问私钥?

您可以通过 Windows 证书存储区查看证书来确定您是否拥有私钥。为此,请按照下列步骤操作:

  1. 从 Windows 开始菜单中,选择运行。
  2. 在 Open: 字段中键入 mmc。点击确定
  3. 从“文件”菜单中选择“添加/删除管理单元”。
  4. 单击添加按钮。
  5. 从可用的独立管理单元列表中选择“证书”。单击添加按钮。
  6. 选择“计算机帐户”。点击下一步。
  7. 选择“本地计算机”。单击完成。
  8. 单击关闭。
  9. 单击确定。
    1. 展开 Console Root 下的 Certificates 节点并打开 Personal 存储。
    2. 双击您正在使用的证书。如果您有私钥,对话框将在底部显示一条消息,显示“您有与此证书对应的私钥”。

如果您有私钥,请确保您的应用程序有权访问该密钥:

  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 不同的帐户下运行,请在授予访问证书的权限时使用该帐户。
于 2010-08-09T14:39:31.470 回答
1

As per my experience it could be failing because of two reasons.

  1. Check if your cert has private key available.
  2. If that is .net application then check if you have given permission to cert to make sure your application has permission to access the cert. In my case adding the "iis_iusrs" and given read permission does work for me. Thanks.
于 2019-02-22T06:35:59.683 回答
0

在遇到相同的异常:System.Security.Cryptography.CryptographicException,Object 只包含密钥对的公共部分后,我证明了一个替代方案,但不是最优的解决方案。

情况:证书/密钥查找在 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);

After updating the App Pool Identity, no private key file overrides were necessary when changing the application pool owner.

于 2014-10-15T13:22:52.213 回答