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

Posted

技术标签:

【中文标题】无法通过 Powershell 或 Visual Studio 连接到受保护的 Azure Service Fabric 群集【英文标题】:Cannot connect to secured Azure Service Fabric Cluster via Powershell or Visual Studio 【发布时间】:2017-01-05 20:39:09 【问题描述】:

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

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

遵循 Azure 文档:

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

我已采取以下步骤:

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

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

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

    使用SetupApplications.ps1 脚本配置AAD。

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

    从经典门户分配的用户角色(管理员给我自己)。

    使用Invoke-AddCertToKeyVault(这次创建并)向集群添加第二个“管理员客户端”证书(而不是第一个是集群证书)。

所以,所有都完成了,我相信我应该已经完成​​了我需要做的所有事情,以便能够连接到集群以通过 VS2015 发布,并从 @ 访问管理界面987654351@。唉,这不会发生......

连接到资源组中的数据库 我的集群仍然可以通过 SQL Server Explorer 使用 SQL 身份验证从 VS 工作,但是,any 尝试使用基于 AAD 或 X509 的身份验证结果与服务器本身进行通信等待它尝试连接,然后失败。几个例子:

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

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

在花了两天时间吸收所有这些并试图让它发挥作用之后,我对尝试和改变什么一无所知。任何人都可以在我所做的事情中发现问题,或者提出我可以尝试的任何建议吗? 如果您需要我提供更多详细信息,请尽管询问!

【问题讨论】:

【参考方案1】:

我也做了一场噩梦,试图部署一个安全的集群,使用的大部分文档与您尝试使用的文档相同。在花了几天时间弄脏我的手之后,我终于设法让它工作了。

这是我自己的助手和模板: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

希望你能从中得到一些帮助。

【讨论】:

感谢您的提示!我最终对此感到非常沮丧,以至于我决定采用整个 SF 方法,只是编写了一个 Python 后端并将其托管在我自己的服务器上。我没有得到 Azure 的所有幻想,但是当设置如此混乱时,对于我现在正在做的事情来说,它是不值得的。我会接受你的回答,因为我认为我没有尝试过你建议的任何事情,也许将来我会按照你的指导再做一次,看看是否可行。 这对我帮助很大!我做的两件不同的事情是: 1. 不在 osProfile 的 vaultCertificates 部分中包含集群证书 2. 我在 clientCertificateCommonNames 中指定了集群证书,并将 clientCertificateThumbprints 设置为空白。我都修好了,所以我不确定哪一个是罪魁祸首。奇怪的部分是在修复上述问题之前,我能够使用群集证书连接到 Service Fabric Explorer,但我无法连接以进行部署

以上是关于无法通过 Powershell 或 Visual Studio 连接到受保护的 Azure Service Fabric 群集的主要内容,如果未能解决你的问题,请参考以下文章

虚拟环境是否可以在Visual Studio中正常运行但不能通过Powershell运行?

在 Visual Studio 2019 的 PowerShell 窗口中找不到 ILDASM

从Visual Studio Code PowerShell运行Anaconda命令

powershell PowerShell脚本删除Visual Studio,ReSharper等生成的文件...

powershell 各种CMD Batch,Powershell和Visual Basic脚本文件

powershell Visual Studio Boxstarter