nginx 可以在不同的服务器块中使用不同的 SSL 协议吗?

Sco*_*lme 7 ssl nginx protocol

我正在尝试设置一个主机名来演示糟糕的 SSL 配置,但我遇到了一些问题。我可以指定一些不好的密码套件,但 nginx 似乎忽略了协议选择。

server {
    listen 443 spdy ssl;
    keepalive_timeout 70;
    server_name example.co.uk;
    client_max_body_size 10M;

    ssl_certificate /path/to/ssl.crt;
    ssl_certificate_key /path/to/ssl.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ...
}

server {
    listen 443 spdy ssl;
    keepalive_timeout 70;
    server_name weak.example.co.uk;
    client_max_body_size 10M;

    ssl_certificate /path/to/weakssl.crt;
    ssl_certificate_key /path/to/weakssl.key;
    ssl_protocols SSLv3;
    ...
}
Run Code Online (Sandbox Code Playgroud)

Nginx 可以使用我指定的不同密码套件,但似乎全面使用第一个服务器块中的协议,因此weak.example.co.uk 具有 TLSv1/1.1/1.2 并且不支持 SSLv3。

是否可以为每个服务器块指定不同的协议?

Ber*_*set 2

  1. 检查您的配置是否经过静态验证nginx -t
  2. main通过在发出重新加载时监视级别定义的错误日志来检查您的配置是否已动态验证(service nginx reloadkill -SIGHUP <nginx master PID>
  3. 在每个服务器中创建一个测试位置(见下文)
  4. 确保您的 nginx 是使用 SNI 扩展构建的(如果您使用预构建的包,通常是的)
  5. 确保使用正确的服务器:如果通过 SNI 选择域名失败或 SNI 不可用,nginx 将回退到默认服务器来提供内容。除非另有明确指定,否则默认服务器是配置文件中找到的第一个服务器。
  6. 确保浏览器缓存被清理(并且服务器和浏览器之间的任何缓存都被更新/被清除)

如果提供了错误的证书(没有 SNI 或错误的服务器选择),您通常会收到证书警告,因为请求的域名与证书设置的域名不匹配。

这将显示当前连接正在使用的协议:

location /SSLProtocol {
    return 200 $ssl_protocol;
}
Run Code Online (Sandbox Code Playgroud)