如何解决Nginx SSL握手失败?

我试图在Ubuntu 16.04上为nginxconfigurationHTTPS。 我已经用listen 443 ssl语句设置它,并告诉它在哪里可以find证书和私钥文件。 之后,我用sudo service nginx restart服务器。

现在,当我curl https://my_ip_address ,我得到以下消息:

 curl: (35) gnutls_handshake() failed: Handshake failed 

我已经检查了我所知道的两个日志文件/var/log/nginx/access.log/var/log/nginx/error.log ; 但它不显示请求中的任何内容。

我的问题:当SSL握手失败时是否logging任何东西? 如果是这样的话? 一般情况下,如何解决这样的问题,在发送HTTP请求之前SSL服务器发生了错误,或者服务器提取了错误?

编辑:我得到它的工作,从我的configuration中删除以下行:

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; 

更新: ssl_ecdh_curve secp384r1; 线似乎是造成这个问题。 没有它,一切工作正常,但与此,SSL握手失败。 奇怪的是,错误信息是“没有共享密码”。 我不确定它做了什么,所以我只是删除它。 我也删除了ssl_stapling的东西,因为我不知道它是什么,它正在创build自己的错误消息

正如@Paul所说,解决的办法是提高日志级别。 我改变了我的nginx.conf文件中的一行,现在它读取如下:

 error_log /var/log/nginx/error.log debug; 

而且现在日志级别更高,它会loggingssl握手错误:

 2016/09/19 22:38:08 [info] 10114#10114: *2 SSL_do_handshake() failed (SSL: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher) while SSL handshaking, client: 108.162.242.24, server: 0.0.0.0:443 

实际上,您已经使用ssl_ecdh_curve选项来configurationNginx中的Diffie Hellman密钥交换 ,但您尚未提供参数文件。 因此,您必须使用ssl_dhparam选项,并且必须使用openssl创build一个文件。

创build文件:

 openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096 

在Nginx中使用文件及以上的Diffie Hellmanconfiguration:

 ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ecdh_curve secp384r1;