Nginx

NGINX + SSL 證書僅在某些瀏覽器中保護連接

  • August 31, 2015

我一直在努力解決這個問題,我似乎在這裡陷入了死胡同,不知道下一步該做什麼……

我接手了另一名休假的工人留下的任務。他試圖為兩個不同的網站www.laenergiadelcambio.comwww.theenergyofchange.com設置 SSL 證書。這些是單個域的解凍證書。注意:我們正在測試環境中進行這些更改,因此對 NGINX URL 的 vHosts 文件的更改尚未公開。

HTTPS 連接由 NGINX 伺服器建立,該伺服器在保護連接後,將proxy_pass發送到為網站內容提供服務的 Apache 機器。

首先,他遇到了兩個網站總是收到相同證書 (laenergiadelcambio.com) 的問題。經過一番閱讀,我們發現這是因為我們的作業系統(Centos 5.5)由於舊版本的 openssl(0.9.8e)而缺乏 TLS SNI 支持(伺服器名稱指示)。正如NGINX 文件中所述,我們決定為每個伺服器塊分配一個唯一的 IP 來監聽。

這就是事情。它有效,但並非在所有瀏覽器和版本中都有效。

對於以下經過測試的瀏覽器:

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

我收到證書不受信任的錯誤。

Firefox對此抱怨:(錯誤程式碼: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.

接下來,我只為一個站點www.theenergyofchange.com發布兩個 nginx vHosts 配置,即 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;
}

那麼..我在這裡缺少什麼使某些瀏覽器保護連接而其他瀏覽器不信任證書頒發者?

很多..非常感謝提前!

我懷疑您的同事誤解了 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

引用自:https://serverfault.com/questions/718007