我们有2个域指向同一个公共AWS ELB,在ELB后面我们有nginx,它会将请求重定向到正确的服务器。
当我们在浏览器(Chrome / Safari / etc)中访问sub.domainA.com时,一切正常,但是当我们使用openssl等工具时,我们会收到证书错误:
openssl s_client -host sub.domainA.com -port 443 -prexit -showcerts
CONNECTED(00000003)
depth=0 /OU=Domain Control Validated/CN=*.domainB.com
verify error:num=20:unable to get local issuer certificate
verify return:1
出于某种原因,domainA正在使用domainB证书,我不知道为什么。
我几乎100%确定问题出在我们的nginx配置上(更具体地说,没有默认服务器块)
这是我们的nginx配置:
worker_processes auto;
error_log /var/log/nginx/error.log;
error_log /var/log/nginx/error.log warn;
error_log /var/log/nginx/error.log notice;
error_log /var/log/nginx/error.log info;
events {
worker_connections 1024;
}
http {
include /usr/local/openresty/nginx/conf/mime.types;
default_type application/octet-stream;
...
#
# DomainB
#
server {
ssl on;
ssl_certificate /etc/nginx/domainB.crt;
ssl_certificate_key /etc/nginx/domainB.key;
listen 8080;
server_name *.domainB.com;
access_log /var/log/nginx/access.log logstash_json;
error_page 497 301 =200 https://$host$request_uri;
set $target_web "web.domainB_internal.com:80";
location / {
keepalive_timeout 180;
resolver 10.10.0.2 valid=30s;
proxy_set_header Host $host;
proxy_pass http://$target_web;
proxy_set_header X-Unique-ID $request_id;
}
}
#
# DomainA
#
server {
ssl on;
ssl_certificate /etc/nginx/domainA.crt;
ssl_certificate_key /etc/nginx/domainA.key;
listen 8080;
server_name *.domainA.com;
access_log /var/log/nginx/access.log logstash_json;
error_page 497 301 =200 https://$host$request_uri;
set $target_web "web.domainA_internal.com:80";
location / {
keepalive_timeout 180;
resolver 10.10.0.2 valid=30s;
proxy_set_header Host $host;
proxy_pass http://$target_web;
proxy_set_header X-Unique-ID $request_id;
}
}
}
它根本不应该落入domainB块! 然而,我们在使用" openssl s_client"时看到它,但在浏览器中却没有。
在使用" openssl s_client -host sub.domainA.com"?
时,我们为什么会看到domainB的任何想法?与Openssl shows a different server certificate while browser shows correctly非常相似
非常有用的网站:https://tech.mendix.com/linux/2014/10/29/nginx-certs-sni/
答案 0 :(得分:1)
您需要在servername
命令中指定openssl
选项。
来自openssl s_client文档:
-servername name
在ClientHello中设置TLS SNI(服务器名称指示)扩展名 消息。
所以尝试像
这样的东西openssl s_client -connect sub.domainA.com:443 -showcerts -servername sub.domainA.com