Как получить отпечаток сертификата локального кластера Service Fabric?

#azure #certificate #azure-service-fabric #azure-powershell

#azure #сертификат #azure-service-fabric #azure-powershell

Вопрос:

У нас есть приложение, состоящее из микросервисов, а также использующее различные ресурсы Azure, такие как CosmosDB, Redis, EventHub.

Итак, мы написали сценарий Powershell, который извлекает различные секреты из группы ресурсов Azure: строки подключения CosmosDB и то же самое для Redis и Eventhub. Также отпечаток сертификата SF считывается из хранилища ключей в группе ресурсов. Затем секреты сохраняются в файле Json за пределами рабочей области git.

Затем в ScriptsDeploy-FabricApplication.ps1 мы читаем файл Json и используем секреты для замены заполнителей:

 $jsonFile = "$rootDirsecrets.json"
$secretsHashtable = @{}
(Get-Content $jsonFile| ConvertFrom-Json).psobject.properties | Foreach { $secretsHashtable[$_.Name] = $_.Value }

$ApplicationPackagePath = Resolve-Path $ApplicationPackagePath

$publishProfile = Read-PublishProfile $PublishProfileFile

if ($PublishProfileFile.EndsWith("Local.1Node.xml"))
{
    $secretsHashtable['Cluster-Host-Name'] = 'localhost'
    # TODO store the local SF certificate thumbprint in $secretsHashtable['SSL-Certificate-Find-Value']
    $publishProfile.CopyPackageParameters.CompressPackage = $true
    $OutFile = "$LocalFolder..ApplicationParametersLocal.1Node.xml"
}
else
{
    $OutFile = "$LocalFolder..ApplicationParametersCloud.xml"
}

# Replace $( ... ) in Cloud.Template.xml by the values from the hashtable
$TemplateFile = "$LocalFolder..ApplicationParametersTemplate.xml"
$TemplateStr  = Get-Content $TemplateFile -Raw
$ReplacedStr  = [regex]::Replace($TemplateStr, '$(([w-] ))', {
    param($match)
    $key = $match.Groups[1].Value
    $value = $secretsHashtable[$key]
    if ($value -ne $null)
    {
        return $value
    }
    else
    {
        throw "$key not found in $jsonFile"
    }
})

Set-Content -Path $OutFile -Value $ReplacedStr
  

Это работает для удаленной публикации и отладки (из Visual Studio 2017) с помощью Cloud.xml .

Однако для локального это не удается.1Node.xml , потому что наше приложение проверяет отпечаток сертификата через запись в ServiceManifest.xml

 <Endpoint Protocol="https" Name="ServiceEndpoint" 
    Type="Input" Port="9950" CertificateRef="MY_CERT" />
  

И, таким образом, локальная публикация приложения SF завершается ошибкой с:

журнал просмотра событий

Мой вопрос: как получить отпечаток сертификата локальной установки Service Fabric SDK?

Если бы я мог это сделать, я бы поместил это в приведенный выше сценарий (пожалуйста, смотрите комментарий «TODO»).

Комментарии:

1. Я хочу помочь, но я немного в замешательстве. Если вы используете Azure SF, у вас должны быть свои сертификаты в KeyVault, правильно? В этом случае ваше приложение или пользователь должны иметь доступ к KeyVault для получения сертификатов перед запуском развертывания. Локальная структура служб не требует от вас наличия сертификатов, поэтому вы можете запускать тестовые развертывания для тестирования и т.д.

2. Привет, Олег, я думаю, что для местного SF используются некоторые сертификаты. И поскольку они не встроены в мой Cloud.xml , наше приложение выходит из строя. Мне еще предстоит найти место в исходном коде, где это (проверка отпечатка пальца) происходит, мне это показал некоторое время назад коллега. Удаленное выполнение в порядке, сертификат находится в KV и установлен на удаленном SF, как вы написали.

3. Я думаю, что я использую стандартные инструменты развертывания, но мне пришлось отредактировать ScriptsDeploy-FabricApplication.ps1 (который поставляется с VS2017, Azure Tools), чтобы встроить строки подключения CosmosDB, Redis, Eventhub в Cloud.xml и Местный. 1Node.xml

4. Несколько дней назад я установил свежую копию SF на свой локальный компьютер, и у меня нет проблем с локальными развертываниями. Вот почему я в замешательстве по этому поводу. Затем вы подключаетесь к локальному кластеру, который запрашивает сертификат? Через Web или SF explorer?

5. Я не думаю, что это хорошая идея устанавливать параметры приложения в файле sf deployments. Для этого следует использовать отдельный файл, например Setting.xml

Ответ №1:

Я смог решить свою проблему с:

 Write-Host "Retrieving thumbprint for local SF certificate... " -NoNewline
$localCert = Get-ChildItem cert:LocalMachineMy | Where { $_.Subject -eq 'CN=AzureServiceFabric-AnonymousClient'}
Write-Host "ok"
  

Теперь я могу выполнять отладку в Visual Studio как локально, так и удаленно (на SF, развернутом в Azure).