Làm cách nào để thiết lập nhiều tên miền phụ với chứng chỉ của riêng họ bằng nginx?


8

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ụ.


Làm thế nào để bạn kiểm tra? Nếu bạn kiểm tra openssl s_clientchắc chắn sẽ thêm -servername hostnametùy chọn để máy khách thực sự sử dụng SNI.
Steffen Ullrich

@SteffenUllrich Chrome là một cách tôi đã làm. Chỉ cần thử sử dụng openssl s_client -servername two.example.com -connect two.example.com:443và 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.
Wayne Werner

Và đối với những cú đá và nụ cười tôi chỉ cần trộn nó lên: -servername one -connect twovà 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.
Wayne Werner

@SteffenUllrich có vẻ như cú pháp IPv6 để nghe có gì khác không? Tôi đã đăng câu trả lời, nhưng nếu điều đó kích hoạt điều gì đó cho bạn, tôi muốn biết thêm về lý do
Wayne Werner

Khi tôi có nhiều trang web trên một máy chủ, tôi muốn có một default_serverkhối hoàn toàn riêng biệt mà không trả về một trong hai trang web.
Tero Kilkanen

Câu trả lời:


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

Dòng đầu tiên cho phép nghe trên cổng 443 trên IPv4. Dòng thứ hai chỉ bao gồm IPv6. Vì bạn chỉ có một listen 443cấu hình (IPv4), nên nó là cấu hình được sử dụng nếu bạn kết nối với IPv4. Nếu bạn cố gắng kết nối với IPv6 thay vì SNI sẽ hiển thị hành vi dự kiến.

Thay vào đó, bạn có thể sử dụng cho máy chủ mặc định:

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

Và cho các máy chủ khác

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

2

Nó rõ ràng có liên quan đến cú pháp nghe IPv6. Khi tôi thay đổi

listen [::]:443 ssl;

đến

listen 443 ssl;

Sau đó, nó hoạt động.

Tôi không biết tại sao lại như vậy và sẽ hoan nghênh những câu trả lời khác với nhiều lời giải thích hơn / tốt hơn.


Vậy bạn đã kết nối với IPv4 hoặc IPv6 với máy chủ chưa? Nếu bạn đã kết nối với IPv4 thì rõ ràng vì bạn chỉ có một cấu hình IPv4 - máy chủ mặc định. Để làm cho cấu hình IPv6 cũng bao gồm IPv4, bạn cần thêmipv6only=off;
Steffen Ullrich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.