Come posso configurare più sottodomini con il loro certificato usando nginx?


8

A meno che ogni risposta che ho letto fosse chiaramente sbagliata, SNI dovrebbe rendere possibile fare quello che voglio, eppure ogni guida mi dice di fare esattamente quello che sto facendo.

Eppure nginx sta fornendo il certificato sbagliato, quindi sto chiaramente facendo qualcosa di sbagliato.

❯ sudo nginx -V | grep SNI                                                                                                                                                                                                                                                            %1
nginx version: nginx/1.10.3
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-qJwWoo/nginx-1.10.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/ngi
nx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fa
stcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_reques
t_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --wit
h-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-qJwWoo/nginx-1.10.3/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-qJwWoo/nginx-1.10.3/debian/modules/nginx-dav-
ext-module --add-dynamic-module=/build/nginx-qJwWoo/nginx-1.10.3/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-qJwWoo/nginx-1.10.3/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-qJwWoo/nginx-1.10.3/debian/modules/ngx_http_substitutions_filter_m
odule

Ecco come sono le mie configurazioni:

server {
  listen 443 ssl default_server;
  listen [::]:443 ssl;

  server_name one.example.com;

  ssl on;
  ssl_certificate       /etc/letsencrypt/live/one.example.com/fullchain.pem;
  ssl_certificate_key   /etc/letsencrypt/live/one.example.com/privkey.pem;

  index index.html;
  root /var/www/one.example.com/site;
}

server {
  #listen 443 ssl default_server;
  listen [::]:443 ssl;

  server_name two.example.com;

  ssl on;
  ssl_certificate       /etc/letsencrypt/live/two.example.com/fullchain.pem;
  ssl_certificate_key   /etc/letsencrypt/live/two.example.com/privkey.pem;

  index index.html;
  root /var/www/two.example.com/site;
}

Se ho la listen 443 ssl default_server;direttiva in entrambi i server, verrà restituito il certificato SSL per quel server per ENTRAMBI i domini. Se lo rimuovo da entrambi i domini, non ottengo proprio nulla: entrambi i domini del server rifiutano le connessioni.

Cosa ho sbagliato qui? Non capisco come funziona SNI? My nginx è stato creato con il supporto SNI abilitato. Eppure ... ricevo solo il servizio SSL per un sottodominio.


Come si esegue il test? Se si esegue il test con openssl s_clientassicurarsi di aggiungere l' -servername hostnameopzione in modo che il client utilizzi effettivamente SNI.
Steffen Ullrich,

@SteffenUllrich Chrome è un modo in cui l'ho fatto. Ho appena provato a usare openssl s_client -servername two.example.com -connect two.example.com:443e mi dà il CN per one.example.com. Se cambio quale ha il server predefinito, ottengo le cose al contrario.
Wayne Werner,

E per calci e sorrisi l'ho appena confuso: -servername one -connect twoe poi viceversa. Sia openssl s_client che chrome osservano lo stesso comportamento: l'unica caratteristica apparente che definisce è la linea del server predefinita.
Wayne Werner,

@SteffenUllrich sembrerebbe che la sintassi IPv6 per l'ascolto faccia qualcosa di diverso? Ho pubblicato una risposta, ma se questo fa scattare qualcosa per te, mi piacerebbe sapere di più sul perché
Wayne Werner,

Quando ho più siti su un singolo server, preferisco avere un default_serverblocco completamente separato che non restituisce nessuno dei due siti.
Tero Kilkanen,

Risposte:


11
listen 443 ssl default_server;
listen [::]:443 ssl;

La prima riga consente l'ascolto sulla porta 443 su IPv4. La seconda riga riguarda solo IPv6. Dato che hai una sola listen 443configurazione (IPv4), è quella che viene utilizzata se ti connetti con IPv4. Se si tenta di connettersi con IPv6, invece SNI dovrebbe mostrare il comportamento previsto.

Invece potresti probabilmente usare il server predefinito:

  listen 443 ssl default_server;
  listen [::]:443 ssl default_server;

E per l'altro server

  listen 443 ssl;
  listen [::]:443 ssl;

2

Apparentemente ha qualcosa a che fare con la sintassi di ascolto IPv6. Quando cambio

listen [::]:443 ssl;

per

listen 443 ssl;

Quindi funziona.

Non so perché questo sia e gradirei altre risposte con spiegazioni più / migliori.


Quindi ti sei connesso con IPv4 o IPv6 al server? Se ti sei connesso a IPv4, è chiaro perché avevi solo una configurazione IPv4: il server predefinito. Per fare in modo che la configurazione IPv6 copra anche IPv4 è necessario aggiungereipv6only=off;
Steffen Ullrich,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.