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

gra*_*aii 0 nginx

我们有 2 个域指向同一个公共 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
Run Code Online (Sandbox Code Playgroud)

由于某种原因,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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它根本不应该落在domainB 块中!然而,我们在使用“openssl s_client”时看到它,但在浏览器中看不到。

有什么想法为什么我们在使用“openssl s_client -host sub.domainA.com”时会看到domainB?

与 Openssl 非常相似,显示不同的服务器证书,而浏览器显示正确

非常有用的网站:https://tech.mendix.com/linux/2014/10/29/nginx-certs-sni/

小智 5

您需要servernameopenssl命令中指定该选项。

来自openssl s_client文档:

-服务器名称

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

所以尝试类似的东西

openssl s_client -connect sub.domainA.com:443 -showcerts -servername sub.domainA.com
Run Code Online (Sandbox Code Playgroud)