如何让nginx记录使用的SSL / TLS协议和密码套件?


24

我的目标是为连接到我的nginx的客户端确保适当的安全性。我正在遵循Mozilla的指南来在我的nginx安装上正确配置TLS,但是我没有概述实际使用的实际协议/密码套件。

我现在所拥有的:

server {
    listen 443;
    ssl on;
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_dhparam /path/to/dhparam.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'the_long_ciphersuite_listed_there';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;
}

这样,我想记录使用哪种SSL协议进行连接以及在客户端/服务器协商后选择了哪种密码套件。例如:

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] "GET / HTTP/1.1" 200 1234 "-" "User agent bla"

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 "GET / HTTP/1.1" 200 1234 "-" "User agent bla"

这样,我可以快速识别使用不支持PFS或其他相关安全性启用技术的过时浏览器或自动化计算机的客户端。

如何配置nginx记录此信息?

Answers:


43

添加$ssl_cipher到您的log_format配置。

有关所有与SSL相关的变量,请参见http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables

log_formathttp上下文中定义一个自定义(例如/etc/nginx/nginx.conf):

log_format combined_ssl '$remote_addr - $remote_user [$time_local] '
                        '$ssl_protocol/$ssl_cipher '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';

上面的内容基于默认combined格式,并附加了'$ssl_protocol/$ssl_cipher '一行。

然后在server上下文(启用SSL)中添加access_log具有自定义日志格式的指令:

server {
  listen 443;
  ssl on;
  access_log /var/log/nginx/access.log combined_ssl;
  [...]
}

重新启动nginx之后,日志显示如下:

10.1.2.3 - - [13/Aug/2014:12:34:56 +0200] TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 "GET / HTTP/1.1" 200 1234 "-" "User agent bla"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.