【问题标题】:Object contains only the public half of a key pair对象仅包含密钥对的公共部分
【发布时间】:2019-02-22 14:35:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: certificate client-certificates


    【解决方案1】:

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

    有几件事我会 先看:

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

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

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

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

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

    【讨论】:

    • 谢谢。这有帮助。 (我确实有一个私钥,但我的应用无权访问它)。
    • 查看此答案以了解如何找出与证书对应的机器密钥:serverfault.com/a/642279/401044
    • 我遇到过这种情况,但我在 Azure 中,我不知道如何在 Azure 上执行这些步骤:(
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      遇到同样的异常: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);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 2018-07-19
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        相关资源
        最近更新 更多