Несколько веб-интерфейсов API, защищенных SSL, и одновременное нажатие клавиш в Service Fabric

У меня в кластере два приложения WebAPI. Оба приложения работают на каждом узле. Оба они используют ядро ​​asp.net и Weblistener. Следуя совету здесь, я настроил их обоих для прослушивания http и https на порту 80, и 443 соответственно.

Https защищен с помощью того же сертификата и настроен с использованием, например, привязки конечной точки (?), Как обсуждалось здесь. У меня все нормально работало с самоподписанным сертификатом, но возникла проблема, когда дело дошло до замены сертификата на правильный. Эффективная имитация смены сертификата.

Я добавил новый сертификат в хранилище ключей и развернул его в кластере. Когда дело дошло до повторной публикации моих приложений с новой ссылкой на сертификат, это не помогло с этим ошибка ConfigurePortCertificate: httpsPort=443, certStoreName My, certfindvalue {SSLCertFingerPrint}, error AlreadyExists. Что теперь имеет смысл ..

Поскольку оба приложения работают на каждом узле, и мы пытаемся обновить одно из них, происходит следующее:

  1. WebAPI1 имеет Cert_A, привязанный к https: 443.
  2. WebAPI2 имеет Cert_A, привязанный к https: 443 (и это нормально, это один и тот же сертификат)
  3. Попытка обновить WebAPI1 с помощью Cert_B.
  4. Публикуется в кластере, пытается привязать Cert_B к https: 443
  5. Ошибка из-за того, что другой сертификат (Cert_A) уже привязан к https: 443

Единственный обходной путь, который я нашел для этого, - отключить каждую систему, которая использует Cert_A на https: 443, и повторно опубликовать все приложения, используя новый Cert_B.

Это довольно неприемлемо (например, я явно делаю что-то не так), чтобы отключить основные части системы для изменения сертификатов.

Какие у меня здесь варианты?

Kestrel по-другому управляет https? Мог бы я столкнуться с подобными проблемами, сделав что-то вроде ... вместо того, чтобы сертификаты размещались локально (то есть через подготовку виртуальной машины), я мог бы запросить последний сертификат из keyvault. Я мог бы предоставить Kestrel сертификат, предоставленный неверсированным URL-адресом для хранилища ключей (который получает последний сертификат). Затем, я полагаю, все, что мне нужно сделать, это перезапустить службы (например, опубликовать обновление), и они начнут использовать новейший сертификат. Однако я понимаю, что Kestrel - это в настоящее время не «поддерживается» для использования на внешних веб-серверах.

Я бы тоже был лучше

  1. Использование шлюза (например, шлюза приложений) и размещение всех моих служб WebListener на разных портах, защищенных с помощью HTTPS.
  2. Использование шлюза и использование Kestrel, разные или одинаковые порты
  3. Используя защищенный https-шлюз и мои службы работают на разных портах, не беспокойтесь о https внутри.

Или есть простое решение моей проблемы, которого я не осознаю?

Заранее спасибо!

Прошу прощения за неправильную терминологию, пожалуйста, поправьте меня.


person Mardoxx    schedule 08.02.2017    source источник


Ответы (1)


В ASF встроен обратный прокси. Его можно настроить для использования SSL и завершения SSL. Это очень простое решение.

http (s): обратный прокси-сервер может быть настроен для приема трафика HTTP или HTTPS. В случае HTTPS-трафика завершение SSL-соединения происходит на обратном прокси-сервере. Запросы, пересылаемые обратным прокси-сервером службам в кластере, отправляются по протоколу http. Обратите внимание, что службы HTTPS в настоящее время не поддерживаются.

person LoekD    schedule 08.02.2017
comment
Ты шутишь, что ли! Я попробую, спасибо :) - person Mardoxx; 08.02.2017
comment
Я пробовал это, и все сломалось. Я получаю сбой подготовки кластера без очевидной дополнительной информации о моей колонке Service Fabric :( Есть идеи? - person Mardoxx; 08.02.2017
comment
Он также говорит Status: Upgrade service unreachable Что бы это ни значило. - person Mardoxx; 08.02.2017