NGINX + SSL 证书仅在某些浏览器中保护连接

NGINX + SSL 证书仅在某些浏览器中保护连接

我一直在努力解决这个问题,我似乎陷入了死胡同,不知道下一步该怎么做......

我接手了另一位休假员工留下的任务。他正在尝试为两个不同的网站设置 SSL 证书www.laenergiadelcambio.comwww.theenergyofchange.com。这些是针对单个域名的 thawte 证书。注意:我们在测试环境中进行这些更改,因此对 NGINX URL 的 vHosts 文件的更改尚未公开。

HTTPS 连接由 NGINX 服务器建立,在确保连接安全后,代理密码到提供网站内容的 Apache 机器。

首先,他遇到了两个网站总是收到相同证书(laenergiadelcambio.com)的问题。经过一番阅读,我们发现这是因为我们的操作系统(Centos 5.5)由于旧版本的 openssl(0.9.8e)而缺乏 TLS SNI(服务器名称指示)支持。我们决定为每个服务器块分配一个唯一的 IP 进行监听,如NGINX 文档

事情是这样的。它可以工作,但不是在所有浏览器和版本中都有效。

对于以下经过测试的浏览器:

Opera 31.0.1889.174
Firefox 40.0
Firefox 38.0
Google Chrome 44.0.2403.157
Internet Explorer 11.0.9600.17691
Internet Explorer 9.0.8112.16421

每个人都能识别证书并建立安全连接。一切顺利,没有问题。

但对于以下这些,

Firefox 39.0.3
Firefox 40.0.3
lynx 2.8.5

我有证书不受信任错误。

火狐抱怨这个:(错误代码:sec_error_unknown_issuer)

我附上了证书的详细信息。

由于未知颁发者,无法验证证书

山猫把这个扔给我……

lynx www.theenergyofchange.com/wp-admin

Making HTTPS connection to www.theenergyofchange.com
Retrying connection without TLS.
Looking up www.theenergyofchange.com
Making HTTPS connection to www.theenergyofchange.com
Secure 256-bit TLSv1/SSLv3 (DHE-RSA-AES256-SHA) HTTP connection
Sending HTTP request.
HTTP request sent; waiting for response.

SSL error:unable to get local issuer certificate-Continue? (y)
SSL error:host(www.theenergyofchange.com)!=cert(theenergyofchange.com)-    Continue? (y) 

Alert!: Unexpected network read error; connection aborted.
Can't Access `https://www.theenergyofchange.com/wp-admin'
Alert!: Unable to access document.

接下来,我发布两个 nginx vHosts 配置,仅用于一个站点www.theenergyofchange.com,HTTP 和 HTTPS。另一个站点除了 server_names 之外完全相同

072-blogs_391_ing.conf

    server {
    server_name theenergyofchange.com theenergyofchange.es theenergyofchange.info theenergyofchange.eu www.theenergyofchange.es www.theene
rgyofchange.info www.theenergyofchange.eu;
    rewrite ^ $scheme://www.theenergyofchange.com$request_uri permanent;
}

server {

    listen  80;
    server_name theenergyofchange.com theenergyofchange.es www.theenergyofchange.com pre.theenergyofchange.abg.corp www.theenergyofchange.
es www.theenergyofchange.com www.theenergyofchange.info www.theenergyofchange.eu;

    access_log  /var/log/nginx/blog_391ing.access.log;
    error_log   /var/log/nginx/blog_391ing.error.log error;

    error_page   404 403          /handle404.html;
    # error_page   502 503 504  /handle503.html;
    error_page   500 502 503 504      /handle500.html;

    location = /handle404.html {
         root html/errores-prxy;
    }

    location = /handle503.html {
         root html/errores-prxy;
    }

    location = /handle500.html {
         root html/errores-prxy;
    }

    location = / {
        proxy_pass http://wordpressprepro391.simosa.inet/;
    }

    location  / {
        proxy_pass http://wordpressprepro391.simosa.inet/;
    }


    location ~* /colab/web/system/modules/general/pages/captcha.jsp {
         proxy_pass http://wordpressprepro391.simosa.inet;
    }

    location ~* /colab/web/system/modules/general/resources/js/ {
         proxy_pass http://wordpressprepro391.simosa.inet;
    }

    location ~* /colab/ {
        proxy_pass http://wordpressprepro391.simosa.inet;
    }

    # Redirect wp-admin and wp-login requests to HTTPS.
    location ~ /wp-(?:admin|login|content|includes) {
    return 301 https://$host$request_uri;
    }
}

073-blogs_ing_392-ssl.conf

server {
    listen 80;
    rewrite ^(.*) https://$host$1 permanent;
}


server {
    listen 192.168.14.141:443 ssl;
    server_name www.theenergyofchange.com;

    access_log  /var/log/nginx/blog_392-ING-PRUEBA-SSL.access.log;
    error_log   /var/log/nginx/blog_392-ING-PRUEBA-SSL.error.log error;

    error_page   404 403          /handle404.html;
    # error_page   502 503 504  /handle503.html;
    error_page   500 502 503 504      /handle500.html;

    ssl on;
    ssl_certificate     /etc/nginx/openssl/CA/certs/ssl_certificate_ing.crt;
    ssl_certificate_key /etc/nginx/openssl/CA/private/theenergyofchange.com.key;
    ssl_client_certificate /etc/nginx/openssl/CA/certs/Intermediate_CA.crt;

    location = /handle404.html {
         root html/errores-prxy;
    }

    location = /handle503.html {
         root html/errores-prxy;
    }

    location = /handle500.html {
         root html/errores-prxy;
    }

    location = / {
        proxy_pass http://wordpressprepro391.simosa.inet/;
    }

    location  / {
        proxy_pass http://wordpressprepro391.simosa.inet/;
    }

    proxy_read_timeout       3500;
        proxy_connect_timeout    3250;

        proxy_set_header   X-Real-IP          $remote_addr;
        proxy_set_header   Host               $host;
        proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  https;


        proxy_set_header   SSL_PROTOCOL $ssl_protocol;
        proxy_set_header   SSL_CLIENT_CERT $ssl_client_cert;
        proxy_set_header   SSL_CLIENT_VERIFY $ssl_client_verify;
        proxy_set_header   SSL_SERVER_S_DN $ssl_client_s_dn;
}

那么..我在这里遗漏了什么,导致某些浏览器保护连接而其他浏览器不信任证书颁发者?

非常感谢!!

答案1

我怀疑您的同事误解了与 ssl 相关的指令:指向的文件ssl_certificate应包含您的服务器证书,后面是中间证书,并且ssl_client_certificate仅用于客户端证书验证和 OCSP - 我认为他将中间证书复制到了该文件中。现在,缓存中已有适当中间证书的浏览器将允许该页面,而尚未拥有这些证书的浏览器将失败,因为它们无法构建信任链。

尝试将该ssl_client_certificate行放入注释中,并将中间证书复制到ssl_certificate_ing.crt文件中如果还没有,并这样做您的服务器的证书。

因此,ssl_certificate_ing.crt看起来应该是这样的:

----- BEGIN CERTIFICATE -----
.. your server's certificate
----- END CERTIFICATE -----
----- BEGIN CERTIFICATE -----
.. first intermediate certificate    
----- END CERTIFICATE -----

另请参阅文档

在线检查证书内容的好工具:https://www.sslshopper.com/certificate-decoder.html

相关内容