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

时间:2016-09-30 17:37:46

标签: nginx

我们有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/

1 个答案:

答案 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