![Ubuntu16.04:Nginx 1.10:Nginx 提供多個憑證資訊。 SSL 在瀏覽器上完美運行,但面臨curl 問題。捲曲錯誤 51](https://rvso.com/image/696995/Ubuntu16.04%EF%BC%9ANginx%201.10%EF%BC%9ANginx%20%E6%8F%90%E4%BE%9B%E5%A4%9A%E5%80%8B%E6%86%91%E8%AD%89%E8%B3%87%E8%A8%8A%E3%80%82%20SSL%20%E5%9C%A8%E7%80%8F%E8%A6%BD%E5%99%A8%E4%B8%8A%E5%AE%8C%E7%BE%8E%E9%81%8B%E8%A1%8C%EF%BC%8C%E4%BD%86%E9%9D%A2%E8%87%A8curl%20%E5%95%8F%E9%A1%8C%E3%80%82%E6%8D%B2%E6%9B%B2%E9%8C%AF%E8%AA%A4%2051.png)
我在 ubuntu 伺服器(16.04)上有多個帶有 nginx/1.10.0 + Letsencrypt 的網站。
從瀏覽器中的外觀來看,SSL 運作良好且完美。但是我們的開發人員應用程式使用curl請求(帶有SSL)並且面臨錯誤,如下所示
Update Failed: Download failed. cURL error 51: SSL: certificate subject name 'domain2.com' does not match target host name 'domain1.com'
使用 SSLLABS 檢查時,它顯示 A_grade 但正在載入多個憑證(同一伺服器中另一個網域的憑證)
Certificate #1: RSA 2048 bits (SHA256withRSA)
和
Certificate #2: RSA 2048 bits (SHA256withRSA) No SNI
在第二個證書下,存在以下錯誤。
Common names domain2.com MISMATCH
Trusted No NOT TRUSTED
Curl 錯誤也提到了第二個網域。
cURL error 51: SSL: certificate subject name 'domain2' does not match target host name 'domain1'
domain2 是完全不同的網站。不知道 nginx 如何將其訊息與domain1一起發送。
此外,我還透過使用 Letsencrypt SSL 建立網域在其他伺服器中測試了相同的場景,並且所有伺服器都存在相同的問題。與 SSLlabs 檢查時ssllabs 檢查器它能夠取得網域 2 憑證詳細資訊以及網域 1。
如果我使用 SSLlabs 檢查domain2,它將獲取同一伺服器中的任何其他網域憑證。 (但如果存在網域 A、B、C、D,則其中一個網域 SSL 檢查將只取得一個憑證。這不是問題,所有其他網域都會有此問題。)
附截圖。 (長整頁螢幕截圖)。我認為這會澄清這個案子:(
**我無法在應用程式中使用不安全的 Curl 請求,這會忽略此問題並使curl 請求成功。如果有人對此有想法請幫忙。我在這背後花了很多時間,仍然...
上述問題是針對 Wordpress 外掛程式的,因此無法隨curl 新增特定參數。 (來自WP核心)
提前致謝。
答案1
使用的curl版本似乎缺少基本的神經網路研究所支持。當多個具有 SSL 的網域託管在同一 IP 位址上時,SNI 是必要的。
您基本上有三個選擇:
- 將curl更新到支援SNI的版本。
對此的支持是7.18.1版本中引入。 - 在您的用戶端上自行新增主機參數:
-H "Host: domain1.com"
- 移動域以使用不同的 IP 位址。這樣就無需對客戶端進行任何更改。