【问题标题】:How to get the secret certificate from C# in a Service Fabric application on Unix?如何在 Unix 上的 Service Fabric 应用程序中从 C# 获取机密证书?
【发布时间】:2019-06-24 02:36:37
【问题描述】:

我的 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 集群上,我一直使用指纹在本地机器中查找

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.

我确实明白它在告诉我什么;我不能使用本地机器。但是为了做到这一点,我将如何在 Unix 机器上找到 X509Certificate2 证书? (它是 .NET Core 还是 Service Fabric 的东西?)

【问题讨论】:

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


    【解决方案1】:

    来自docs

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

    和..

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

    我已经有一段时间没有做 SF Linux 了,所以我没有任何脚本或 sn-p 可以提供帮助,但文档应该是直截了当的。

    【讨论】:

    • 所以,澄清一下,var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);(来自the Windows-specific docs)应该是var store = new X509Store(); 还是var store = new X509Store(StoreLocation.LocalMachine);?在 Linux 上的 Azure Service Fabric 群集中使用 ARM 部署的证书似乎都不适合我。
    【解决方案2】:

    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 服务获取证书绝对不是一件容易的事。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2022-12-22
    • 1970-01-01
    • 2019-07-31
    • 2016-12-03
    • 2017-06-09
    • 2017-01-15
    • 2016-09-14
    相关资源
    最近更新 更多