如何在Unix上的Service Fabric应用程序中从C#获取秘密证书?

时间:2019-01-30 18:09:00

标签: asp.net-core azure-service-fabric

我的applicationmanifest.xml中包含以下内容:

  <Principals>
    <Users>
      <User Name="IdentityService" AccountType="NetworkService" />
      <User Name="ExplorerService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="IdentityCert" PrincipalRef="IdentityService" ResourceType="Certificate" />
      <SecurityAccessPolicy ResourceRef="IdentityCert" PrincipalRef="ExplorerService" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[IDENTITY_SERVICE_THUMBPRINT]" Name="IdentityCert" />
  </Certificates>

在Windows群集上,我一直在使用指纹在localmachine中查找

X509Certificate2 cert = X509.LocalMachine.My.Thumbprint.Find(options.Thumbprint, validOnly: false).FirstOrDefault();

没有问题。

当部署到Unix集群时,我遇到以下异常:

 Unix LocalMachine X509Store is limited to the Root and CertificateAuthority stores. Unix LocalMachine X509Store is limited to the Root and CertificateAuthority stores.

我确实了解它在告诉我什么;我不能使用LocalMachine。但是,为了正确处理,如何在Unix机器上找到X509Certificate2证书? (是.NET Core还是Service Fabric?)

2 个答案:

答案 0 :(得分:1)

来自docs

  

Service Fabric通常希望X.509证书存在于Linux群集节点上的 / var / lib / sfcerts 目录中。群集证书,客户端证书等适用。在某些情况下,可以为证书指定var / lib / sfcerts文件夹以外的位置。

和..

  在应用程序清单中指定的

证书,例如通过SecretsCertificate或EndpointCertificate元素,必须在 / var / lib / sfcerts 中出现 strong>目录。在应用程序清单中用于指定证书的元素没有路径属性,因此证书必须存在于默认目录中。这些元素确实具有可选的 X509StoreName 属性。 默认值为“我”,它指向Linux节点上的/ var / lib / sfcerts目录 。 Linux群集上未定义任何其他值。对于在Linux群集上运行的应用程序,我们建议您省略X509StoreName属性。

我已经有一段时间没有做SF Linux了,所以我没有任何脚本或代码片段可以帮助您,但是文档应该简单易懂。

答案 1 :(得分:0)

docs on Service Fabric Linux certificates是错误的-至少对于.NET Core服务,StoreLocation.LocalMachine + StoreName.My无法访问位于/var/lib/sfcerts的证书文件。这些文档对于Service Fabric基础结构使用的证书可能是正确的,但是对于需要访问证书的SF服务而言,它们具有误导性,并且是完全错误的。

.NET Core document which acts as a public spec for X509Store support on Linux明确声明new X509Store(StoreName.My, StoreLocation.LocalMachine)会产生CryptographicException,这与原始帖子和我的经验是一致的。

因此,您必须提出一种替代方法来获取证书。在我看来,以下两种方法可行:

  1. 将证书文件复制到SF服务帐户可以在启动时提取它们的位置,然后直接读取它们,或将它们写入new X509Store(StoreName.My, StoreLocation.CurrentUser)以备后用。您可以使用AccountType="LocalSystem"以用户身份运行的use a SetupEntryPoint在Linux上以root用户身份运行SetupEntryPoint。需要root用户才能从/var/lib/sfcerts中读取文件。

  2. 从另一个来源(例如KeyVault)获取证书。为了确保这一点,您可能需要use the new Service Fabric support for Managed Service Identity

最重要的是:从Linux上的Service Fabric服务中获取证书绝对不是一件容易的事。