Добавление https в веб-API Service Fabric

Я создал кластер Service Fabric с порталом Azure. Он защищен подстановочным SSL-сертификатом от центра сертификации. Сертификат хранится в хранилище ключей.

В кластере у меня есть несколько сервисов веб-API. Я хотел бы добавить к ним конечные точки https.

Я следовал этому руководству чтобы обновить конфигурацию, добавлена ​​конечная точка https для ServiceManifest.xml в Nimles.UserManagement.Api.Authorized

<Endpoint Protocol="https" Name="ServiceEndpointHttps" Type="Input" Port="9021" />

Добавлена ​​привязка к ApplicationManifest.xml

<ServiceManifestRef ServiceManifestName="Nimles.UserManagement.Api.AuthorizedPkg" ServiceManifestVersion="1.0.0" />
<Policies>
  <EndpointBindingPolicy EndpointRef="ServiceEndpointHttps" CertificateRef="NimlesComCert" />
</Policies>

Добавлен сертификат

<Certificates>
  <EndpointCertificate X509FindValue="*****" Name="NimlesComCert" />
</Certificates>

Но я не могу найти информацию о том, как добавить сертификат на виртуальную машину, так как я использовал портал для создания кластера, и все руководства просто ссылаются на шаблоны ARM.

Я не возражаю, если мне нужно использовать ARM, если это невозможно с портала, но я не хочу воссоздавать кластер, в этом случае просто используйте ARM с моим текущим кластером.


person Lillvik    schedule 21.03.2017    source источник


Ответы (2)


Основные шаги по добавлению SSL в веб-API в Service Fabric:

  • Добавить сертификат в KeyVault
  • Установите его на виртуальные машины масштабируемого набора виртуальных машин.
  • Добавьте сертификат в ServiceManifest и ApplicationManifest (или добавьте его в свои службы другим способом, давайте перейдем к манифесту здесь)

Основываясь на вашем описании выше, вы, вероятно, уже выполнили все эти шаги. Когда вы защищаете кластер с помощью сертификата, этот сертификат устанавливается на каждую виртуальную машину в кластере. Это должно быть просто ссылкой на него в вашем манифесте. Посмотрите на шаг 2 ниже для обновления виртуальных машин с помощью ARM, если вам нужно добавить еще один сертификат в кластер (если вы используете несколько приложений, защищенных разными сертификатами).

Просто для справки, я добавляю все необходимые шаги ниже.

Добавить сертификат в KeyVault Вы уже сделали это, но просто для справки

Я рекомендую использовать ServiceFabricRPHelpers, чтобы добавить сертификат в KeyVault. Что-то в этом роде от PowerShell

Invoke-AddCertToKeyVault 
    -SubscriptionId $subscriptionId 
    -ResourceGroupName $vaultResourceGroupName 
    -Location $vaultLocation 
    -VaultName $vaultName 
    -CertificateName $clusterCertName 
    -Password $clusterCertPw 
    -UseExistingCertificate 
    -ExistingPfxFilePath $certFilePath

Установите сертификат на VMSS Поскольку вы защитили свой кластер с помощью сертификата, на ваших виртуальных машинах уже установлен сертификат хранилища, но опять же, просто для справки

Это можно сделать либо с помощью командлетов PS, либо путем обновления шаблона ARM. Командлет PS может выглядеть так:

$certConfig = New-AzureRmVmssVaultCertificateConfig 
    -CertificateUrl $certificateUrl 
    -CertificateStore $certStore

# Add the certificate as a new secret on each VM in the scaleset
$vmss = (Get-AzureRmVmss | Where-Object{$_.name -eq $vmssName})[0]
$vmss.VirtualMachineProfile.OsProfile.Secrets[0].VaultCertificates.Add($certConfig)

# Trigger an update the VMs in the scaleset 
Update-AzureRmVmss -ResourceGroupName $ResourceGroup -Name $VmssName -VirtualMachineScaleSet $Vmss

И версия ARM будет выглядеть так

"osProfile": {
    "adminPassword": "[parameters('adminPassword')]",
    "adminUsername": "[variables('adminUsername')]",
    "computernamePrefix": "[variables('vmNodeType0ComputerName')]",
    "secrets": [
        {
            "sourceVault": {
                "id": "[parameters('sourceVaultValue')]"
            },
            "vaultCertificates": [
                {
                    "certificateStore": "[variables('certificateStoreValue')]",
                    "certificateUrl": "[parameters('certificateUrlValue')]"
                }
            ]
        }
    ]
},

Для этой версии шаблона ARM вы можете обновить уже развернутый кластер, либо загрузив автоматически созданный сценарий с портала Azure, либо загрузив фактический шаблон, который вы использовали при первом развертывании (даже если вы выполняли развертывание с помощью мастера в портал фактически создает шаблон за кулисами для вас, и именно он развертывается, когда вы нажимаете кнопку «ОК» на последнем шаге).

Найдите группу ресурсов с вашим кластером на портале.

введите описание изображения здесь

Сценарий автоматизации отображает для вас новый шаблон на основе того, что содержит группа ресурсов на данный момент, это совокупность всех ваших изменений до этого момента ресурсов в группе. Нажмите «Загрузить», и вы получите ZIP-файл с файлом шаблона и параметрами.

введите описание изображения здесь

Теперь вы можете повторно развернуть его с помощью PowerShell следующим образом:

New-AzureRmResourceGroupDeployment 
    -Name "Update_admin_cert" 
    -TemplateFile .\template.json 
    -ResourceGroupName $resourceGroupName 
    -Mode Incremental

Обратите внимание на параметр Mode Incremental, он просто исправляет все, что уже есть в вашей группе ресурсов, с любыми новыми или перекрывающимися определениями в шаблоне, который вы развертываете, поэтому (в целом) безопасно запускать его в существующей группе ресурсов, если вы только хотите изменить или добавить некоторые детали для ресурса.

Добавление сертификата в ApplicationManifest

Добавление сертификата в вашу службу — это вопрос обновления манифеста, используемого для развертывания приложения/службы. В этой статье документации описывается, что тебе нужно. Короче говоря, добавьте EndpointBindingPolicy к ServiceManifestImport в ApplicationManifest.xml и сертификат в тег Certificates, который ссылается на отпечаток вашего сертификата:

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <EndpointBindingPolicy CertificateRef="TestCert1" EndpointRef="ServiceEndpoint3"/>
    </Policies>
  </ServiceManifestImport>

  <Certificates>
    <EndpointCertificate Name="TestCert1" X509FindValue="ABCDEF27174012740129FADBC232348324" X509StoreName="MY" />  
  </Certificates>
person yoape    schedule 21.03.2017
comment
Очень хорошее руководство, но, как вы сказали, я, кажется, сделал все необходимые шаги. Но я получаю тайм-аут при попытке доступа к конечной точке, например. cluster.nimles.com:9020/swagger/ui/index Если я попытаюсь для доступа к соответствующей конечной точке http, например. cluster.nimles.com:9021/swagger/ui/index работает нормально . - person Lillvik; 22.03.2017
comment
Вы добавили 9020 в LoadBalancer при создании кластера? - person yoape; 22.03.2017
comment
Да. Я также пытался переключать разные порты между конечной точкой http и https, и http всегда работает, но время ожидания https истекает. - person Lillvik; 23.03.2017

Портал можно использовать для создания шаблона ARM для существующей группы ресурсов. Нажмите на пункт меню «Скрипт автоматизации». Затем вы нажимаете «скачать».

Затем вы можете повторно развернуть ресурс типа «Microsoft.Compute/virtualMachineScaleSets» с информацией о сертификате в узле «virtualMachineProfile». (удалить остальные, удалить зависимости)

Обратите внимание, что вам придется указать любые значения параметров, так как они не заполняются автоматически.

(Я бы рекомендовал использовать шаблон ARM для создания кластера для начала.)

person LoekD    schedule 21.03.2017