对象仅包含密钥对的公共一半

问题描述 投票:5回答:3

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

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

我非常肯定我所有的WSE设置都配置正确,因为我能够通过subject-distinguished-name找到类似的证书。任何想法将不胜感激。

certificate client-certificates
3个回答
13
投票

我最近遇到了同样的问题。我找到了适合我的one explanation here。具体来说,私钥的权限。完整信息复制如下。

我首先要看几件事:

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

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

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

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

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

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);

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


0
投票

根据我的经验,由于两个原因,它可能会失败。

  1. 检查您的证书是否有私钥。
  2. 如果是.net应用程序,则检查您是否已授予证书权限以确保您的应用程序有权访问证书。在我的情况下,添加“iis_iusrs”并给予读取权限对我有用。谢谢。
© www.soinside.com 2019 - 2024. All rights reserved.