Nginx SSL 握手錯誤(沒有合適的密鑰共享)
為了簡短介紹,我試圖找出 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 庫定義的合理曲線列表。或者,如果您想明確說明,請同時列出
prime256v1
和secp384r1
:ssl_ecdh_curve secp384r1:prime256v1;
這將允許該客戶端連接。