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

时间:2009-12-13 02:18:57

标签: certificate client-certificates

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

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

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

3 个答案:

答案 0 :(得分:13)

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

  

我会做几件事   先看看:

     
      
  1. 您是否拥有此证书的私钥?
  2.   
  3. 您是否已获得使用该应用程序访问私有的权限   键?
  4.         

    你可以确定你是否有   通过查看证书的私钥   通过Windows证书存储区。   要实现此目的,请执行以下步骤:

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

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

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

答案 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)

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

  1. 检查您的证书是否具有可用的私钥。
  2. 如果这是.net应用程序,请检查您是否已授予证书权限,以确保您的应用程序有权访问证书。以我为例,添加“ iis_iusrs”并获得读取权限确实对我有用。 谢谢。