【问题标题】:Cannot get permissions to private key in WCF service无法在 WCF 服务中获取对私钥的权限
【发布时间】:2011-06-19 16:29:19
【问题描述】:

当我使用 HTTP 在 Win7 上运行 WCF 服务时,我收到错误消息“证书 'CN=tempcert' 必须具有能够进行密钥交换的私钥。该进程必须具有私钥的访问权限”。我将应用程序池更改为使用“NetworkService”。我使用本地机器安装了服务器证书。证书显示在本地计算机/个人/证书下的证书 MMC 中。我双击证书,它表明它有一个私钥。然后我运行 FindPrivateKey 实用程序,它指出它在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹中找到了私钥。我进入了 MMC 中的 Certificates Addin 并授予了 NETWORK SERVICE 帐户的全部权限。然后我转到 Windows Explorer 中的文件夹并确认 NETWORK SERVICE 对该文件夹和特定密钥文件具有完全权限。但是,每次我运行 WCF 服务时,它都会出错,找不到私钥。我不知道我还能做什么。

【问题讨论】:

    标签: wcf certificate


    【解决方案1】:

    创建证书时需要指定-sky exchange

    makecert -sk SignedByCA -iv TempCA.pvk -n "CN=localhost" -ic 
        TempCA.cer SignedByCA.cer -sr LocalMachine -ss My -sky exchange -pe
    

    【讨论】:

      【解决方案2】:

      我也为此苦苦挣扎。没有快速解决办法。 “-sky exchange”可能是导致此错误的原因,但我在构建自签名证书时设置了“-sky exchange”,但仍然收到此错误。还有其他问题可能导致此问题,包括私钥访问权限和证书位置。

      这适用于/当您将 WCF 主机作为 Windows 服务运行时:

      私钥的访问权限 就我而言,如果我手动启动 WCF 服务,它会继承我的(管理员组)用户帐户的权限,并且 WCF 服务可以毫无问题地找到证书。但是当我使用 Windows 服务启动 WCF 主机时,它继承了服务的权限,我收到了同样的错误。

      在我的情况下,在服务管理器窗口中,运行我的服务的帐户显示为“本地系统”,这实际上意味着“NT AUthority/System”。因此,我需要将该帐户对私钥容器的访问权限授予该帐户。令人惊讶的是,“每个人”都不够好。您可以使用 MMC 或使用 FindPrivatekey.exe 为密钥容器分配权限,并使用文件资源管理器手动设置权限,就像您设置文件夹的访问权限一样。

      商店位置 - 另一个因素 此外,就我而言,我运行的帐户无权访问“LocalMachine”或“CurrentUser”存储,因此查找我的证书没有用。该服务仅在我使用 MMC 将证书导入(或复制)到“服务(服务名称)”时才开始工作。

      您可以这样做:打开 MMC,然后从列表中选择“证书”。您将看到三个选项:我的用户帐户 (CurrentUser)、服务帐户(您选择哪个服务)和计算机帐户 (LocalMachine)。只需选择服务帐户并选择运行 WCF 主机的服务。

      我在这里的回答并不是一个完整的“如何做”,只是对那些在这个问题上苦苦挣扎的人有用的提示。我为我的文档写的“如何做”长达 10 页。

      【讨论】:

      • 还要注意 CSP (Legacy CryptoAPI) 和 KSP (CNG, CryptoNextGen) 之间的区别。一些较旧的应用无法与 KSP/CNG 配合使用。
      【解决方案3】:

      mmc > 文件 > 添加/删除管理单元 > 证书 > 添加 > 计算机帐户 > 下一步 > 完成 > 确定

      然后,找到证书 > 右键单击​​ > 所有任务 > 管理私钥

      添加正在使用证书的用户或服务并授予它完全控制权。

      一切就绪 :) 重新启动服务,它应该可以工作了

      【讨论】:

        【解决方案4】:

        我也遇到了这个异常。检查内部异常显示:System.Security.Cryptography.CryptographicException: Invalid provider type specified. 事实证明,我在 Windows Server 2008 上的 .NET 3.5 中使用了 CNG 证书,本文 (https://msdn.microsoft.com/en-us/library/aa738624(v=vs.100).aspx) 将其强调为不受支持。

        要查看您使用的证书类型,您可以运行命令 Certutil -store my 并查找 Provider 字段。

        • 如果显示 Microsoft Enhanced Cryptographic Provider v1.0 - 那么它就是 CSP 证书。
        • 上面写着 Microsoft Software Key Storage Provider - 然后是 CNG (KSP) 证书。

        无论如何,我希望这些信息对有同样问题的人有用。

        【讨论】:

        • 哦,我的解决办法是推出一个使用 CSP 的新证书。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-17
        • 2015-06-18
        • 1970-01-01
        • 2014-01-26
        相关资源
        最近更新 更多