À moins que chaque réponse que j'ai lue ne soit tout à fait fausse, SNI devrait permettre de faire ce que je veux, mais chaque guide me dit de faire exactement ce que je fais.
Et pourtant, nginx sert le mauvais certificat, donc je fais clairement quelque chose de mal.
❯ 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
Voici à quoi ressemblent mes configurations:
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;
}
Si j'ai la listen 443 ssl default_server;
directive dans l'un ou l'autre des serveurs, elle renverra le certificat SSL pour ce serveur pour les DEUX domaines. Si je le supprime des deux domaines, je ne reçois rien du tout - les deux domaines de serveur refusent les connexions.
Qu'est-ce que je vais mal ici? Est-ce que je ne comprends tout simplement pas comment fonctionne SNI? Mon nginx a été construit avec le support SNI activé. Et pourtant ... je ne reçois le certificat SSL que pour un sous-domaine.
openssl s_client -servername two.example.com -connect two.example.com:443
et cela me donne le CN pour one.example.com
. Si j'échange lequel a le serveur par défaut, j'obtiens les choses dans l'autre sens.
-servername one -connect two
et vice versa. Openssl s_client et chrome observent le même comportement - la seule caractéristique de définition apparente est la ligne de serveur par défaut.
default_server
bloc complètement séparé qui ne renvoie aucun des sites.
openssl s_client
assurez-vous d'ajouter l'-servername hostname
option pour que le client utilise réellement SNI.