对象仅包含密钥对的公共部分
-
19-09-2019 - |
题
安装客户端证书后,我收到异常“对象仅包含密钥对的公共部分。还必须提供私钥”。我的应用程序是在 ASP.NET 平台上运行的 VC#.NET 应用程序。该应用程序还使用 WSE 2.0 导入证书以发出 SOAP 请求。
经过研究,我发现此异常属于 System.Security.Cryptography.CryptographyException 类型。
我非常肯定我的所有 WSE 设置都配置正确,因为我能够通过主题可分辨名称找到类似的证书。任何想法将不胜感激。
解决方案
我最近遇到了同样的问题。我发现 这里有一个解释 这对我有用。具体来说,是私钥的权限。完整信息复制如下。
我首先要看几件事:
- 您有该证书的私钥吗?
- 您是否授予了 youf 应用程序访问私有的权限 钥匙?
您可以确定您是否拥有 通过查看证书的私钥 通过 Windows 证书存储。为此,请按照下列步骤操作:
- 从 Windows 开始菜单中,选择运行。
- 在打开的窗口中输入 mmc:场地。单击“确定”
- 从“文件”菜单中选择“添加/删除管理单元”。
- 单击添加按钮。
- 从可用独立管理单元列表中选择“证书”。单击添加按钮。
- 选择“计算机帐户”。点击下一步。
- 选择“本地计算机”。单击“完成”。
- 单击“关闭”。
- 单击“确定”。
- 展开 Console Root 下的 Certificates 节点,然后打开 个人商店。
- 双击您正在使用的证书。如果您有私人 键,对话框将显示一条消息 在底部写着“你有一个 与此相对应的私钥 证书”。
如果您有私钥,请确保 您的应用程序具有权限 要访问密钥,请执行以下操作:
- 打开 Windows 资源管理器。
- 导航到 C:\Documents and Settings\All Users\Application 数据\Microsoft\加密 SA\MachineKeys 文件夹。
- 选择包含WSE需要检索的密钥的文件。
- 从文件菜单中选择属性。
- 在“安全”选项卡上,添加 ASPNET 帐户,然后选择“完整” 控制选项。
- 笔记:1.确定 MachineKeys 文件夹中的密钥文件是 与证书关联的证书可以是 难。一个简单的方法是注意 创建日期和时间 创建新证书。当你 查看 MachineKeys 中的文件 目录中,检查修改日期 字段的相应日期和 时间。2.如果您已将系统配置为在不同的 帐户而不是 ASPNET,请使用该帐户 授予访问权限时 证书。
其他提示
遇到相同的异常后:System.Security.Cryptography.CryptographicException,对象仅包含一个密钥对的公共部分中,我醒发的替代,但小于最优解
情况:证书/密钥的查找工作里面很大的Visual Studio IIS表达的,但在Web应用程序是正确的IIS服务下运行,我总是收到“包含密钥对的只公开部分”例外
我用WSE3 CertificateTool定位在文件系统中的私有密钥部分并试图在长度来调整用户权限设置,得到ASP用户权限按照上面的回答。
我最终的修复,这是不是漂亮,是创建特定的一个新的IIS应用程序池到我的Web服务代码,并设置用户身份池运行作为证书+私钥的本地机器的所有者。
我在安装证书的最终位置是“本地计算机/信任的人。”
使用WSE3 CustomPolicyAssertion,C#的.NET:
clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine,
StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName);
更新应用程序池的身份,改变了应用程序池所有者时,没有私钥文件覆盖是必要的了。
根据我的经验,失败可能有两个原因。
- 检查您的证书是否有可用的私钥。
- 如果这是 .net 应用程序,请检查您是否已授予证书权限,以确保您的应用程序有权访问该证书。就我而言,添加“iis_iusrs”并授予读取权限对我来说确实有效。谢谢。