nginx прокси для Cloudfront не работает с ошибкой, связанной с SNI, когда определено в восходящем блоке - PullRequest
0 голосов
/ 06 января 2020

У меня есть конфигурация nginx (nginx в 1.17), которая объединяет несколько ресурсов и делает их доступными в одном домене. Одним из этих ресурсов является дистрибутив AWS Cloudfront, подобный следующему:

  location / {
    # it is required to store the  proxy target in a variable in order to
    # force DNS re-resolution after the entries' TTL has expired
    set $cloudfront_distribution xxxxxxxxxxxxxx.cloudfront.net;
    proxy_pass https://$cloudfront_distribution;
    proxy_ssl_server_name on;
  }

Определение цели прокси, как это работает, как и ожидалось, но требует ручной установки значения resolver: https://www.nginx.com/blog/dns-service-discovery-nginx-plus/

Как описано в статье, альтернативный подход, который не требует жесткого кодирования решателя (которого я хотел бы избежать, чтобы установка была более переносимым), определяет восходящий поток с одним сервером:

  upstream cloudfront {
    server xxxxxxxxxxxxxx.cloudfront.net:443;
  }

  location / {
    proxy_pass https://cloudfront;
    proxy_ssl_server_name on;
  }

Однако при использовании этой настройки выдается сообщение об ошибке, связанное с SNI:

2020/01/06 11:30:53 [error] 6#6: *1 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 172.17.0.1, server: nginx.localhost, request: "GET / HTTP/1.1", upstream: "https://13.35.253.121:443/", host: "nginx.localhost:4000"

, поэтому мне кажется, что nginx и Cloudfront не могут договориться о том, какое имя сервера использовать для сертификата , Затем снова proxy_ssl_server_name устанавливается на on, и эта же процедура также работает, когда я определяю имя хоста в блоке местоположения (либо как переменную, как показано в первом примере, либо в жестком коде) вместо восходящего.

Чего-то не хватает в моей конфигурации? Нужно ли добавлять дополнительную информацию в сам апстрим?

1 Ответ

0 голосов
/ 06 января 2020

попробуйте это

 proxy_ssl_session_reuse off;

Каждое новое SSL-соединение требует полного SSL-рукопожатия между клиентом и сервером, которое сильно загружает процессор. Чтобы иметь NGINX прокси ранее согласованные параметры соединения и использовать так называемое сокращенное рукопожатие, включите директиву proxy_ssl_session_reuse.

Ссылка:

http://www.philandstuff.com/2012/09/26/ssl-do-handshake-errors-with-nginx-and-haproxy.html

...