LINUX.ORG.RU
ФорумAdmin

nginx ssl-заглушка

 nginx ssl https


0

2

Добрый день. Прошу помощи в следующем вопросе. nginx работает как frontend к apache. на сервере есть несколько сайтов, для которых настроена поддержка ssl. nginx.conf:

server {
     listen 80;
         listen 443 ssl;
     ssl    on;
         ssl_certificate         /etc/ssl/certs/domain_name.crt;
         ssl_certificate_key     /etc/ssl/private/domain_name.key;
         server_name domain_name www.domain_name;

if ( $scheme = "http" ) {
              rewrite ^/(.*)$   https://$host/$1 permanent;
        }
         access_log /var/www/html/domain_name/access.log;
     error_log /var/www/html/domain_name/error.log;
         root /var/www/html/domain_name;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
Для 80 порта есть заглушка nginx.conf:
server {
      listen 80 default;
      server_name localhost;
       deny all;
}
Но, если попытаться зайти по https на другие сайты сервера(не ssl), то браузер получает сертификат сервера по умолчанию, т.е. первого ssl-сайта в конфиге, независимо от запрашиваемого имени сервера и перенаправляет на apache. Подскажите, как сделать заглушку аналогичную 80 порту.


На каждый виртуалхост нужно делать свой server, и естественно слушать их надо заставлять не просто 443, а имя_сервера:443, и про server_name тоже не забывать.

pekmop1024 ★★★★★
()
Последнее исправление: pekmop1024 (всего исправлений: 2)
Ответ на: комментарий от pekmop1024

так так и работает, я просто не весь конфиг приводил

server {
     listen 80;
         listen 443 ssl;
     ssl    on;
         ssl_certificate         /etc/ssl/certs/domain2_name.crt;
         ssl_certificate_key     /etc/ssl/private/domain2_name.key;
         server_name domain2_name www.domain2_name;

if ( $scheme = "http" ) {
              rewrite ^/(.*)$   https://$host/$1 permanent;
        }
         access_log /var/www/html/domain_name2/access.log;
     error_log /var/www/html/domain_name2/error.log;
         root /var/www/html/domain2_name;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
Попробовал добавить server_name_domain*:443 ssl. Все равно при попытке зайти по https на другие не ssl-сайты предлагает domain_name сертификат и перенаправляет.

vinner
() автор топика

У тебя для других виртхостов прописаны другие сертификаты?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

TLS SNI support enabled. Да, для другого домена - другой сертификат. Но меня больше волнует, что nginx даже по https:/ip-сервера устанавливает соединение с первым виртуальным хостом apache.

vinner
() автор топика
Ответ на: комментарий от vinner

nginx даже по https:/ip-сервера устанавливает соединение с первым виртуальным хостом apache.

так настрой :). В nginx у listen есть default. Посмотри что при этом передаётся апачу. Если там не будет заголовка Host то просто поставь нужный виртхост первым. Ну или почитай доки, может там уже появилась директива для этого

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Пробовал так:

server {
      listen 80 default_server;
      listen 443 default_server;
      server_name _;
       deny all;
}
- 80 заглушка работает, 443 - нет. если сказать server_name localhost - сервер не устанавливает соединение.

vinner
() автор топика

Есть подозрение, что «аналогичную 80му порту» не получится. Чтобы вернуть 403 forbidden, nginx сперва должен защитить соединение при помощи TLS, и передать 403 уже в защищенном виде. А чтобы защитить соединение, нужен сертификат. Таким образом, по идее, nginx должен всегда предлагать сертификат. Вопрос только в том, что это будет за сертификат (и тут на сцену выходит тот самый, не нужный тебе в данном случае, SNI).
Фиг его знает, может быть, если объявить дефолтный сервер слушающий 443 порт и отключить на нем ssl, то ты сможешь получить при попытке коннекта ошибку браузера. Но ценность этого нулевая.

thesis ★★★★★
()
Ответ на: комментарий от vinner

443 - нет

в каком смысле «нет»? Он апачу что при этом передаёт?

true_admin ★★★★★
()
Ответ на: комментарий от vinner

версия nginx какая?

http://nginx.org/ru/docs/http/ngx_http_core_module.html#listen : «До версии 0.8.21 этот параметр назывался просто default»

попробуй

server {
  listen 80 default;
  listen 443 default ssl;
  ssl_certificate         /etc/ssl/certs/default.crt;
  ssl_certificate_key     /etc/ssl/private/default.key;
  
  deny all;
}
gorilych ★★
()
Ответ на: комментарий от gorilych

Версия nginx version: nginx/1.0.15. Что касается попытки подключиться по 443: подключаюсь по https://ip; nginx отдает сертификат по умолчанию, после подтверждения в браузере, apache получает запросы по http и отдает сайт по умолчанию. Я конечно сделал заглушку в самом apache, но как-то хотелось бы, чтобы nginx не отдавал сертификат для сайтов, которые не используют ssl.

vinner
() автор топика
Ответ на: комментарий от vinner

nginx не отдавал сертификат для сайтов, которые не используют ssl

То есть? SSL соединение не может быть без сертификата.

Если подразумевается HTTPS для одного в.хоста на 443 порту, но HTTP для другого - то это невозможно. SSL включается на уровне IP:port а не на уровне в. хоста.

gorilych ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.