#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).