安装客户端证书后,我收到异常“对象仅包含密钥对的公共部分。还必须提供私钥”。我的应用程序是一个在 ASP.NET 平台上运行的 VC#.NET 应用程序。该应用程序还使用 WSE 2.0 将证书导入到发出 SOAP 请求中。
经过研究,我发现此异常属于 System.Security.Cryptography.CryptographicException 类型。
我非常肯定我的所有 WSE 设置都配置正确,因为我能够通过主题可分辨名称找到类似的证书。任何想法将不胜感激。
安装客户端证书后,我收到异常“对象仅包含密钥对的公共部分。还必须提供私钥”。我的应用程序是一个在 ASP.NET 平台上运行的 VC#.NET 应用程序。该应用程序还使用 WSE 2.0 将证书导入到发出 SOAP 请求中。
经过研究,我发现此异常属于 System.Security.Cryptography.CryptographicException 类型。
我非常肯定我的所有 WSE 设置都配置正确,因为我能够通过主题可分辨名称找到类似的证书。任何想法将不胜感激。
我最近遇到了同样的问题。我在这里找到了一种对我有用的解释。具体来说,私钥的权限。完整信息复制如下。
我首先要看几件事:
- 你有这个证书的私钥吗?
- 您是否允许您的应用程序访问私钥?
您可以通过 Windows 证书存储区查看证书来确定您是否拥有私钥。为此,请按照下列步骤操作:
- 从 Windows 开始菜单中,选择运行。
- 在 Open: 字段中键入 mmc。点击确定
- 从“文件”菜单中选择“添加/删除管理单元”。
- 单击添加按钮。
- 从可用的独立管理单元列表中选择“证书”。单击添加按钮。
- 选择“计算机帐户”。点击下一步。
- 选择“本地计算机”。单击完成。
- 单击关闭。
- 单击确定。
- 展开 Console Root 下的 Certificates 节点并打开 Personal 存储。
- 双击您正在使用的证书。如果您有私钥,对话框将在底部显示一条消息,显示“您有与此证书对应的私钥”。
如果您有私钥,请确保您的应用程序有权访问该密钥:
- 打开 Windows 资源管理器。
- 导航到 C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys 文件夹。
- 选择包含 WSE 需要检索的密钥的文件。
- 从文件菜单中,选择属性。
- 在安全选项卡上,添加 ASPNET 帐户并选择完全控制选项。
- 注意: 1. 确定 MachineKeys 文件夹中的哪个密钥文件与证书相关联可能很困难。一种简单的方法是在创建新证书时记下创建日期和时间。查看 MachineKeys 目录中的文件时,请检查 Date Modified 字段以获取相应的日期和时间。2. 如果您已将系统配置为在与 ASPNET 不同的帐户下运行,请在授予访问证书的权限时使用该帐户。
As per my experience it could be failing because of two reasons.
在遇到相同的异常: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.