Bagaimana cara mengatur beberapa subdomain dengan sertifikatnya sendiri menggunakan nginx?

8

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.

Wayne Werner
sumber
Bagaimana Anda menguji? Jika Anda menguji dengan openssl s_clientmemastikan untuk menambahkan -servername hostnameopsi sehingga klien benar-benar menggunakan SNI.
Steffen Ullrich
@SteffenUllrich Chrome adalah salah satu cara saya melakukannya. Hanya mencoba menggunakan openssl s_client -servername two.example.com -connect two.example.com:443dan memberi saya CN untuk one.example.com. Jika saya menukar yang mana yang memiliki server default maka saya mendapatkan hal-hal sebaliknya.
Wayne Werner
Dan untuk iseng dan senyum saya hanya mencampurnya: -servername one -connect twodan kemudian sebaliknya. Kedua openssl s_client dan chrome mengamati perilaku yang sama - satu-satunya karakteristik yang jelas adalah garis server default.
Wayne Werner
@SteffenUllrich akan terlihat bahwa sintaks IPv6 untuk mendengarkan melakukan sesuatu yang berbeda? Saya telah mengirim jawaban, tetapi jika itu memicu sesuatu untuk Anda, saya ingin tahu lebih banyak tentang alasannya
Wayne Werner
Ketika saya memiliki beberapa situs di server tunggal, saya lebih suka memiliki default_serverblok yang benar-benar terpisah yang tidak mengembalikan situs mana pun.
Tero Kilkanen

Jawaban:

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

Baris pertama memungkinkan mendengarkan pada port 443 pada IPv4. Baris kedua hanya mencakup IPv6. Karena Anda hanya memiliki satu listen 443konfigurasi (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:

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

Dan untuk server lainnya

  listen 443 ssl;
  listen [::]:443 ssl;
Steffen Ullrich
sumber
2

Tampaknya ada hubungannya dengan sintaks mendengarkan IPv6. Ketika saya berubah

listen [::]:443 ssl;

untuk

listen 443 ssl;

Lalu berhasil.

Saya tidak tahu mengapa ini dan akan menyambut jawaban lain dengan penjelasan lebih / lebih baik.

Wayne Werner
sumber
Jadi apakah Anda terhubung dengan IPv4 atau IPv6 ke server? Jika Anda terhubung dengan IPv4 maka jelas karena Anda hanya memiliki satu konfigurasi IPv4 - server default. Untuk membuat konfigurasi IPv6 juga mencakup IPv4, Anda perlu menambahkanipv6only=off;
Steffen Ullrich