Невозможно аутентифицировать FabricClient в защищенном кластере Service Fabric
У меня есть кластер защищенной сервисной фабрики. Тот же сертификат используется в качестве сертификата сервера и для аутентификации клиента. Я не могу создать FabricClient
в консольном приложении, которое позволит мне подключиться к этому кластеру. Я использую фрагмент кода, описанный здесь в разделе "Подключение к безопасному кластеру с помощью сертификата клиента":
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
Что я здесь не так делаю?
2 ответа
Я упал именно на эту проблему, но причина была совсем другая.
Я был смущен в этом;
- Работает https Explorer (в IExporer)
- Powershell Connect-ServiceFabricCluster тоже работал.
- Ошибка публикации в Visual Studio
Я обнаружил, что к значению моего отпечатка добавлено 4 невидимых символа, вероятно, артефакт операции вырезания и вставки. Как почему? Не знаю
Я обнаружил это только после того, как отредактировал Deploy-FabricApplication, чтобы добавить эту строку.
$publishProfile.ClusterConnectionParameters|Format-List
Как раз перед
[void](Connect-ServiceFabricCluster @ClusterConnectionParameters)
Затем я увидел невидимых символов, отображаемых как???? в конце отпечатка.
Открытие файла Cloud.xml с помощью двоичного редактора позволило мне увидеть их и удалить.
Тогда я мог бы опубликовать свою заявку.
Я полагаю, что отпечаток и общее имя, приведенные в примере, являются просто фиктивными данными, поэтому вам не придется публиковать здесь реальные значения? Однако проблема может заключаться именно в этом: если вы запустите это с реальными значениями, вы все равно получите то же исключение?
Например
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
как фактический хэш. Вот хорошая запись в блоге, объясняющая больше об анатомии отпечатка сертификата.
Кроме того, вы не должны использовать тот же сертификат для безопасности клиента, что и для безопасности кластера: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-security (см. Примечание в конце статьи).
Все операции управления в кластере Service Fabric требуют сертификатов сервера. Клиентские сертификаты не могут быть использованы для управления.
Проверка сертификатов
Сертификат кластера должен быть тем, который вы указали при первом создании кластера. Вы должны быть в состоянии найти его в хранилище ключей, в котором оно находится. Вы также можете проверить его миниатюру, найдя ресурс Cluster на портале Azure. Нажмите Безопасность под вашим ресурсом кластера. В поле с именем " Основной сертификат" отображается эскиз, который можно ожидать от кластера при подключении к нему.
Когда вы подключаетесь к Service Fabric Explorer (обычно через порт 19080), вы также можете просмотреть его, если проверите сертификат, предоставленный для подключения HTTPS. Если вы щелкнете по детали для сертификата, вы должны увидеть отпечаток среди свойств сертификата.
Прежде чем вам будет разрешен доступ, браузер запросит у вас сертификат клиента, и в этот момент вы можете предоставить сертификат, который должен находиться на вашем компьютере.
После этого вы сможете просмотреть сведения о сертификате, посмотрев на страницу безопасности в вашем браузере.
Вы можете найти свой локальный сертификат в Windows, если откроете Управление сертификатами пользователя, здесь вы сможете найти сертификат, который вы не хотите использовать, в разделе Личные / Сертификаты. Миниатюра, найденная под подробностями, должна быть такой же, как та, что вы представляете в своем коде. Он также должен присутствовать в списке клиентских сертификатов на портале Azure при просмотре безопасности кластера. Если его там нет, его нужно добавить. После того как Azure завершит обновление безопасности вашего кластера, вы сможете соединиться с этим сертификатом.