Мне нужно несколько советов о том, как обращаться с SSL-сертификатами для соединений https и wss (безопасный веб-сокет) в динамически запускаемых экземплярах EC2.
Во-первых, контекст:
В настоящее время мы используем экземпляры Windows в Amazon EC2 для запуска установки сервера / клиента следующих компонентов:
- исполняемый файл «server», работающий в качестве службы Windows (разработан в C # /. Net)
- веб-сервер (IIS), на котором размещено одностраничное веб-приложение (разработано в TypeScript / React)
- хранилище данных для работы в Amazon S3
- аутентификация пользователя через Amazon Cognito
Пользователи могут подключаться к веб-приложению и выполнять действия с данными.
Веб-приложение подключается к исполняемому файлу сервера через веб-сокет на определенном порту (скажем, 5910).
Запросы команд отправляются из веб-приложения на сервер через этот веб-сокет.
И во время выполнения этих команд сервер отправляет ответы команд обратно в веб-приложение через этот веб-сокет.
До сих пор у нас был только один экземпляр EC2, настроенный с именем хоста (скажем, «mycompany.com») и запись в настройках DNS с нашим провайдером доменных имен, которая указывает на IP-адрес экземпляра Amazon. Мы можем использовать «https» для веб-приложения и «wss» для подключения к веб-сокету, используя специальный сертификат SSL для «mycompany.com».
Недавно мы добавили способ запуска новых экземпляров в EC2 из этого первого экземпляра («центральный»).
Мы используем пользовательские данные EC2 + сценарий Power Shell для настройки экземпляров при запуске.
Все это работает нормально, и мы, по сути, получаем новые экземпляры, которые также запускают исполняемый файл «сервер» и веб-сервер, на котором размещается одностраничное веб-приложение. Вы можете перейти к общедоступному IP-адресу новых экземпляров и, по существу, запустить веб-приложение, связанное с сервером, на новом компьютере (независимо от 1-го «центрального» экземпляра).
Теперь, следующее, что мы сделаем: когда мы запустим новый экземпляр с 1-го компьютера, мы НЕ будем переходить к общему IP-адресу недавно запущенного экземпляра, а просто переключим соединение через веб-сокет уже запущенного веб-приложение на сервере исполняемого файла на новом экземпляре. С этого момента действия, выполняемые в веб-приложении, будут отправлять / получать запросы / ответы на команды к / от исполняемого файла «server», запущенного на новом экземпляре. (В принципе, нам больше не нужно запускать веб-сервер на новом экземпляре, поскольку содержимое веб-приложения остается обслуживаемым 1-м «центральным» компьютером.)
Это на самом деле уже работает, если мы запустим веб-страницу как «http» и websocket как «ws» (конечно, это небезопасно).
Когда мы пытаемся использовать «https» и «wss» (безопасные веб-сокеты), мы сталкиваемся со следующими вопросами, касающимися работы с сертификатами SSL для динамически запускаемых экземпляров EC2:
Для использования SSL веб-серверу и привязке к веб-сокету требуется сертификат SSL.
Как отмечалось выше, когда у нас был только 1 экземпляр, мы купили сертификат SSL для «mycompany.com» и использовали его для подключений https через порт 443 на веб-сервере IIS. И мы также использовали сертификат для защиты соединения через веб-сокет, выполнив:
netsh http add sslcert ipport = certhash = appid = {}
Поскольку у нас был только 1 экземпляр и сертификат SSL для имени хоста этого экземпляра, все это было просто и работало (после настройки брандмауэра для учета трафика через порт веб-сокета).
Теперь, когда мы запустим несколько экземпляров и переключим соединение через веб-сокет с центрального компьютера на вновь запущенные, как мы справимся с этим?
- Нужно ли устанавливать имя хоста для каждого экземпляра и добавлять запись DNS для каждого экземпляра?
- Затем мы создаем новый сертификат SSL для каждого экземпляра? Я предполагаю, что для этого нам нужно использовать подстановочный сертификат «* .mycompany.com», но нам все еще нужен способ сообщить компьютеру, что он является частью этого домена, или сертификат не будет считаться действительным.
- Если нам нужно сделать записи DNS для каждой новой машины, которая запускается, как мы будем делать это динамически при запуске машин? И как быстро эти записи DNS становятся активными?
- Или есть способ использовать IP-адреса (общедоступные или частные) для подключения к сокету, но при этом использовать универсальный сертификат домена для всех компьютеров?
- Поскольку мы будем запускать веб-приложение с веб-сервера на 1-м (центральном) экземпляре и подключаться к другому компьютеру, нужно ли что-то особенное настроить для этого?
- Можем ли мы просто продолжать привязывать сертификат в новых экземплярах к порту, используемому для подключения к веб-сокету, как мы делали раньше?
Я уверен, что многие из вас уже сделали это, поэтому любые советы очень приветствуются!
Спасибо!
Koen
PS
Я немного читал об AWS Certificate Manager и Route 53, но это кажется довольно сложным, поэтому я предпочел бы не использовать это, если это возможно. Если они нам действительно нужны, пусть будет так.