无法通过 Powershell 或 Visual Studio 连接到受保护的 Azure Service Fabric 集群

Cannot connect to secured Azure Service Fabric Cluster via Powershell or Visual Studio

我创建了一个 Service Fabric 应用程序,目前由两个 Reliable Services 和一个 Reliable Actor 组成。为了开发,我在 Azure 中创建了一个 SQL 服务器和数据库,并将连接字符串硬编码到我的应用程序中,我在本地 SF 集群上 运行ning。这工作正常,我能够在本地 运行 我的应用程序,同时在云中操作数据库。

我现在想将我的服务发布到云端,并且 运行 全部远程(以便我可以设置和测试 Web API 公开),这就是问题开始。

关注 Azure 文档:

  1. Create a Service Fabric cluster in Azure using Azure Resource Manager
  2. Connect to a secure cluster
  3. Configure secure connections to a Service Fabric cluster from Visual Studio
  4. Service Fabric cluster security scenarios
  5. Publish an application to a remote cluster by using Visual Studio
  6. Add or remove certificates for a Service Fabric cluster in Azure

我已采取以下步骤:

  1. 使用 Powershell(使用 ServiceFabricRPHelpers cmdlet)创建 KeyVault 资源组,并在其中创建 KeyVault.

  2. 使用 New-SelfSignedCertificate 并将 -DnsName 设置为 api.mydomain.co.uk,我已经购买并为 api 创建了一个指向 mycluster.northeurope.cloudapp.azure.com 的 CNAME 记录:19000(虽然在这个过程的这个阶段当然不存在),然后是 Export-PfxCertificate 创建 .pfx 文件。然后 .pfx 被导入到 cert:\CurrentUser\TrustedPeoplecert:\CurrentUser\My.

  3. 已调用 Invoke-AddCertToKeyVault 将新生成的证书添加到我的 KeyVault

  4. 使用 SetupApplications.ps1 脚本配置 AAD。

  5. 将所有生成的字符串等放入 azuredeploy.jsonazuredeploy.parameters.json,解决了错误(其中一些似乎与文档相矛盾......),并成功部署了集群。它现在在我的 Azure 门户上可见。

  6. 已从经典门户网站分配用户角色(我自己的管理员)。

  7. 使用 Invoke-AddCertToKeyVault(这次创建并)向集群添加第二个 "admin client" 证书(与第一个集群证书相对)。

因此,完成 所有 后,我相信我应该完成我需要做的一切,以便能够连接到集群以通过 VS2015 发布,并访问来自 api.mydomain.co.uk:19080 的管理界面。 las,这不会发生...

连接到资源组中的数据库我的集群仍然可以通过 SQL 服务器资源管理器使用 SQL 身份验证从 VS 工作,但是,任何 尝试使用基于 AAD 或 X509 的身份验证与服务器本身通信会导致在尝试连接时等待,然后失败。几个例子:

尝试连接到管理控制台时说它已被阻止,这对我来说意味着它就在那里,但所有文档在告诉我如何访问它之前就结束了。

尝试使用 Connect-ServiceFabricCluster 连接也失败了,搜索错误消息也没有给我任何指示。

在花了两天时间吸收所有这些内容并尝试让它发挥作用之后,我完全不知道要尝试和改变什么。任何人都可以在我所做的事情中找到问题,或者建议我可以尝试什么吗? 如果您需要我提供更多详细信息,请直接询问!

我在尝试部署安全集群时也遇到了噩梦,使用的大部分文档与您也曾尝试使用的文档相同。在花了好几天弄脏我的手之后,我终于让它开始工作了。

这是我自己的助手和模板:SecureCluster

要注意的关键事项是:

  • 确保您的客户端和群集证书都在您的密钥保管库中,并在 VM 规模集的 OSProfile 下的 ARM 模板中被引用(我注意到在您的示例中您正在添加客户端管理员修改ARM模板后的证书):

    
    "osProfile": {
            "adminUsername": "[parameters('adminUsername')]",
            "adminPassword": "[parameters('adminPassword')]",
            "computernamePrefix": "[parameters('vmNodeType0Name')]",
            "secrets": [
                            {
                                "sourceVault": {
                                    "id": "[parameters('sourceVault')]"
                                },
                                "vaultCertificates": [
                                    {
                                        "certificateStore": "My",
                                        "certificateUrl": "[parameters('clusterCertificateUrl')]"
                                    },
                                    {
                                        "certificateStore": "My",
                                        "certificateUrl": "[parameters('adminCertificateUrl')]"
                                    }
                                ]
                            }
                        ]
          },
    

这将确保您的所有证书都安装到集群中的每个节点上。

下一步是确保规模集中的 Service Fabric 扩展也有您的证书:

"extensions": [
              {
                "name": "[concat(parameters('vmNodeType0Name'),'_ServiceFabricNode')]",
                "properties": {
                  "type": "ServiceFabricNode",
                  "autoUpgradeMinorVersion": false,
                  "protectedSettings": {
                    "StorageAccountKey1":
                      "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
                    "StorageAccountKey2":
                      "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
                  },
                  "publisher": "Microsoft.Azure.ServiceFabric",
                  "settings": {
                    "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
                    "nodeTypeRef": "[parameters('vmNodeType0Name')]",
                    "dataPath": "D:\\SvcFab",
                    "durabilityLevel": "Bronze",
                    "certificate": {
                        "thumbprint": "[parameters('clusterCertificateThumbPrint')]",
                        "x509StoreName": "My"
                    }
                  },
                  "typeHandlerVersion": "1.0"
                }
              },

最后,在 ARM 模板的 Service Fabric 资源部分下,确保您指定了哪些证书用于节点到节点的安全,哪些证书用于客户端到节点的安全。

certificate": {
            "thumbprint": "[parameters('clusterCertificateThumbPrint')]",
            "x509StoreName": "My"
        },
        "clientCertificateCommonNames": [],
        "clientCertificateThumbprints": [{
                    "CertificateThumbprint": "[parameters('adminCertificateThumbPrint')]",
                    "IsAdmin": true
                }],

然后您应该能够按照您尝试的方式安全地连接到集群。虽然我发现的一件事是 URL 不应该在发布配置文件中以 "http" 为前缀,并且当您尝试浏览到资源管理器时,您需要 URL 是 https://[n]:19080/Explorer/index.html

希望本文对您有所帮助。