在 location{} 块中指定 nginx 的 ssl_certificate

在 location{} 块中指定 nginx 的 ssl_certificate

对于 Web 服务,我们有两个证书:myservice.com 和 api.myservice.com。两者都有相同的应用程序(文档根目录),但使用不同的证书通过 HTTPS 提供服务。不幸的是,我们目前没有双域证书。

目前,我必须定义两个服务器块,每个服务器块指向同一个根。仅有的区别在于ssl_certificate指令,但只能在http 或服务器级别

然而,有没有办法避免在服务器块中复制/粘贴?这是一个示例代码:

server {
    listen      443;
    server_name .myservice.com;
    root        /var/www/myservice.com/public;

    include conf.d/common.conf.inc;

    ssl                 on;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
    ssl_session_cache   shared:SSL:5m;
    ssl_session_timeout 10m;
    ssl_certificate     /path/to/myservice.com.bundle.crt;
    ssl_certificate_key /path/to//myservice.com.key;

    ssl_prefer_server_ciphers on;
}

server {
    listen      443;
    server_name api.myservice.com;
    root        /var/www/myservice.com/public;

    include conf.d/common.conf.inc;

    ssl                 on;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
    ssl_session_cache   shared:SSL:5m;
    ssl_session_timeout 10m;
    ssl_certificate     /path/to/api.myservice.com.bundle.crt;
    ssl_certificate_key /path/to//myservice.com.key;

    ssl_prefer_server_ciphers on;
}

/编辑:根据要求,这里是输出nginx -V

nginx 版本:nginx/1.2.7

TLS SNI 支持已启用配置

参数:--prefix=/usr/share/nginx--conf-path=/etc/nginx/nginx.conf--error-log-path=/var/log/nginx/error.log--http-client-body-temp-path=/var/lib/nginx/body--http-fastcgi-temp-path=/var/lib/nginx/fastcgi--http-log-path=/var/log/nginx/access.log--http-proxy-temp-path=/var/lib/nginx/proxy--http-scgi-temp-path=/var/lib/nginx/scgi--http-uwsgi-temp-path=/var/lib/nginx/uwsgi--lock-path=/var/lock/nginx.lock--pid-path=/run/nginx.pid--with-pcre-jit--with-debug--with-http_addition_module--with-http_dav_module--with-http_flv_module --带有-http_geoip_module --带有-http_gzip_static_module --带有-http_image_filter_module --带有-http_mp4_module --带有-http_perl_module --带有-http_random_index_module --带有-http_realip_module --带有-http_secure_link_module --带有-http_stub_status_module --带有-http_ssl_module --带有-http_sub_module --带有-http_xslt_module --带有-ipv6 --带有-sha1=/usr/include/openssl --带有-md5=/usr/include/openssl --带有-mail --带有-mail_ssl_module --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-auth-pam --add-module=/build/buildd/nginx-1.2.7/debian/modules/chunkin-nginx-module --add-module=/build/buildd/nginx-1.2.7/debian/modules/headers-more-nginx-module --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-development-kit --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-echo --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-http-push --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-lua --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-upload-module --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-upload-progress --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-upstream-fair --add-module=/build/buildd/nginx-1.2.7/debian/modules/nginx-dav-ext-module

答案1

您已经知道(并且正在使用)答案!只是include来自单独文件的通用部分。

答案2

您可以通过使用“if”执行类似这样的操作来避免重复虚拟主机并定义一个虚拟主机:

服务器 {
    听 443;
    服务器名称 .myservice.com api.myservice.com;
    根/var/www/myservice.com/public;

    包括conf.d/common.conf.inc;

    ssl 开启;
    ssl_协议 TLSv1 TLSv1.1 TLSv1.2;
    ssl_密码ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
    ssl_session_cache共享:SSL:5米;
    ssl_会话_超时10分钟;
    ssl_prefer_server_ciphers开启;

  如果 ($server_name = .myservice.com) {
    ssl_certificate /path/to/myservice.com.bundle.crt;
    ssl_certificate_key /路径/到//myservice.com.key;
  }
  如果 ($server_name = api.myservice.com) {
    ssl_certificate /path/to/api.myservice.com.bundle.crt;
    ssl_certificate_key /path/to//myservice.com.key;;
  }
  ...
}

相关内容