Nginx

Nginx SSL 握手錯誤(沒有合適的密鑰共享)

  • December 6, 2019

為了簡短介紹,我試圖找出 nginx 中這個 SSL 握手錯誤的含義和原因。特別是關於密鑰共享的部分,因為搜尋錯誤沒有找到結果。

SSL_do_handshake() failed (SSL: error:141F7065:SSL routines:final_key_share:no suitable key share) while SSL handshaking.

讓我再解釋一下我的情況:我正在嘗試讓Collabora Online Development Edition (CODE)連接到我在 Arch Linux 系統上的Nextcloud設置。兩者都在同一個伺服器上執行,nginx 是 Collabora 的代理。我的 Nextcloud 伺服器執行良好,我通過 SSL 提供的所有其他站點和服務也執行良好。但是,在將 CODE 連接到我的 Nextcloud 安裝時遇到了麻煩,我終於讓它出現了,儘管它說連接到我的文件時遇到了問題。

對於故障排除,應注意 Collabora 的套件直接基於LibreOffice Online,因此其程式碼庫的許多部分都匹配。經過數小時的搜尋解決方案和對 nginx 和 loolwsd 中的不同配置設置進行故障排除後,我發現 LibreOffice Online 的Web 服務守護程序無法連接到 Nextcloud 提供的 WOPI 儲存 URI。

Cannot get file info from WOPI storage uri [Nextcloud URL with privilege key].
Error: SSL Exception: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure | wsd/Storage.cpp:531

從 cURL 連接到 URL 會產生正確的有效負載,這意味著 Nextcloud 伺服器正在按預期工作。

另一端的 nginx 在處理請求時會產生此錯誤。

SSL_do_handshake() failed (SSL: error:141F7065:SSL routines:final_key_share:no suitable key share) while SSL handshaking.

我以前認為這可能與密碼有關,因為在我看來,loolwsd 使用了一組過時的密碼,但錯誤消息指向不同的方向。

nginx 下的兩個域都使用相同的 SSL 參數。

# General SSL configuration.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384";
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;

# DNS resolver configuration. Use Google DNS.
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

# Security headers.
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";

# Diffie-Hellman key. Generate using: openssl dhparam -out dhparam.pem 4096
ssl_dhparam /etc/ssl/certs/dhparam.pem;

伺服器上使用的 OpenSSL 版本是 1.1.1

我現在的主要問題是“沒有合適的密鑰共享”具體是什麼意思,它的原因是什麼?

此錯誤特定於 OpenSSL 1.1.1 實現的 TLSv1.3,意味著在客戶端和伺服器之間未找到通用密鑰交換機制。罪魁禍首很可能是:

ssl_ecdh_curve secp384r1;

它將可用的 EC 曲線限制為僅 secp384r1,而客戶端顯式使用 prime256v1

嘗試註釋掉ssl_ecdh_curve預設值為,這auto是 OpenSSL 庫定義的合理曲線列表。

或者,如果您想明確說明,請同時列出prime256v1secp384r1

ssl_ecdh_curve secp384r1:prime256v1;

這將允許該客戶端連接。

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