Service Fabric:通过证书使用Azure KeyVault进行身份验证:“KeySet不存在”

时间:2017-10-26 22:42:19

标签: c# azure certificate azure-keyvault

这是我尝试启用的方案:

我希望通过客户端证书从我的网络服务应用程序(天蓝色服务架构)验证azure keyvault。

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

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

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

      

    CryptographicException:“KeySet不存在”

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

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

    我能错过什么?只有我能想到这个失败的原因是服务架构用户上下文(网络服务,我认为)没有权限查看私钥?它存储在“LocalMachine”证书商店下 个人“文件夹(也称为”我的“)。据我所知,应用程序应该能够从没有特殊权限的LocalMachine商店读取?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

好的,我的怀疑是正确的。我明确授予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中的源代码示例,您需要自己构建它)

答案 2 :(得分:0)

我遇到了同样的问题,并且授予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>