我有一个安全的服务架构集群。相同的证书用作服务器证书和客户端身份验证。我无法在控制台应用程序中创建FabricClient
,这将允许我连接到此群集。我正在使用“使用客户端证书连接到安全集群”下的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
我在这里做错了什么?
答案 0 :(得分:3)
我猜测样本中提供的指纹和常用名称只是虚拟数据,因此您不必在此处发布实际值?但是,问题可能就是这个问题,如果你用实际值运行它,你仍会得到相同的异常吗?
E.g。
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哈希值(通常是整个证书的内容格式),最终不会以1234567890123456789012345678901234567890
作为实际哈希值。 Here is a nice blog entry解释了有关证书指纹解剖的更多信息。
此外,您不应使用与群集安全性相同的证书来实现客户端安全性: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-security (请参阅本文末尾的注释)。
Service Fabric群集上的所有管理操作都需要服务器证书。客户端证书不能用于管理。
群集的证书应该是您第一次创建群集时提供的证书。您应该能够在持有它的密钥保管库中找到它。您还可以通过在Azure门户中查找群集资源来检查缩略图。单击群集资源下的“安全性”。 显示主证书的字段显示连接到群集时可以从群集中获得的缩略图。
当您连接到Service Fabric Explorer(通常在端口19080)时,如果您检查为HTTPS连接提供的证书,也可以查看它。如果您单击证书的详细信息,则应在证书的属性中看到指纹。
在允许访问之前,浏览器会询问您的客户端证书,此时您可以提供应该位于您计算机上的证书。
之后,您应该可以通过查看浏览器中页面的安全性来查看证书详细信息。
如果您打开管理用户证书,您可以在Windows中找到本地证书,在这里您应该能够在个人/证书>下找到您不想使用的证书。在详细信息下找到的缩略图应该与您在代码中显示的缩略图相同。在查看群集安全性时,它还应存在于Azure门户中的客户端证书列表中。如果不存在,则需要添加它。 Azure完成更新群集的安全性后,您应该能够连接该证书。
答案 1 :(得分:2)
我忽略了这个确切的问题,但原因完全不同。
我很困惑;
我发现我的指纹值附加了4个不可见的字符,可能是剪切和粘贴操作的神器。怎么样,为什么?不知道
只有在我编辑了Deploy-FabricApplication以添加此行之后才能找到它。
$publishProfile.ClusterConnectionParameters|Format-List
就在
之前[void](Connect-ServiceFabricCluster @ClusterConnectionParameters)
然后我看到不可见的字符显示为????在指纹结束时。
使用二进制编辑器打开Cloud.xml文件,我可以看到它们并删除它们。
然后我可以发布我的申请。