Назад | Перейти на главную страницу

NETSH - как привязать SSL-сертификат к порту и передавать трафик в приложение?

В Windows Server 2016

У меня есть простой веб-сервер на Python (в колбе). Он отлично работает и прослушивает порт 80 (или что-то еще, что я настроил для прослушивания).

Мне нужно обслуживать его через SSL.

У меня есть хороший сертификат, и я импортировал его в компьютерное / персональное хранилище сертификатов.

Потом побежал:

netsh http add sslcert ipport=0.0.0.0:443 certhash=8caef2be185a0c94d################ appid="{7E46BD40-39C6-4813-B414-019AD3332421}"   

netsh http add urlacl url=https://+:443/ user=Everyone

Команды работают нормально. Я запускаю веб-сервер фляги на 443, но он работает в незашифрованном виде. Например.

https://host/    // fails, because the server is serving plain text
http://host:443   // works, because the traffic ain't ssl-ified

Как решить?

Чтобы было ясно: как решить, не касаясь кода фляги (мы не хотим помещать сертификат SSL в файловую систему, это небезопасно). Я считаю, что netsh можно использовать для завершения SSL перед произвольным веб-сервером?

Ответ: забудьте про netsh, похоже, это не билет.

Мы решили использовать IIS в качестве обратного прокси, как показано здесь:

https://developers.coveo.com/display/public/SearchREST/Configuring+HTTPS+Reverse+Proxy+in+IIS

и тут

https://weblogs.asp.net/owscott/creating-a-reverse-proxy-with-url-rewrite-for-iis

Я не очень хорошо знаком с Flask. Но все остальные приложения python, которые я запускал в Windows и использующие SSL, напрямую ссылались на сертификат и файл ключа в формате PEM. Они вообще не взаимодействовали с хранилищем сертификатов Windows или нуждались в каких-либо netsh config. Я предполагаю, что то же самое верно и для Flask, и есть особый способ ссылаться на эти файлы и передавать трафик через HTTPS.

Быстрый поиск в Интернете по запросу "python flask ssl" дает обнадеживающие результаты:

Похоже, что консенсус вращается вокруг создания экземпляра SSL.Context который ссылается на сертификат и ключ и передает его в качестве аргумента в app.run.