站点图标 谷姐靓号网

【小教程】nginx 默认拒绝发送证书设置教程-iks

Rate this post

在 nginx 未指定其 SSL 连接监听端口的 default_server 时,nginx 会默认发送第一张 SSL 证书给客户端——即使客户端给的 SNI 为空或不属于本机任何一个配置了的 server_name,这会导致因证书被扫描器探知而导致某种意义上的信息泄露。
在 nginx 1.19.4 及 OpenSSL 1.1.1i 之前的解决方案一般是在 default_server 里指定一个自签的证书,但这样不够美观(个人的 OCD 症状)。好消息是,现在 nginx 可以直接在 server 块内设置 ssl_reject_handshake,即终止 SSL 握手阶段,避免证书的发送。
以下是 nginx server 区块的设置,【要求 nginx 版本 1.19.4 以上、(编译进 nginx 的)OpenSSL 版本 1.1.1i 以上,具体请执行 nginx -V 查看 nginx version 和 built with OpenSSL 的值】

    server
    {
    listen 443 ssl http2 default_server;
    server_name _;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_reject_handshake on; //启用拒绝 TLS 握手
    ssl_session_cache shared:SSL:10m; //这个必须设置,不指定 ssl_session_cache 的话,会导致 Session resumption (caching) 验证失败
    ssl_session_timeout 10m;

    access_log/www/wwwlogs/access.log;
    }

不用指定证书。改完保存然后重启 nginx 即可,效果如下:

    root@debian:~# curl -v https://36.27.222.72
    * Expire in 0 ms for 6 (transfer 0x5617b4965fb0)
    * Trying 36.27.222.72...
    * TCP_NODELAY set
    * Expire in 200 ms for 4 (transfer 0x5617b4965fb0)
    * Connected to 36.27.222.72 (36.27.222.72) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    * CAfile: none
    CApath: /etc/ssl/certs
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * TLSv1.3 (IN), TLS alert, unrecognized name (624):
    * error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
    * Closing connection 0
    curl: (35) error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name

(ip 事假的,不用测)
可以看到,当客户端试图使用 https 方式访问此机器上不存在的 host 时,TLS 握手失败,返回值默认已经没有证书。

这样配置省了点时间(签自签证书的时间),要说更大的意义的话,就是在不考虑 no SNI 下的合规吧。

鸣谢
t.me/lalalaji

热议
推荐楼 jqbaobao 昨天22:49

自签个假证书完事

2楼 walterclozet 昨天22:49

看不懂

4楼 燕十三丶 昨天22:50

mark 技术教程要顶

5楼 oilbit 昨天22:53

能解释下这个的深层次的意义吗
我们平时不是默认直接http 走80吗

6楼 hostloc8888 昨天22:54

自签个假证书完事

有毒吧你,楼主又不是没介绍自签证书

7楼 iks 昨天22:55

能解释下这个的深层次的意义吗
我们平时不是默认直接http 走80吗

主题帖第一行

8楼 可乐呀 昨天22:55

这个不错,不用在自签个证书了

9楼 h20 昨天22:55

庸人自扰也

10楼 tiga 昨天22:59

nginx-1.20.0 stable version 发布就用上了。

12楼 iks 昨天23:03

我用的是gov.cn的自签证书

巧了,主题里的 36.27.222.72 就是 www.gov.cn 的节点

13楼 pathc 昨天23:06

要是能像某类软件一样,sni不正确直接拒绝就好了,这样仍然能知道该端口提供TLS协议

14楼 iks 昨天23:08

要是能像某类软件一样,sni不正确直接拒绝就好了,这样仍然能知道该端口提供TLS协议 ...

巧了,与其功能一致。
Unknown SNI 过去,直接返回 unrecognized name

15楼 风铃 昨天23:13

感谢分享 , 很有用的, 防止别人通过IP打开网站

16楼 CFCF 昨天23:15

感谢楼主,已经配置了

17楼 SKIDROW 昨天23:22

签的IP证书,无所谓

18楼 栗山未来 昨天23:25

mark 支持一下。明天试试

19楼 pathc 昨天23:29

巧了,与其功能一致。
Unknown SNI 过去,直接返回 unrecognized name

我的意思是直接终止连接;返回 unrecognized name 不就说明 TLS 协议存在嘛

20楼 xqdoo00o 9小时前

如果只指定tls1.3的话,需要openssl1.1.1j以上

22楼 惜为伊人醉 9小时前

支持技术贴!!!

23楼 yanzhiling2001 9小时前

之前的做法是自签个假ip证书,后来用上了环志中城的免费ip证书。

24楼 Cloudhost 7小时前

好用,我就说怎么去网站上查ip还能知道放了那些网站,原来就是证书泄露的

申明:本文内容由网友收集分享,仅供学习参考使用。如文中内容侵犯到您的利益,请在文章下方留言,本站会第一时间进行处理。

退出移动版