Я пытаюсь настроить HTTPS для nginx на Ubuntu 16.04. Я уже настроил это с listen 443 ssl
заявлений и сообщил ему, где найти файлы сертификата и закрытого ключа. После этого я перезапустил сервер с помощью 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? Если да, то где? В общем, как мне решать подобные проблемы, когда в протоколе SSL возникает ошибка до того, как HTTP-запрос будет отправлен или извлечен сервером?
РЕДАКТИРОВАТЬ: Я заставил его работать, удалив следующие строки из моей конфигурации:
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, потому что я не знаю, для чего он нужен, и он создавал свои собственные сообщения об ошибках
Как сказал @Paul, решением было поднять уровень журнала. Я изменил строчку в своем nginx.conf
файл, поэтому теперь он выглядит следующим образом:
error_log /var/log/nginx/error.log debug;
И теперь, когда уровень журнала выше, он регистрирует ошибки рукопожатия ssl:
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 настроить Обмен ключами Диффи Хеллмана в Nginx, но вы не предоставили файл параметров. Поэтому вы должны использовать опцию ssl_dhparam и должен создать файл с openssl.
Создать файл:
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Используйте файл и выше конфигурацию Diffie Hellman в Nginx:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ecdh_curve secp384r1;
Вы можете проверить свою конфигурацию сервера nginx, есть строка конфигурации: ssl_ciphers, значение по умолчанию: ssl_ciphers HIGH:! ANULL:! MD5; (http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers), но иногда это не ожидается, в моем случае значение по умолчанию для nginx-ingress-controller меньше, чем конфигурация по умолчанию, а ошибка отображения журнала отладки nginx: нет общего шифра. когда я добавляю несколько шифров в файл конфигурации и перезагружаю nginx, проблема была изменена, и вы можете ссылаться на этот шаблон конфигурации: https://mozilla.github.io/server-side-tls/ssl-config-generator/