@BloodVIRUS

Как в nginx подключать ssl если файл сертификата присутствует?

Здравствуйте. У меня на сервер привязаны все домены 3 уровня. Т.е если перейти dev1.site.ru или alex.site.ru все будет вести ко мне на сервер. Nginx конфиг для этого простой:

server {
listen 80;
server_name ~^(www\.)?(?.+)$;
root /var/www/users/$domain;

}

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

Идея такова, делаю два таких конфига, один на 80 порт, второй на 443 ssl
во втором подключаю сертификат, а в первом проверяю есть ли файл сертификата. Если есть - редирект.

if (-f /var/ssl/$domain/privkey.pem) {
rewrite ^/(.*)$ https://$domain/$1 permanent;
}

Отрабатывает все на ура. Но..

ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

Браузер говорит мне:
Этот сайт не может обеспечить безопасное соединение Сайт dev1.site.ru отправил недействительный ответ.
ERR_SSL_PROTOCOL_ERROR

Но если я подключаю сертификат по прямому пути, все работает:

ssl_certificate /etc/letsencrypt/live/dev1.site.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/dev1.site.ru/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

Магия какая то..
  • Вопрос задан
  • 1294 просмотра
Пригласить эксперта
Ответы на вопрос 4
sashkets
@sashkets
Прекратил отвечать после 24.02.2022
непонимаю, зачем такие заморочки
не лучше ли сделать себе wildcard от ЛЕ и не парится?
Ответ написан
Комментировать
POS_troi
@POS_troi
СадоМазо Админ, флудер, троль.
LetsEncrypt умеет в Wildcard

Браузер говорит мне:

Ну так и смотрите что за сертификат вам отдаёт сервер, так-же про логи не забываем.
В браузере ну или curl в помощь
curl -vvI https://site.ru
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* 	subject: CN=*.sysalex.com <-- раз
* 	start date: May 27 05:07:30 2019 GMT
* 	expire date: Aug 25 05:07:30 2019 GMT
* 	common name: *.sysalex.com <-- два
* 	issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
Ответ написан
server_name ~^(www\.)?(?.+)$; - это что за самодеятельность ? это ваще зачем?
Во первых вы нарушаете философию самого nginx - сам создатель nginx не один раз говорил что !!!
НАМЕРЕННО не вводил нормальное использование переменных в файлах конфигурации, поскольку куда как правельней 10 раз скопировать кусок файла нежеле забивать ее переменной, не обломится админ скопировать две строчки .
И я вам могу сказать что он прав.
2. Вы при генерации сайта все-равно какими-то средствами это делаете, ВЫ ЖЕ НЕ ПИШИТЕ ВСЕ РУКАМИ, ПРИ НАЛИЧИЕ МИЛЛИОНОВ ВЕБ ИНТЕРФЕЙСОВ?
3. Если вам прям так не имется с проблеммой ввв, сделайте банально линку на папку c www,и не нужно изголяться.
4. Работа с сертификатом и без него принципиально отличается, КАК МИНИМУМ тем что при обращению по http вначале получается имя домена а потом работа.
ПО HTTPS вначале работают ключи а только после этого в этом канале можно получить хоть байт информации, включая имя сайта. так что не выдумывайте велосипед.
Генерируйте конфиги для каждого сайта, а я бы еще рекомендовал отдельно для http и https в таком случае ошибка в одном из них не приводит к падению второго интерфейса.
ну а дефолтный конфин нужно назвать 000-default... - где 000 говорит о том что он будет первым при выдачи ( посколкуь как я вам расписывал в пункте4 если сайт не имеет https о этом он физически может узнать только получив ключи, как следствие веб сервер возьмет " ближайшие" а сортировка у него именно по буквам ;) 00 просто первые ;)
Ну и банальное удобство, разные сайты требуют доп изменений в конфигах.
А следовательно куда в вашей модели их писать?
Ответ написан
SynCap
@SynCap
Делаю интернет с 1998 года
server {
  listen 80;
  server_name ~^(www\.)?(?<domain>.+)$;
  root /var/www/users/$domain;
}

в третьей строчке забыли имя региона регекспа, поэтому $domain в некоторых версиях nginx будет пустой, в некоторых - будет ругаться на неправильный конфиг и обработка блока инструкций прерывается.
посему получается, что сертификата, как бы, нет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы