Несколько SSL vhosts с использованием подстановочного сертификата в nginx

14

У меня есть два имени хоста с одним и тем же доменным именем, которое я хочу обслуживать по HTTP. Я получил сертификат SSL с подстановочным знаком и создал две конфигурации vhost:

Хост А

listen      127.0.0.1:443 ssl;
server_name     a.example.com;
root        /data/httpd/a.example.com;
ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;

Хост Б

listen      127.0.0.1:443 ssl;
server_name     b.example.com;
root        /data/httpd/b.example.com;
ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;

Тем не менее, я получаю один и тот же vhost для любого имени хоста.

vincent.io
источник

Ответы:

17

Вам нужно разделить vhosts из части прослушивания / настройки ssl:

Слушающая часть:

server {
  listen              127.0.0.1:443 default_server ssl;
  server_name         _;
  ssl_certificate     /etc/ssl/wildcard.cer;
  ssl_certificate_key /etc/ssl/wildcard.key;
}

А теперь вхосты

server {
  listen      127.0.0.1:443;
  server_name a.example.com;
  root        /data/httpd/a.example.com;
}

server {
  listen      127.0.0.1:443;
  server_name b.example.com;
  root        /data/httpd/b.example.com;
}
Teftin
источник
Это не сработает. Нужен Vhost, ssl_certificateи ssl_certificate_keyэто должно быть настроено внутри serverили в httpместе. В вашем примере вы объявили его внутри первого serverместоположения, но не объявили его для двух других vhosts.
Поти Калимуту
2
этого достаточно , чтобы Configure ssl_certificate, ssl_certificate_keyи sslна default_server только. Кстати, этот конфиг на самом деле работает.
Тефтин
К сожалению, это не работает: nginx обслуживает одинаковое содержимое vhost на обоих хостах.
vincent.io
2
Очевидно, вам нужно перезапустить nginx вместо того, чтобы перезагружать его при выполнении этих изменений. Большое спасибо, ваш ответ работает как очарование :)
vincent.io
1
Спасибо за это, мне нужна sslбыла listenдиректива для работы с 1.4.x nginx. Мои listenдирективы в стихах также должны были быть буквально одинаковыми (логической эквивалентности было недостаточно).
Дейв С.
13

Это на самом деле объясняется в руководстве: http://nginx.org/en/docs/http/configuring_https_servers.html#certificate_with_several_names

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
server {
  listen      443 ssl;
  server_name a.example.com;
  root        /data/httpd/a.example.com;
}
server {
  listen      443 ssl;
  server_name b.example.com;
  root        /data/httpd/b.example.com;
}

Теперь, если у вас много сайтов, я предлагаю хранить все из них в папке с частью server {}, как указано выше, в отдельных файлах и директивой include в главном файле для загрузки всех из них:

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
include /etc/nginx/conf.d/subfolder/*;
BxlSofty
источник