我想测试下nginx拒绝不携带servername字段过来ssl建联的https请求,即非sni的https请求
nginx的sni是开启的
服务器设置的nginx配置如下:
http {
include mime.types;
default_type application/octet-stream;
log_format main '[$time_local]"$status"';
sendfile on;
keepalive_timeout 65;
server {
#SSL 访问端口号为 443
listen 443 ;
ssl on;
#填写绑定证书的域名
server_name caiyd2.8686c.com;
#证书文件名称
ssl_certificate caiyd2.8686c.com_bundle.crt;
#私钥文件名称
ssl_certificate_key caiyd2.8686c.com.key;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location ~ /.+$ {
root html;
}
server {
listen 80
listen 443 default_server;
return 403 "Wrong servername!";
}
}
但是这样测试的话,https所有请求都无法建联,看上去是因为匹配到了默认的server(default_server),然后里面没证书导致无法建联。
我把默认的server注释掉,只留下一个server的话,不是caiyd2.8686c.com的域名也能建联成功。 在我看来sni是没起作用的。
我理解的是,sni开启的作用是在ssl证书交互环节,通过携带的server_name字段,确认应该用哪个server里面的证书来建联,但是现在看还是按照普通的逻辑:通过请求中的host字段来匹配server,匹配不到就选默认的server。
我想实现的是只有https请求中携带了servername字段为caiyd2.8686c.com的请求才接受,其他域名的https请求或者域名caiyd2.8686c.com的非sni请求,在ssl握手阶段就不让建联,请问是可以怎么实现呢,
我感觉我上面按照sni的逻辑来看的话,是应该实现的,希望有人指点下,谢谢。