Коллеги, приветствую! Появилась не совсем тривиальная задача реализовать в nginx

редирект HTTPS —> HTTP. Да, именно так, а не наоборот. Мы разрабатываем embedded устройство, на которое пользователь заходит по IP-адресу (как на какой-нибудь роутер), а не по доменному имени. Из-за тотального внедрения HTTPS во всех браузерах, зачастую они используют именно его по умолчанию, что, естественно, выливается в ERR_CONNECTION_REFUSED, т.к. listen 443 сейчас не прописано в конфиге nginx, только 80. Многих пользователей устройства это сбивает с толку.

Беглый поиск по интернетам дал два варианта решения проблемы, через rewrite и return:

server {
listen 443;
server_name _;
rewrite ^(.*) http://$host$1 permanent;
}

server {
listen 443;
return 301 http://$host$request_uri;
}

но ни один из них не заработал, в Chrome ошибка ERR_SSL_PROTOCOL_ERROR, curl пишет чуть подробнее:

nikita@MBP:~% curl -vv https://192.168.100.103/
* Trying 192.168.100.103:443...
* Connected to 192.168.100.103 (192.168.100.103) port 443 (#0)
* ALPN: offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/cert.pem
* CApath: none
* LibreSSL/3.3.6: error:1404B42E:SSL routines:ST_CONNECT:tlsv1 alert protocol version
* Closing connection 0
curl: (35) LibreSSL/3.3.6: error:1404B42E:SSL routines:ST_CONNECT:tlsv1 alert protocol version

Как я понимаю, трабла в том, что для установки SSL-коннекта нужны серт и ключ в конфиге... Но в нашем случае этих сертов нет! В инете предлагается либо сделать самоподписанный серт (что выльется в warning в браузере, не хочется такого), либо заюзать условный Let's Encrypt, что тоже не вариант, т.к. они не делают сертификаты для IP-адресов, да и IP у нас по факту может быть любой...

Одним словом, мне не нужен этот ваш хттпс, а если юзер и заходит по нему, надо его как-то перекинуть на HTTP. Как по вашему правильнее решить эту проблему?

24 ответов

118 просмотров

Так в чем проблема сделать пропатчить так сказать nginx сертботом, и https запрос перенаправлять на http в nginx?)

Выдать юзеру ссылку с хттп://

В общем случае - никак, особенно если у вас embedded устройство с адресом в приватной сети. Вы имеете шанс поймать ситуацию, когда пользователь уже заходил ранее на этот ip по https, ему отдали там HSTS с таймаутом в полгода - и без очистки кэша браузера пользователь на http не попадет никак.

Никита- Автор вопроса

Понятно, печально( И раз у юзера будет включен HSTS, то даже с самоподписанным сертом зайти не удастся?

Никита
Понятно, печально( И раз у юзера будет включен HST...

Удастся, но с руганью на сертификат. Но это краевой случай, на самом деле

Устройство вообще не умеет в https, или вы не хотите?

Никита- Автор вопроса
⁠Сергей
Устройство вообще не умеет в https, или вы не хоти...

Как оно сможет уметь, если я его ещё не настроил) Вот как раз и пытаюсь понять, можно это вообще сделать или нет. А настроить проблема, т.к. мы не знаем точные SAN, для которых генерить сертификат, IP-адрес может быть любой. Мне интересно, как это на тех же роутерах реализовано (я сам хз, потому что почти везде микротики на которые я захожу через SSH), судя по всему, никак...

Никита
Как оно сможет уметь, если я его ещё не настроил) ...

Группа пользователей у устройства определена или нет?

Никита
Как оно сможет уметь, если я его ещё не настроил) ...

Посмотрите, как это сделано на всяких ipmi / oob железках. В 99% случаев там просто фуфлыжный сертификат, да еще и просроченный.

А так ли надо HTTPS в серых сетях? Если прям надо то пусть клиент сам сможет подсунуть свой серт, ключ и CA

Linux/o.id[8] Tech-Worker
А так ли надо HTTPS в серых сетях? Если прям надо ...

Мол по дефолту HTTP, скормишь свои серты и ключ - будет и HTTPS и возможность отрубить http

Никита
Как оно сможет уметь, если я его ещё не настроил) ...

если есть свой доверенный уц, то проблем особых нет

аккуратнее с портянками, есть pastebin.com

Никита- Автор вопроса
kiosaku
если есть свой доверенный уц, то проблем особых не...

УЦ допустим есть, но он наш офисный, снаружи доступа к нему нет. Но даже если и вынести его в инет — устройство в 95 % случаев стоит в закрытой сети, у которой нет доступа в инет и соответственно к нашему УЦ.

Никита- Автор вопроса
Никита
УЦ допустим есть, но он наш офисный, снаружи досту...

а тогда в чём проблема-то, раз "во внутренней сети" ?

Никита- Автор вопроса
kiosaku
а тогда в чём проблема-то, раз "во внутренней сети...

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

Никита- Автор вопроса

Но иначе пользователям придётся явно добавлять наш CA root себе в систему?

Никита- Автор вопроса
kiosaku
не "иначе", а определённо

Тогда это не вариант и придётся видимо оставить всё как есть( Я всю эту тему завёл только ради того, чтобы юзерам удобнее было, а на секурити тут пофигу... Добавлять свои серты, это уже гемор. Кстати, а разве нет какой-то технологии, чтобы получать эти кастомные корневые сертификаты УЦ удалённо? Т.е. не закидывать руками в систему и прописывать как доверенный. Вроде же был какой-то протокол, но тут я уже сто проц в теме плаваю, так что просьба тряпками сразу не закидывать)) OSCP чё-та-там, или это не для этого?

Никита
Тогда это не вариант и придётся видимо оставить вс...

Ocsp скорее всего вы слышали, он нужен для проверки сертификата, что он валидный. Он не получает рутовые сертификаты, не тянет их из уц, рутовые серты устанавливает производитель ОС системы, плюс вы зарукожопить можете и поставить шляпу какую-нибудь и доверять ей, ну либо кто-то за вас решит этот вопрос, получив рута(админа) от вашей системы. Без знания дела лучше не трогать. Лучше читать про PKI много и нужно, пока все не будет кристально понятно.

Никита
Тогда это не вариант и придётся видимо оставить вс...

добавляется _один сертификат. уц-шный. в любом случае, у меня есть подозрение, что ты сам не очень понимаешь, что хочешь

Никита- Автор вопроса
kiosaku
добавляется _один сертификат. уц-шный. в любом слу...

Нет, я всё прекрасно понимаю, чего хочу, и это было описано в моём первом сообщении: просто сделать девайс более user friendly и избежать ошибки connection refused. Просто дальше уже обсуждение скатилось к собственным УЦ и корневым сертам, это я скорее для интереса и самообразования продолжил)) А ответ на свой вопрос я получил, что без костылей никак не реализовать то, что я хотел. Я ж поначалу гуглил и ничё внятного не нашёл, везде классика банальная http > https, а наоборот мало кому надо было, поэтому решил обратиться к комьюнити.

Похожие вопросы

Обсуждают сегодня

Hi! Could you please upvote my new notebook? thanks a lot. https://www.kaggle.com/code/melissamonfared/anime-character-generation-dsgan-gan
məru
4
upvote plz https://www.kaggle.com/code/bassetkerouche/swapping-face?scriptVersionId=207300096
benkerrouche Statoinary
1
-- Привет всем. -- Есть csv, проблема в том что он содержит очень много повторов по столбцам и по строкам. -- Решил перекинуть это в базу данных, чтобы было проще. Но я не ша...
Oleg Ivanov
1
Как считаете - вопрос на собесе: «Как быстрее всего запустить ec2 машину в aws (в чистом аккаунте) и показать вывод от любой команды с нее» не очень ли сложный для условного м...
Sergey
50
Господа, у меня вопрос. Что вообще такое этот ваш data science и data scientists? А то гуглю, а мне какую-то расплывчатую фигню говорят.
Inkosta
44
Hi could you please help me with my two new projects? https://www.kaggle.com/code/hesankazemnia/rice-image-classification-cnn-pytorch https://www.kaggle.com/code/hesankazemnia...
Hesan
6
Исходя из ваших комментариев, получается, что чтобы получить марты в CH из данных в PG, неправильно тянуть сырые данные в CH и там их обрабатывать, лепить справочники и джойни...
unhingedlunatic
42
hi, Can you upvote? https://www.kaggle.com/code/durjoychandrapaul/rag-q-a-system-by-langchain-huggingface-for-pdf?scriptVersionId=204704280
A
1
Could you upvote and comment please? https://www.kaggle.com/code/tatianapetrushkevich/beginner-images https://www.kaggle.com/code/tatianapetrushkevich/python-for-beginners1 ...
Tazziyana
7
public async Task<string> YCFileGetLink(string fileName, int lifeTime) { DateTime utcNow = DateTime.UtcNow; var dataKey = GetKeyedHash(_configurat...
Сергей
5
Карта сайта