代码之家  ›  专栏  ›  技术社区  ›  Poul K. Sørensen

如何从Unix应用程序中获取机密证书?

  •  0
  • Poul K. Sørensen  · 技术社区  · 6 年前

    在我的应用程序管理中有以下内容。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.
    

    我确实明白它告诉我什么;我不能用本地机器。但为了让这一切正确,我该如何定位 X509Certificate2 Unix机器上的证书?(它是.NET核心还是服务结构?)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Diego Mendes    6 年前

    docs :

    Service Fabric通常希望X.509证书出现在 /var/lib/sfcerts Linux群集节点上的目录。集群证书、客户端证书等也是如此。在某些情况下,可以为证书指定var/lib/sfcerts文件夹以外的位置。

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

    我已经有一段时间没有使用SF Linux了,所以我没有任何脚本或代码片段可以帮助我,但是文档应该是直接的。

        2
  •  0
  •   crimbo    5 年前

    这个 docs on Service Fabric Linux certificates 这是错误的——至少在一段时间内是错误的。NET核心服务, 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) 供以后使用。你可以 use a SetupEntryPoint 以用户身份运行的 AccountType="LocalSystem" 运行 设置入口点 作为Linux上的root用户。从中读取文件需要root /var/lib/sfcerts .

    2. 从另一个来源获得证书,如KeyVault。为了确保这一点,你可能会想 use the new Service Fabric support for Managed Service Identity .

    一句话:在Linux上从服务结构服务获取证书绝对不是件小事。