Kecuali jika setiap jawaban yang saya baca salah, SNI seharusnya memungkinkan untuk melakukan apa yang saya inginkan, namun setiap panduan memberi tahu saya untuk melakukan apa yang saya lakukan.
Namun nginx melayani sertifikat yang salah jadi saya jelas melakukan sesuatu yang salah.
❯ 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
Seperti apa konfigurasi saya:
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;
}
Jika saya memiliki listen 443 ssl default_server;
arahan di kedua server itu akan mengembalikan sertifikat SSL untuk server itu untuk KEDUA domain. Jika saya menghapusnya dari kedua domain maka saya tidak mendapatkan apa-apa - kedua domain server menolak koneksi.
Apa yang salah di sini? Apakah saya tidak mengerti cara kerja SNI? Nginx saya telah dibangun dengan dukungan SNI diaktifkan. Namun ... Saya hanya mendapatkan sertifikat ssl untuk satu subdomain.
openssl s_client
memastikan untuk menambahkan-servername hostname
opsi sehingga klien benar-benar menggunakan SNI.openssl s_client -servername two.example.com -connect two.example.com:443
dan memberi saya CN untukone.example.com
. Jika saya menukar yang mana yang memiliki server default maka saya mendapatkan hal-hal sebaliknya.-servername one -connect two
dan kemudian sebaliknya. Kedua openssl s_client dan chrome mengamati perilaku yang sama - satu-satunya karakteristik yang jelas adalah garis server default.default_server
blok yang benar-benar terpisah yang tidak mengembalikan situs mana pun.Jawaban:
Baris pertama memungkinkan mendengarkan pada port 443 pada IPv4. Baris kedua hanya mencakup IPv6. Karena Anda hanya memiliki satu
listen 443
konfigurasi (IPv4), konfigurasi inilah yang digunakan jika Anda terhubung dengan IPv4. Jika Anda akan mencoba untuk terhubung dengan IPv6, sebaliknya SNI harus menunjukkan perilaku yang diharapkan.Sebaliknya, Anda mungkin menggunakan untuk server default:
Dan untuk server lainnya
sumber
Tampaknya ada hubungannya dengan sintaks mendengarkan IPv6. Ketika saya berubah
untuk
Lalu berhasil.
Saya tidak tahu mengapa ini dan akan menyambut jawaban lain dengan penjelasan lebih / lebih baik.
sumber
ipv6only=off;