最近对公司要求网站停止支持不安全的TLS1.0/TLS1.1协议,在网上搜索了一会,nginx中相关配置指令是ssl_protocols,但是我在自己负责的server中使用该指令却始终无法生效,于是摸索并记录了这个问题。
当前nginx中存在多个server
bash
http {
#01
server {...}
#02
server {...}
#myserver
server {...}
}
我在myserver中配置了ssl_protocols却始终无法生效,于是查询了nginx的文档
nginx文档中对ssl_protocols指令的描述:
If the directive is specified on the [server] level, the value from the default server can be used.
简单来说,如果在server块中使用ssl_protocols ,那么该指令会直接使用默认服务器的值(即使默认服务没有显式指定一个值),而非当前server块中指定的值 。 而nginx未使用default_server 指定默认服务器时,会将第一个server 作为默认服务器。 故只需要在第一个server块或者default_server块中,使用ssl_protocols即可
也可以直接在http块中指定:
ini
http {
#...
# 指定支持的 SSL/TLS 协议版本
ssl_protocols TLSv1.2;
#...
}
需要注意的是,如果在default_server中或者第一个server块中指定了ssl_protocols,那么会覆盖http中指定的ssl_protocols设置。
下面是显式指定默认服务器的配置
ini
server {
listen 443 ssl default_server;
server_name _;
#...
ssl on;
ssl_certificate /usr/local/nginx/conf/vhosts/certs/your.domain.pem;
ssl_certificate_key /usr/local/nginx/conf/vhosts/certs/your.domain.key;
# 指定支持的 SSL/TLS 协议版本
ssl_protocols TLSv1.2;
#...
return 403;
}