如何开启Nginx服务器名称指示扩展?

Nginx

1 前言

笔者需要内网需要使用反向代理获取docker的源,详细的配置如下,

cat /etc/nginx/conf.d/docker.cmdschool.org.conf

可见如下配置,

proxy_cache_path /cache/docker.cmdschool.org levels=2:2:2  keys_zone=docker.cmdschool.org:10m
                 inactive=30d  max_size=1g;
server {
    listen 80;
    server_name docker.cmdschool.org;

    location / {
        proxy_pass             https://download.docker.com;
        #proxy_set_header       Host download.docker.com;
        proxy_cache            docker.cmdschool.org;
        proxy_cache_valid      200  1d;
        proxy_cache_use_stale  error timeout invalid_header updating
                                   http_500 http_502 http_503 http_504;
    }
}

配置完成后,笔者通过查看如下日志,

tail -f /var/log/nginx/error.log

可见如下错误,

2019/09/21 14:06:26 [error] 31149#31149: *15 SSL_do_handshake() failed (SSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure) while SSL handshaking to upstream, client: 10.168.0.165, server: docker.cmdschool.org, request: "GET / HTTP/1.1", upstream: "https://13.225.103.65:443/", host: "docker.cmdschool.org"
2019/09/21 14:06:26 [warn] 31149#31149: *15 upstream server temporarily disabled while SSL handshaking to upstream, client: 192.168.0.165, server: docker.cmdschool.org, request: "GET / HTTP/1.1", upstream: "https://13.225.103.65:443/", host: "docker.cmdschool.org"

2 基础知识

2.1 什么服务器名称指示扩展

– 服务器名称指示扩展,英文缩写为SNI
– 服务器名称指示扩展是传输层安全(TLS)计算机网络协议的扩展
– 服务器名称指示扩展是客户端可以通过该协议在握手过程开始时指示其尝试连接的主机名

2.2 服务器名称指示扩展的作用

– 服务器名称指示(SNI)允许服务器在同一IP地址和TCP端口号上使用多个证书

2.3 TLS的请求原理

– 客户端向Web服务器发起TLS链接请求
– 服务器向客户端返回证书
– 客户端检查证书后,将尝试将连接名称和证书中包含的名称进行对比
– 如果匹配成功,则连接继续,否则将发出警告用户并可能终止链接

2.4 服务器名称指示扩展的需求背景

– 早起由于没有虚拟主机概念,同一IP地址的同一服务器使用多个DNS名称遇到困难
– 虚拟机概念出现后,服务器将客户端请求的域名作为协议的一部分
– 服务器根据请求的域名选择出与域名匹配的证书返回给客户端,从而解决了此问题

2.5 Nginx的服务器名称指示扩展

Nginx通过以上参数开启或关闭服务器名称指示扩展(默认为关闭),

proxy_ssl_server_name on | off;

详细请参阅以下链接,
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name
所以,我们需要开启服务器名称指示扩展支持。

3 最佳实践

3.1 修改配置

vim /etc/nginx/conf.d/docker.cmdschool.org.conf

加入如下配置,

[...]
    location / {
    [...]
        proxy_ssl_server_name on;
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    }
[...]

3.2 重启服务使配置生效

/etc/init.d/nginx restart

参阅文档
==============================

官方文档
———-
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name
https://en.wikipedia.org/wiki/Server_Name_Indication

非官方文档
———–
https://cloud.tencent.com/developer/ask/46573/answer/73813
http://api-gateway-tips.blogspot.com/2016/01/amazon-api-gateway-behind-nginx.html

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何安装部署RHEL 9 Nignx?

1 前言 一个问题,一篇文章,一出故事。 笔者需要基于RHEL 9部署Nginx环境,于是整理此文。 …