Vários vhosts SSL usando certificado curinga no nginx

14

Eu tenho dois nomes de host que compartilham o mesmo nome de domínio que desejo exibir através de HTTPs. Eu tenho um certificado SSL curinga e criei duas configurações de vhost:

Host A

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;

Anfitrião B

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;

No entanto, eu recebo o mesmo vhost servido para qualquer nome de host.

vincent.io
fonte

Respostas:

17

Você precisa separar os vhosts da parte de escuta / configuração do ssl:

Parte de escuta:

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;
}

E agora fantasmas:

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
fonte
Isso não funcionaria. Um vhost precisa ssl_certificatee ssl_certificate_keydeve ser configurado dentro serverou httplocal. No seu exemplo, você o declarou dentro do primeiro serverlocal, mas não o declarou para os outros dois vhosts.
Pothi Kalimuthu 27/10/2013
2
é o suficiente para configurar ssl_certificate, ssl_certificate_keye sslem DEFAULT_SERVER somente. BTW, esta configuração realmente funciona.
Treadin
Infelizmente, isso não funciona: o nginx serve o mesmo conteúdo de vhost nos dois hosts.
Vincent.io 28/10
2
Aparentemente, você precisa reiniciar o nginx em vez de recarregá- lo ao fazer essas alterações. Muito obrigado, a sua resposta funciona como um encanto :)
vincent.io
1
Obrigado por isso, eu precisava sslda listendiretiva para que isso funcionasse com um nginx 1.4.x. Minhas listendiretrizes sobre os fantasmas também tinham que ser literalmente iguais (a equivalência lógica não era suficiente).
19414 Dave S.
13

Na verdade, é explicado no manual: 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;
}

Agora, se você tiver muitos sites, sugiro armazenar todos eles em uma pasta com apenas a parte do servidor {}, como acima, em arquivos únicos, e uma diretiva de inclusão no arquivo principal para carregar todos eles:

ssl_certificate /etc/ssl/wildcard.cer;
ssl_certificate_key /etc/ssl/wildcard.key;
include /etc/nginx/conf.d/subfolder/*;
Cara velho
fonte