【问题标题】:Unable to authenticate FabricClient to a secured Service Fabric Cluster无法向安全的 Service Fabric 群集验证 FabricClient
【发布时间】:2019-10-02 23:53:38
【问题描述】:

我有一个安全的 Service Fabric 集群。相同的证书被用作服务器证书和客户端身份验证。我无法在控制台应用程序中创建FabricClient 以允许我连接到此集群。我正在使用“使用客户端证书连接到安全集群”下记录的代码 sn-p here

static void Main(string[] args)
{
    string thumb = "‎1234567890123456789012345678901234567890";
    string CommonName = "somefabric.cloudapp.azure.com";
    string connection = "somefabric.cloudapp.azure.com:19000";

    try
    {
        X509Credentials xc = GetCredentials(thumb, thumb, CommonName);
        FabricClient fc = new FabricClient(xc, connection);
        Console.WriteLine("Cluster is connected");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
    Console.ReadKey();
}


static X509Credentials GetCredentials(string clientCertThumb, string serverCertThumb, string name)
{
    X509Credentials xc = new X509Credentials();

    // Client certificate
    xc.StoreLocation = StoreLocation.CurrentUser;
    xc.StoreName = "MY";
    xc.FindType = X509FindType.FindByThumbprint;
    xc.FindValue = clientCertThumb;

    // Server certificate
    xc.RemoteCertThumbprints.Add(serverCertThumb);
    xc.RemoteCommonNames.Add(name);

    xc.ProtectionLevel = ProtectionLevel.EncryptAndSign;
    return xc;
}

这段代码导致

指定的 X509 指纹无效。

证书似乎确实通过其他方式授予我访问权限。我能够成功查看 Fabric Explorer 和 以下 PowerShell 命令也成功连接到集群

Connect-ServiceFabricCluster 
    -ConnectionEndpoint somefabric.cloudapp.azure.com:19000 
    -X509Credential 
    -FindType FindByThumbprint 
    -FindValue 1234567890123456789012345678901234567890 
    -StoreLocation CurrentUser 
    -StoreName MY 
    -ServerCertThumbprint 1234567890123456789012345678901234567890

我在这里做错了什么?

【问题讨论】:

    标签: azure authentication azure-service-fabric


    【解决方案1】:

    我遇到了这个确切的问题,但原因完全不同。

    我对此感到困惑;

    • https Explorer 工作(在 IExporer 中)
    • Powershell Connect-ServiceFabricCluster 也可以工作。
    • Visual Studio 发布失败

    我发现我的指纹值附加了 4 个不可见字符,这可能是剪切和粘贴操作的产物。怎么,为什么?不知道

    只有在我编辑 Deploy-FabricApplication 以添加这一行后,我才发现这一点。

    $publishProfile.ClusterConnectionParameters|Format-List
    

    就在之前

    [void](Connect-ServiceFabricCluster @ClusterConnectionParameters)
    

    然后我看到不可见字符显示为????在指纹的末尾。

    使用二进制编辑器打开 Cloud.xml 文件后,我可以看到并删除它们。

    然后我可以发布我的应用程序。

    【讨论】:

    • 有效!我不断收到“指定的 X509 指纹无效”异常。这是由于从证书管理器复制时证书指纹末尾的奇怪字符。
    • 您只需在这里节省一天。你应该喝啤酒我的朋友:D
    • 哇,我确定这不是我的问题,但它确实存在。当我从证书管理器复制时,字符串前面有一个额外的字符。
    【解决方案2】:

    我猜示例中提供的指纹和通用名称只是虚拟数据,因此您不必在此处发布真实值?但是,问题可能只是这样,如果您使用实际值运行它,您仍然会得到相同的异常吗?

    例如

        string thumb = "‎1234567890123456789012345678901234567890";
        string CommonName = "somefabric.cloudapp.azure.com";
        string connection = "somefabric.cloudapp.azure.com:19000";
    
        try
        {
            X509Credentials xc = GetCredentials(thumb, thumb, CommonName);
            FabricClient fc = new FabricClient(xc, connection);
            Console.WriteLine("Cluster is connected");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    

    这将抛出异常The X509 thumbprint specified is invalid.。但是,如果您将其更改为与 Microsoft 示例中的相同:

        string clientCertThumb = "71DE04467C9ED0544D021098BCD44C71E183414E";
        string serverCertThumb = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
        string CommonName = "www.clustername.westus.azure.com";
        string connection = "somefabric.westus.cloudapp.azure.com:19000";
    
        try
        {
            X509Credentials xc = GetCredentials(clientCertThumb, serverCertThumb, CommonName);
            FabricClient fc = new FabricClient(xc, connection);
            Console.WriteLine("Cluster is connected");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    

    您现在将得到一个异常声明 An error occurred during this operation. Please check the trace logs for more details.。您收到此错误是因为集群 somefabric.westus.cloudapp.azure.com 不存在并且您无法使用 FabricClient 连接到该地址,但证书指纹被识别为指纹。

    将其替换为实际的指纹、公用名和与集群的连接将起作用。

    详细解释:

    Service Fabric 在底层代码中的某处实际验证了您的证书指纹。在这种情况下,证书的指纹是证书的 SHA-1 散列(通常是 der 格式的整个证书内容),不太可能以 1234567890123456789012345678901234567890 作为实际散列结束。 Here is a nice blog entry 详细解释证书指纹的结构。

    此外,您不应为客户端安全使用与集群安全相同的证书: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-security(见文末注)

    Service Fabric 群集上的所有管理操作都需要服务器证书。客户端证书不能用于管理。

    检查证书

    集群的证书应该是您第一次创建集群时提供的证书。您应该能够在保存它的 Key Vault 中找到它。您还可以通过在 Azure 门户中查找群集资源来检查它的缩略图。单击集群资源下的安全性。 Primary certificate 字段显示了您在连接到集群时可以从集群中获得的缩略图。

    当您连接到 Service Fabric Explorer(通常在端口 19080)时,如果您检查为 HTTPS 连接提供的证书,您也可以查看它。如果您单击证书的详细信息,您应该会在证书的属性中看到指纹。

    在您被允许访问之前,浏览器会询问您的客户端证书,此时您可以提供应该位于您计算机上的证书。

    之后,您应该能够通过查看浏览器中页面的安全性来查看证书详细信息。

    如果你打开管理用户证书,你可以在Windows中找到你的本地证书,在这里你应该可以在个人/证书下找到你不想使用的证书时间>。在详细信息下找到的缩略图应该与您在代码中显示的缩略图相同。查看集群安全性时,它还应该出现在 Azure 门户的客户端证书列表中。如果它不存在,则需要添加它。 Azure 完成更新群集的安全性后,您应该能够使用该证书进行连接。

    【讨论】:

    • 感谢您的回答。是的,这是一个虚拟证书值。实际值符合正确证书指纹的结构,并与 powershell 命令 Connect-ServiceFabricCluster 一起使用,我认为这与 C# 代码正在执行的操作密切相关。您是否能够使用此代码连接到安全集群?只是为了消除一个变量。也许我的集群设置有些奇怪。
    • 是的,只要证书和缩略图按顺序排列,上面的代码就会连接到集群。请查看这张图片,其中包含一些关于在哪里可以找到证书和缩略图的信息。 [交互概述、Service Fabric 安全][1] [1]:i.stack.imgur.com/0Wsxb.jpg
    • 我在证书的答案中添加了一些附加信息。我的问题是,您可能在需要的地方没有预期的证书之一才能使其正常工作。
    • @ktam33,如果答案正确并且解决了您的问题,请考虑将其标记为已接受的答案,以帮助其他人找到它。
    • 这很有帮助,但是我仍然对“ServerCertThumbprint”和“FindValue”字段之间的区别有点困惑。它们应该是一样的吗?
    猜你喜欢
    • 2018-07-03
    • 2017-04-06
    • 2019-03-15
    • 1970-01-01
    • 2016-09-28
    • 2017-12-26
    • 2019-06-16
    • 2017-07-11
    • 2020-01-12
    相关资源
    最近更新 更多