一次 https 证书引起的 nginx 400 bad request 分析

博客分析了一次因HTTPS证书问题导致nginx返回400 Bad Request的情况。问题源于服务器在建立连接时发送了错误的证书,与请求的域名不符。通过对网络流量的分析,发现nginx的配置导致了这个问题。此外,还探讨了部分Android设备由于不支持SNI导致的访问差异,并提供了临时解决方案和相关参考资料。
摘要由CSDN通过智能技术生成

1. 问题描述

在一台Server上部署有一个https的service(这个service用于为Android Client提供服务),之前一直正常,从某一天开始突然不能正常访问,有的机型一直在nginx中报 400 bad request, 有的则正常访问.
两个问题:
Question 1: 为什么一部分机型突然不正常了?
Question 2: 为什么是一部分机型正常,一部分机型不正常?

2. 环境描述

本台Server上部署了两套完全不相关的Service,都是使用https, 两套的证书完全不一样,并且不是同一个CA签发的,
上述出错的service是a.com下的service

server {
    listen 443
    server_name a.com
    ssl on
    ssl_certificate a.com.crt;
    ssl_certificate_key a.com.key;
    ...
}

server {
    listen 443
    server_name b.cn
    ssl on
    ssl_certificate b.cn.crt;
    ssl_certificate_key b.cn.key;
    ...
}

3. Q1分析

nginx的access log打出来 400, 可能是建立连接https连接的时候出错了,没有更详细的信息了,所以有以下分析
1. Server上使用tcpdump抓包, wireshark分析结果

tcpdump -w debug.pcap

这里写图片描述
过程10,Server下发了证书
过程15,Client报错, Alert(Level Fatal, Description: Certificate Unknown)

  1. 查看过程10中下发证书的详情
    这里写图片描述
    发现请求a.com过程中下发的证书竟然是b.cn的,难以置信,但是至少发现了不可理解的地方,然后google找到nginxg文档中有这样的解释:
Name-based HTTPS servers

A common issue arises when configuring two or more HTTPS servers listening on a single IP address:

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}
With this configuration a browser receives the default server’s certificate, i.e. www.example.com regardless of the requested server name. This is caused by SSL protocol behaviour. The SSL connection is established before the browser sends an HTTP request and nginx does not know the name of the requested server. Therefore, it may only offer the default server’s certificate.
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Nginx 400 Bad Request是指在使用Nginx服务器访问网站或资源时,请求出现错误或无效,导致服务器无法正确处理请求,从而返回400 Bad Request错误响应。出现这种情况的原因通常是客户端发送的请求数据格式或参数错误,或者请求的资源不存在或被服务器拒绝访问。 要解决这个问题,我们需要排除以下几个可能的原因: 1. 请求数据格式错误。如果请求数据格式不正确,如头部数据错误,那么服务器将无法正确解析请求。此时,需要检查请求头、请求方法、请求参数等是否正确,并根据需要进行修正。 2. 请求参数错误。如果请求包含不合法的请求参数,例如访问不存在的页面、使用不支持的请求方法等,通常会导致400 Bad Request错误。解决这种情况需要检查请求参数是否正确,确保参数的数据类型、格式、取值范围等都符合要求。 3. 资源不存在或被服务器拒绝访问。如果请求的资源不存在,或者被服务器拒绝访问,那么就会出现400 Bad Request错误。解决这种问题需要确认请求的资源是否存在,以及是否被服务器正确配置和授权访问。 综上所述,出现Nginx 400 Bad Request错误是因为客户端提交的请求出现错误或无效。要解决这个问题,需要检查请求数据格式、请求参数、请求的资源等是否正确,确保这些因素都符合服务器的要求。另外,可以考虑使用Nginx日志来记录详细错误信息,以便在遇到问题时能够快速进行排除和修复。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值