安装客户端证书后,我收到异常“对象仅包含密钥对的公共一半。还必须提供私钥”。我的应用程序是在ASP.NET平台上运行的VC#.NET应用程序。该应用程序还使用WSE 2.0将证书导入到发出SOAP请求中。
经过研究,我发现此异常的类型为System.Security.Cryptography.CryptographicException。
我非常肯定我所有的WSE设置都配置正确,因为我能够通过subject-distinguished-name找到类似的证书。任何想法将不胜感激。
答案 0 :(得分:13)
我最近遇到了同样的问题。我发现one explanation here对我有用。具体来说,私钥的权限。完整信息将在下面复制。
我会做几件事 先看看:
- 您是否拥有此证书的私钥?
- 您是否已获得使用该应用程序访问私有的权限 键?
醇>你可以确定你是否有 通过查看证书的私钥 通过Windows证书存储区。 要实现此目的,请执行以下步骤:
- 从Windows“开始”菜单中,选择“运行”。
- 在“打开:”字段中键入mmc。单击“确定”
- 从“文件”菜单中选择“添加/删除管理单元”。
- 单击“添加”按钮。
- 从Available Standalone Snap-ins列表中选择“Certificates”。 单击“添加”按钮。
- 选择“计算机帐户”。单击“下一步”。
- 选择“本地计算机”。单击“完成”。
- 点击关闭。
- 单击“确定”。
醇>
- 展开“控制台根”下的“证书”节点,然后打开 个人商店。
- 双击您正在使用的证书。如果你有私人 键,对话框将显示一条消息 在底部写着“你有一个 与此对应的私钥 证书”。
如果您有私钥,请确保 您的应用程序有权限 访问密钥:
- 打开Windows资源管理器。
- 导航到C:\ Documents and Settings \ All Users \ Application 数据\微软\加密\ RSA \ MachineKeys的 文件夹中。
- 选择包含WSE所需密钥的文件 检索。
- 从“文件”菜单中,选择“属性”。
- 在“安全”选项卡上,添加ASPNET帐户并选择“完全” 控制选项。
- 注意: 1.确定MachineKeys文件夹中的哪个密钥文件 与证书相关联即可 难。一个简单的方法是注意 创建日期和时间 创建新证书。当你 查看MachineKeys中的文件 目录,检查修改日期 相应日期和的字段 时间。 2.如果您已将系统配置为在不同的系统下运行 帐户比ASPNET,使用该帐户 授予访问权限时 证书。
醇>
答案 1 :(得分:0)
遇到相同的异常后:System.Security.Cryptography.CryptographicException,Object只包含密钥对的公共一半,我证明了另一种方法,但不是最优解决方案。
情况:证书/密钥查找在Visual Studio IIS Express内部运行良好,但是当Web应用程序在正确的IIS服务下运行时,我总是收到“只包含密钥对的公共一半”#39;异常。
我使用WSE3 CertificateTool查找文件系统上的私钥部分,并尝试调整用户权限设置,以便根据上述答案为ASP用户授予权限。
我最终的解决方法是创建一个特定于我的Web服务代码的新IIS应用程序池,并将池运行的用户标识设置为证书+私钥的本地计算机所有者。
我安装证书的最终位置是"本地计算机/受信任的人"。
使用WSE3 CustomPolicyAssertion,C#.NET:
clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine,
StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName);
更新应用程序池标识后,更改应用程序池所有者时无需更改私钥文件。
答案 2 :(得分:0)
根据我的经验,它可能会由于两个原因而失败。