在所有服务结构集群节点上导入客户端证书(带链)以进行最终用户通信

时间:2017-09-22 06:27:05

标签: azure-service-fabric client-certificates x509certificate2

我需要导入我的合作伙伴'我所有服务结构集群节点上的X509客户端证书(以及完整链),以便我可以验证每个传入请求并根据客户端证书对每个伙伴进行身份验证。这意味着当我导入客户端证书时,我希望将相关的中间证书(签署了客户端证书)和相关的根证书(签署中间证书)自动安装到适当的证书库中,例如“中级证书颁发机构”和#39;和'受信任的根证书颁发机构'在本地机器商店。

我希望整个链存储在证书存储中的适当位置的原因是因为我打算使用服务身份验证管道组件中的System.Security.Cryptography.X509Certificates命名空间中的X509Chain验证传入的客户端证书。 X509Chain似乎依赖于“受信任的根证书颁发机构”'存储以完成根证书验证。

有很多关于如何保护节点到节点以及b)管理客户端到群集通信的信息,例如:https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-security。但是,没有太多关于保护服务(托管在服务结构集群中)与使用客户端证书的最终用户消费者之间的通信的信息。如果我错过了这些信息,请告诉我。

我没有很多合作伙伴客户端证书可供配置。合作伙伴的数量在可管理的范围内。每次有新的合作伙伴客户端证书要添加时,我都无法重新创建群集。

  1. 我需要做杠杆吗? / ServiceManifest / CodePackage / SetupEntryPoint元素 SerivceManifest.xml文件并编写导入伙伴的自定义代码 证书(存储在密钥库中或其他位置)?有什么优点 和这种方法的缺点?
  2. 或者是否还有其他简单方法可以导入满足我所有要求的合作伙伴证书?如果 所以,请详细说明如何实现这一目标。
  3. 更新 我尝试了在osProfile部分下面的上述link中所述的添加客户端证书的建议方法。这看起来非常简单。

    为了能够做到这一点,我首先需要将相关证书(作为机密)推送到相关的密钥保险库,如此link所述。在本文中,它描述了(在#34;格式化Azure资源提供程序使用的证书")中如何将证书信息格式化为Json格式,然后将其作为密钥保存在密钥库中。这个json有以下格式用于上传pfx文件字节:

    {
        "dataType":  "pfx",
        "data":  "base64-encoded-cert-bytes-go-here",
        "password":  "pfx-password"
    }
    

    然而,由于我正在处理客户端证书的公共部分,我不是处理pfx文件,而是处理windows中的base64 cer文件(显然与其他地方的pem文件相同)。公共部分证书没有密码。所以我将Json格式改为以下:

    {
        "dataType":  "pem",
        "data":  "base64-encoded-cert-bytes-go-here"
    }
    

    当我使用相关的ARM模板调用New-AzureRmResourceGroupDeployment并在osProfile部分下进行适当的更改时,我收到以下错误:

    New-AzureRmResourceGroupDeployment : 11:08:11 PM - Resource Microsoft.Compute/virtualMachineScaleSets 'nt1vm' failed with message '{
      "status": "Failed",
      "error": {
        "code": "ResourceDeploymentFailure",
        "message": "The resource operation completed with terminal provisioning state 'Failed'.",
        "details": [
          {
            "code": "CertificateImproperlyFormatted",
            "message": "The secret's JSON representation retrieved from 
    https://xxxx.vault.azure.net/secrets/ClientCert/ba6855f9866644ccb4c436bb2b7675d3 has data type pem which is not 
    an accepted certificate type."
          }
        ]
      }
    }'
    

    我也尝试过使用' cer'数据类型如下所示:

    {
        "dataType":  "cer",
        "data":  "base64-encoded-cert-bytes-go-here"
    }
    

    它也导致了同样的错误。

    我做错了什么?

1 个答案:

答案 0 :(得分:0)

我考虑按照here所述在所有节点上导入证书。 (步骤5)您可以使用引用Azure Key Vault的ARM模板在指定的存储中添加多个证书。使用持久性级别Silver / Gold,以在重新部署期间保持群集运行。

小心可信商店中的adding证书。 如果证书是由受信任的CA创建的,则无需直接放置 受信任的根权限存储中的任何内容(因为它们已存在)。

使用X509Certificate2。Verify验证客户端证书,除非每个客户端都有自己的服务实例与之通信。