我试图在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;