面试题答案
一键面试可能原因
- TLS 版本不兼容:旧版本浏览器仅支持较低版本的 TLS 协议(如 TLS 1.0 或 TLS 1.1),而新配置的 Nginx 仅启用了最新的 TLS 版本(如 TLS 1.3),导致旧浏览器无法建立连接。
- 密码套件不兼容:新配置的 Nginx 使用了旧浏览器不支持的密码套件。不同版本的浏览器对密码套件的支持情况不同,若配置的密码套件过新,旧浏览器无法协商出共同支持的套件,进而无法建立安全连接。
兼容方法
- 启用多个 TLS 版本:在 Nginx 配置文件中,除了启用最新的 TLS 版本(如 TLS 1.3),同时启用旧版本浏览器可能支持的 TLS 版本,例如 TLS 1.1 和 TLS 1.2。
server {
listen 443 ssl;
server_name your_domain.com;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# 其他 SSL 相关配置...
}
- 选择兼容的密码套件:查看旧浏览器支持的密码套件列表,在 Nginx 配置中指定一组较为通用、兼容新旧浏览器的密码套件。可以使用 OpenSSL 的
ciphers
指令来设置,例如:
ssl_ciphers HIGH:!aNULL:!MD5;
这个配置选择了高强度的密码套件,并排除了不安全的 aNULL
和 MD5
套件。不同的浏览器和操作系统对密码套件的支持有所差异,可以根据实际需要调整。
3. 用户代理检测:通过检测用户代理字符串,针对不同的浏览器版本提供不同的 TLS 配置。例如,可以使用 if
指令在 Nginx 配置中进行判断:
map $http_user_agent $tls_config {
~*"OldBrowser" "old_tls_config";
default "new_tls_config";
}
server {
listen 443 ssl;
server_name your_domain.com;
if ($tls_config = "old_tls_config") {
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers LOW:!aNULL:!MD5;
}
if ($tls_config = "new_tls_config") {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
# 其他 SSL 相关配置...
}
这种方法通过 map
指令根据用户代理字符串设置变量 $tls_config
,然后在 if
块中针对不同的配置情况设置不同的 TLS 协议版本和密码套件。但需要注意,用户代理字符串可能被伪造,这种方法并非绝对可靠。