Есть Python-сервер, который запускается следующим кодом:
//PageHandler3.PageHandlerClass3 содержит логику бекенда
def run(server_class=ThreadingHTTPServer, handler_class=PageHandler3.PageHandlerClass3):
server_address = ('', PORT)
httpd = server_class(server_address, handler_class)
print("Serving at", PORT)
httpd.serve_forever()
run()
Скрипт хранится и запускается из дроплета на DigitalOcean. У дроплета есть IP, и с http-запросами к серверу с использованием этого IP проблем нет.
Также есть фронтенд (HTML+JS), который хранится на том же дроплете и запускается на Apache. Он делает http-запросы к вышеописанному бекенду.
Также есть домен, который ведет к IP. Пока что его функция - исключительно удобство, чтобы не отпугивать пользователей необходимостью вводить IP для посещения сайта.
Проблемы начались, когда в один момент понадобилась функция записи аудио.
Если на фронтенде нет https, то navigator.mediaDevices возвращает null.
https на фронтенде удалось поставить без проблем (с использованием сертификата для домена, сгенерированного с помощью certbot от Let'sEncrypt), но из https-фронтенда нельзя обратиться к бекенду без https.
Я сгенерировал еще один сертификат (привязанный к домену, тоже с помощью certbot) для бекенда и добавил строку
httpd.socket = ssl.wrap_socket(httpd.socket, server_side=True, certfile='data//keys//new//cert.pem', keyfile='data//keys//new//privkey.pem', ssl_version=ssl.PROTOCOL_SSLv23)
Однако, в браузере, когда я захожу на
https://IP:port/api/hi я получаю NET::ERR_CERT_COMMON_NAME_INVALID
Я так понимаю, браузер знает, что сертификат относится к домену, но он видит IP, и даже не проверяет, что домен на самом деле привязан к IP. Но другого способа сделать http-запрос к бекенду, кроме IP, я не знаю. Просто замена IP на домен не работает.
Я погуглил, что возможно получить сертификат для IP (а не для домена), но для этого IP нужен принадлежать мне, а не DigitalOcean.