Trừ khi mọi câu trả lời tôi đọc đều sai, SNI nên làm cho tôi có thể làm những gì tôi muốn, nhưng mọi hướng dẫn đều bảo tôi làm chính xác những gì tôi đang làm.
Nhưng nginx đang phục vụ chứng chỉ sai nên rõ ràng tôi đang làm gì đó sai.
❯ 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
Đây là cấu hình của tôi trông như thế nào:
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;
}
Nếu tôi có lệnh listen 443 ssl default_server;
trong một trong hai máy chủ, nó sẽ trả về chứng chỉ SSL cho máy chủ đó cho cả hai miền. Nếu tôi xóa nó khỏi cả hai miền thì tôi chẳng nhận được gì cả - cả hai miền máy chủ đều từ chối kết nối.
Tôi đã làm gì sai ở đây? Tôi chỉ không hiểu làm thế nào SNI hoạt động? Nginx của tôi đã được xây dựng với hỗ trợ SNI được kích hoạt. Tuy nhiên ... tôi chỉ nhận được chứng chỉ ssl được phục vụ cho một tên miền phụ.
openssl s_client -servername two.example.com -connect two.example.com:443
và nó mang lại cho tôi CN one.example.com
. Nếu tôi trao đổi cái nào có máy chủ mặc định thì tôi sẽ hiểu mọi thứ theo cách khác.
-servername one -connect two
và ngược lại. Cả openssl s_client và chrome đều quan sát cùng một hành vi - đặc điểm xác định rõ ràng duy nhất là dòng máy chủ mặc định.
default_server
khối hoàn toàn riêng biệt mà không trả về một trong hai trang web.
openssl s_client
chắc chắn sẽ thêm-servername hostname
tùy chọn để máy khách thực sự sử dụng SNI.