【问题标题】:Service Fabric: Authenticating with Azure KeyVault via cert: "KeySet does not exist"Service Fabric:通过证书使用 Azure KeyVault 进行身份验证:“KeySet 不存在”
【发布时间】:2018-04-08 11:06:47
【问题描述】:

这是我尝试启用的场景:

我希望通过客户端证书从我的 Web 服务应用程序(azure 服务结构)向 azure keyvault 进行身份验证。

这些是我正在遵循的步骤:

  1. 在 Azure 中向我的密钥库添加证书(自签名)
  2. 通过 azure powershell (pfx) 下载证书
  3. 创建 Azure 应用实例以识别我的应用
  4. 将证书与应用关联
  5. 为 azure 应用创建服务主体
  6. 授予对 keyvault 的主体访问权限

一切看起来都不错。当我启动我的服务(本地服务结构集群)并尝试连接到 keyvault 以检索我存储在其中的密钥 + 值时,我收到错误:

CryptographicException: "KeySet 不存在"

当我尝试在运行时检查 X509Certificate2 对象的 PrivateKey 属性值时,它会引发相同的异常。

找到证书,并且存在私钥(我通过 MMC 以及一些命令行工具验证了这一点)。

我会错过什么?我能想到的唯一原因是服务结构用户上下文(我认为是网络服务)没有查看私钥的权限?它存储在“LocalMachine”证书存储中,位于 Personal”文件夹(也称为“My”)。据我所知,应用程序应该能够在没有特殊权限的情况下从 LocalMachine 存储中读取?

【问题讨论】:

  • 不关注这一点——您使用的是 Azure Service Fabric 还是本地 Service Fabric?

标签: c# azure certificate azure-keyvault


【解决方案1】:

另一种更简单的方法来授予NETWORK SERVICE 用户对证书私钥的权限(比我的其他答案更容易):

  1. 在 MMC 中打开证书管理单元:WIN + R -> 键入 mmc -> 文件 -> 添加/删除管理单元 -> 添加证书(计算机帐户)。
  2. 找到您的证书 -> 右键单击​​并选择所有任务/管理私钥
  3. NETWORK SERVICE 用户授予Read 权限

【讨论】:

    【解决方案2】:

    好吧,我的猜测是正确的。我明确授予Network Service 用户(本地服务结构集群运行的用户上下文)访问私钥文件的权限。现在我可以使用 keyvault 进行身份验证了。

    cacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\{private-key-filename}" /e /g "Network Service":R
    

    我通过工具程序“FindPrivateKey.exe”找到了私钥位置

    findprivatekey.exe My LocalMachine -t "{thumbprint}" -a
    

    工具可从https://www.microsoft.com/en-us/download/confirmation.aspx?id=21459获取

    (这是一个源代码示例,位于目录\WCF\Setup\FindPrivateKey\CS\FindPrivateKey.sln,需要您自己构建)

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,授予Network Service 的读取权限对我有用。还有另一种方式来运行这里描述的本地系统用户运行高权限服务:

      https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-run-script-at-service-startup

      您可以将 Service Fabric ApplicationManifest.xml 修改为

      1. 定义与本地机器对应的服务主体
      2. 使用该服务主体运行创建的服务结构包

      最终的 ApplicationManifest.xml 看起来像:

      <?xml version="1.0" encoding="utf-8"?>
      <ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        ...
        <ServiceManifestImport>
          ...
          <Policies>
            <RunAsPolicy CodePackageRef="Code" UserRef="LocalSystemUser" /> <!-- 2. run service fabric as defined principal -->
          </Policies>
        </ServiceManifestImport>
      
        <Principals>
          <Users>
            <User Name="LocalSystemUser" AccountType="LocalSystem" /> <!-- 1. define principal -->
          </Users>
        </Principals>
      </ApplicationManifest>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 2012-06-13
        • 2019-07-17
        • 2021-10-25
        • 1970-01-01
        相关资源
        最近更新 更多