opennssl s_client显示错误的证书:浏览器显示正确

我们有两个指向同一个公共AWS ELB的域名,而在这个ELB背后我们有nginx,它将请求重定向到正确的服务器。

当我们在浏览器(Chrome/Safari/等)中输入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的证书,我不知道为什么。

我几乎百分之百确定问题出在我们的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/

点赞
用户88888888
用户88888888

你需要在运行 openssl 命令时指定 servername 选项。

openssl s_client 的文档中可以看到:

-servername name

在 ClientHello 消息中设置 TLS SNI (服务器名称指示)扩展。

因此,可以尝试这样的命令:

openssl s_client -connect sub.domainA.com:443 -showcerts -servername sub.domainA.com
2016-09-30 20:46:21