LINUX.ORG.RU
решено ФорумAdmin

nginx SNI


0

1

Я на «ваше высочество» с Web технологиями, а по сему не могу развидеть вот чего:

# nginx -V
nginx version: nginx/1.6.0
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 
TLS SNI support enabled
# openssl version 
OpenSSL 1.0.1f 6 Jan 2014
server {
 listen 443 ;
 server_name xxx.company.ru www.xxx.company.ru;
 root /etc/nginx/conf.d/myportal;
 index index.html index.htm;

 ssl on;
 ssl_certificate ...
server {
    listen 443 default_server;
    server_name "";
    return      444;
}

При входе на: https://xxx.company.ru - получаю: «Соединение было прервано». Firefox 30.

Если убираю блок:

server {
    listen 443 default_server;
    server_name "";
    return      444;
}

Всё работает.

Порядок следования блоков важен? Если важен, то как? Если не важен, то почему отрабатывает директива с: return 444? Ведь SNI вроде уже есть... Или надо чего-то ещё шаманить с ним? Или сертификат по особому нужно было покупать?

★★★★★

Ответ на: комментарий от thesis

Ну дак и пусть выключен. Мне надо придти же на блок содержащий:

server_name xxx.company.ru www.xxx.company.ru;

При входе на: https://xxx.company.ru - получаю: «Соединение было прервано». Firefox 30.

Или я может не до конца уловил Вашу мысль?

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

Предположение было в следующем: лиса ломится на 443й порт и сходу пытается инициировать там tls handshake, но вебсервер-то ожидает голого http, поэтому кто-то из них охреневает и сбрасывает соединение.
Т.е. я предположил, что в такой конфигурации не-ссльные порты имеют приоритет на ссльными.
Короче говоря, включи на дефолтном сервере SSL явно, чего тут рассуждать.

И вообще, для поиска проблем боженька придумал логи.

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

Короче говоря, включи на дефолтном сервере SSL явно, чего тут рассуждать.

Включал. Но я так понял, что это директива не для этого совсем - почитав сайт nginx, а для указания сразу двух Listen в блоке server

И вообще, для поиска проблем боженька придумал логи.

Сейчас скину. :)

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

Гляди какая муть:

2014/07/10 12:54:59 [error] 12681#0: *2 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.xx.xx, server: 0.0.0.0:443
DALDON ★★★★★
() автор топика
Ответ на: комментарий от thesis

Да я уже назначил же..?

server {
 listen 443 ;
 server_name xxx.company.ru www.xxx.company.ru;
 root /etc/nginx/conf.d/myportal;
 index index.html index.htm;

 ssl on;
 ssl_certificate /etc/nginx ....;
 ssl_certificate_key /etc/nginx...;

Или я должен ещё назначить в блоке:

server {
    listen 443 default_server;
    server_name "";
    return      444;
}

Не думаю, я что в блоке default_server нужно назначать что-либо... Зачем? Я ведь не должен при использовании SNI попадать на него.

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

Похоже ты прав... Оно наверно по SNI разрешает имя, и приходит на мой ip. А там 444.

Сделал пока:

server {
        listen 443 default_server;
        server_name "";
        ssl on;
        ssl_certificate /etc/nginx/...;
        ssl_certificate_key /etc/nginx/...;
}

Теперь при входе по URL получаю что ожидал. При входе по ip - получаю 404.

Как бы вместо 404 получить что-то попонтовее в моём случае?

Только погоди... А если у меня будет завтра ещё один сертификат на одном ip..? Как тогда?

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

Или я должен ещё назначить в блоке:

Думаю, да.

Я ведь не должен при использовании SNI попадать на него.

Твою логику-то я понимаю, а вот как работает SNI в деталях - нет.

А уж как именно он реализован в нжынксе - и подавно не знаю. Может, нжынксу нужны имена из сертификатов для всех хостов для успешной работы.

Я бы попробвал повесить какой-то дефолтный сертификат, а начинать задумываться о подробностях уже тогда, когда явной ругани в логах не будет.

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

Как бы вместо 404 получить что-то попонтовее в моём случае?

Только погоди... А если у меня будет завтра ещё один сертификат на одном ip..? Как тогда?

Не понял ни одного из вопросов. Ну добавишь еще один server{}. Ну допишешь ip в server_name.

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

Смотри:

Хочу по: https://xxx.company.ru получить защищеную страницу.

А по: https://ip - получить reject, ибо нефиг!

Как такое реализовать?

С http - у меня всё получилось с первого раза. А вот с https, не понимаю...

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

получить reject, ибо нефиг!

Т.е. у тебя сейчас по IP клиента не заводит в дефолтный сервер?
Или заводит, но ты убрал оттуда 444, а теперь сам негодуешь по этому поводу?)

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

Смотри.

Сейчас у меня по: https://xxx.company.ru получается защищеная страница.

А по: https://ip - получаю: Это соединение является недоверенным

Вы попросили Firefox установить защищённое соединение с <ip>, но мы не можем гарантировать, что это соединение является защищённым.

При том оно мне подставляет сертификат от: xxx.company.ru

Мне кажется это не есть хорошо... И на вход по ip, я хочу получить, что то другое. :)

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

Ну дык сгенери сертификат где имясервера = твойайпишник.
И подсовывай его в дефолтном сервер-блоке.
Или вообще в отдельный сервер-блок вынеси.

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

Мысль понял. Пошёл сюда:

http://www.selfsignedcertificate.com/

Сгенерил сертификаты для testportal.company.ru и для 192.168.xx.xx

Смотри что вышло:

Теперь, если придти по имени: https://xxx.company.ru - получаю своё валидное соединение.

Если придти по: https://testportal.company.ru - получаю предупреждение о самоподписном сертификате, и после его принятия - получаю что ожидал. - То есть всё ок!

Если придти по ip, https://192.168.xx.xx - Получаю:

192.168.xx.xx uses an invalid security certificate. The certificate is only valid for xxx.company.ru --- Где доменное имя, является именем валидного сертификата, и валидный сертификат мне предлагается в качестве сертификата для исключения...

server {
 listen 443 ssl;
 server_name 192.168.xx.xx;

 ssl on;
 ssl_certificate /etc/nginx/conf.d/31012139_192.168.xx.xx.cert;
 ssl_certificate_key /etc/nginx/conf.d/31012139_192.168.xx.xx.key;
}

Не понятно товарищ майор...

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

Спасибо тебе ОГРОМНОЕ за всяческую помощь. Решил свою проблему вот так:

Теперь после принятия самоподписного сертификата, получаю reject.

server {
 listen 443 default_server;
 server_name "" ;
 return 444;
 ssl on;
 ssl_certificate /etc/nginx/conf.d/31012139_192.168.xx.xx.cert;
 ssl_certificate_key /etc/nginx/conf.d/31012139_192.168.xx.xx.key;
}

Осталось не до конца понятным, почему оно ранее предлагало мой валидный сертификат при входе на ip, без явного указания на него...

Но в целом я свою проблему решил.

СПАСИБО!

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

Та не за што

Осталось не до конца понятным, почему оно ранее предлагало мой валидный сертификат при входе на ip, без явного указания на него...

Неприятно. Вроде ведь должно работать. Хотя фиг знает, я не копал работу SNI. Может, в таком случае вместо айпишника клиент посылает пустую строку в качестве имени вообще, и тогда срабатывает первый попавшийся сервер.

thesis ★★★★★
()
Ответ на: Та не за што от thesis

Может, в таком случае вместо айпишника клиент посылает пустую строку в качестве имени вообще, и тогда срабатывает первый попавшийся сервер.

Я тоже к этому варианту склоняюсь. В логах ничего подобного не нашёл правда. Надо или включать детализацию сильно, или ловить пакеты tcpdump - по идее должен отловить наверно. В общем ещё раз спасибо, за внимание к теме и время!

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

апач всегда по умолчанию использует первый по порядку парсинга виртуальный хост. нжинкс так же или у него есть специальный синтаксис для указания дефолтного.

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