Re: Выбор версии TLS в proxy_ssl_protocols

2018-11-16 Пенетрантность Maxim Dounin
Hello!

On Fri, Nov 16, 2018 at 03:33:41PM +0300, Evgeniy Berdnikov wrote:

> On Fri, Nov 16, 2018 at 02:23:52PM +0300, Maxim Dounin wrote:
> > Проблема в том, что в Debian на системном уровне запрещены 
> > протоколы меньше TLS 1.2.  Соответственно в вашей конфигурации 
> > оказываются запрещены вообще все протоколы - об этом и говорит 
> > ошибка "no protocols available".
> 
>  Действительно, изменение MinProtocol в системном конфиге openssl
>  решает проблему. Спасибо.
> 
> > Исправить это можно, обновившись на nginx 1.15.3+, где 
> > соответствующая проблема полечена на уровне nginx[1], либо же 
> > убрав ограничение в системном конфиге OpenSSL и/или задав для 
> > nginx'а отдельный конфиг, без соответствующего ограничения.
> 
>  Каким образом можно задать для nginx отдельный конфиг
>  без системного ограничения на версии TLS?

Конфиг для openssl, отличный от используемого по умолчанию, можно 
задать с помощью переменной окружения OPENSSL_CONF.

>  Предлагаю описание директив ssl_protocols и proxy_ssl_protocols
>  дополнить словами о том, что версия может быть ограничена в
>  системном конфиге openssl вплоть до некоторых версий nginx.
>  Хотя бы на сайте (в дистрибутивах с младшими версиями nginx
>  менять документацию уже поздно).

Как я уже писал ранее, начиная с версии 1.15.3 nginx умеет 
бороться с попытками ограничить протоколы через конфиг OpenSSL'я, 
а равно с аналогичными ограничениями, заданными на уровне 
библиотеки.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Выбор версии TLS в proxy_ssl_protocols

2018-11-16 Пенетрантность Evgeniy Berdnikov
  Добрый день.
  
On Fri, Nov 16, 2018 at 02:23:52PM +0300, Maxim Dounin wrote:
> Проблема в том, что в Debian на системном уровне запрещены 
> протоколы меньше TLS 1.2.  Соответственно в вашей конфигурации 
> оказываются запрещены вообще все протоколы - об этом и говорит 
> ошибка "no protocols available".

 Действительно, изменение MinProtocol в системном конфиге openssl
 решает проблему. Спасибо.

> Исправить это можно, обновившись на nginx 1.15.3+, где 
> соответствующая проблема полечена на уровне nginx[1], либо же 
> убрав ограничение в системном конфиге OpenSSL и/или задав для 
> nginx'а отдельный конфиг, без соответствующего ограничения.

 Каким образом можно задать для nginx отдельный конфиг
 без системного ограничения на версии TLS?

 Предлагаю описание директив ssl_protocols и proxy_ssl_protocols
 дополнить словами о том, что версия может быть ограничена в
 системном конфиге openssl вплоть до некоторых версий nginx.
 Хотя бы на сайте (в дистрибутивах с младшими версиями nginx
 менять документацию уже поздно).
-- 
 Eugene Berdnikov
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Выбор версии TLS в proxy_ssl_protocols

2018-11-16 Пенетрантность Maxim Dounin
Hello!

On Thu, Nov 15, 2018 at 10:50:15PM +0300, Evgeniy Berdnikov wrote:

>  Есть задача спроксировать соединение до сервера с Exchange 2013,
>  который не умеет TLSv1.2 и выше -- он просто обрывает соединение.
>  Это выяснено с помощью "openssl s_client" перебором ключей -tlsXXX.
>  Openssl с ключами -tls1 и -tls1_1 соединение устанавливает.

[...]

>  Теперь понижаем версию, чтобы получить желаемый коннект: прописываем
>  в конфиге "TLSv1.1" и получаем в логе
> 
> 2018/11/15 21:50:25 [crit] 12454#12454: *1 SSL_do_handshake() failed (SSL: 
> error:141E70BF:SSL routines:tls_construct_client_hello:no protocols 
> available) while SSL handshaking to upstream, client: 192.168.27.13, server: 
> cio.protva.ru, request: "GET /owa/ HTTP/1.1", upstream: 
> "https://172.23.0.4:443/owa/;, host: "cio.protva.ru:8080"

[...]

>  То есть вместо изменения версии происходит какая-то внутренняя ошибка
>  "tls_construct_client_hello:no protocols available". Такой же результат
>  получается если указать TLSv1, SSLv3 или несколько версий протокола.
>  Это бага или я что-то упустил?
>  
>  Информация о стендовой системе: Debian/unstable (32bit), пакеты
>  nginx-light_1.14.1-1_i386 и libssl_1.1.1-2_i386.

Проблема в том, что в Debian на системном уровне запрещены 
протоколы меньше TLS 1.2.  Соответственно в вашей конфигурации 
оказываются запрещены вообще все протоколы - об этом и говорит 
ошибка "no protocols available".

Исправить это можно, обновившись на nginx 1.15.3+, где 
соответствующая проблема полечена на уровне nginx[1], либо же 
убрав ограничение в системном конфиге OpenSSL и/или задав для 
nginx'а отдельный конфиг, без соответствующего ограничения.

[1] http://hg.nginx.org/nginx/rev/7ad0f4ace359

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Выбор версии TLS в proxy_ssl_protocols

2018-11-15 Пенетрантность Evgeniy Berdnikov
  Коллеги, добрый вечер.

 Есть задача спроксировать соединение до сервера с Exchange 2013,
 который не умеет TLSv1.2 и выше -- он просто обрывает соединение.
 Это выяснено с помощью "openssl s_client" перебором ключей -tlsXXX.
 Openssl с ключами -tls1 и -tls1_1 соединение устанавливает.

 Смотрим то же самое на nginx, для начала TLSv1.2. Конфиг стенда:

 server {
listen *:8080 ;
server_name cio.protva.ru ;
location /owa/ {
proxy_pass https://172.23.0.4/owa/ ;
proxy_ssl_protocols TLSv1.2 ;
...
}
 }

 Запрос принимается, nginx отсылает эксчейнджу нормальный пакет
 ClientHello (это подтверждается анализатором трафика, виден список
 шифров и прочие потроха), эксчейндж тупо рвёт коннекцию,
 в лог пишется:

 2018/11/15 21:47:35 [error] 12393#12393: *1 peer closed connection in SSL 
handshake (104: Connection reset by peer) while SSL handshaking to upstream, 
client: 192.168.27.13, server: cio.protva.ru, request: "GET /owa/ HTTP/1.1", 
upstream: "https://172.23.0.4:443/owa/;, host: "cio.protva.ru:8080"

 Здесь всё нормально и совпадает с результатом "openssl s_client -tls1_2".
 
 Теперь понижаем версию, чтобы получить желаемый коннект: прописываем
 в конфиге "TLSv1.1" и получаем в логе

2018/11/15 21:50:25 [crit] 12454#12454: *1 SSL_do_handshake() failed (SSL: 
error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available) 
while SSL handshaking to upstream, client: 192.168.27.13, server: 
cio.protva.ru, request: "GET /owa/ HTTP/1.1", upstream: 
"https://172.23.0.4:443/owa/;, host: "cio.protva.ru:8080"

 при этом по сети эксчейнджу летит такой пакет:


Internet Protocol Version 4, Src: 192.168.30.31, Dst: 172.23.0.4
Transmission Control Protocol, Src Port: 33938, Dst Port: 443, Seq: 1, Ack: 1, 
Len: 7
Secure Sockets Layer
TLSv1 Record Layer: Alert (Level: Fatal, Description: Internal Error)
Content Type: Alert (21)
Version: TLS 1.0 (0x0301)
Length: 2
Alert Message
Level: Fatal (2)
Description: Internal Error (80)


 То есть вместо изменения версии происходит какая-то внутренняя ошибка
 "tls_construct_client_hello:no protocols available". Такой же результат
 получается если указать TLSv1, SSLv3 или несколько версий протокола.
 Это бага или я что-то упустил?
 
 Информация о стендовой системе: Debian/unstable (32bit), пакеты
 nginx-light_1.14.1-1_i386 и libssl_1.1.1-2_i386.

# nginx -V
nginx version: nginx/1.14.1
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 
-fdebug-prefix-map=/build/nginx-AZYb5D/nginx-1.14.1=. -fstack-protector-strong 
-Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx 
--conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log 
--error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock 
--pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body 
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy 
--http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit 
--with-http_ssl_module --with-http_stub_status_module --with-http_realip_module 
--with-http_auth_request_module --with-http_v2_module --with-http_dav_module 
--with-http_slice_module --with-threads --with-http_gzip_static_module 
--without-http_browser_module --without-http_geo_module 
--without-http_limit_req_module --without-http_limit_conn_module 
--without-http_memcached_module --without-http_referer_module 
--without-http_split_clients_module --without-http_userid_module 
--add-dynamic-module=/build/nginx-AZYb5D/nginx-1.14.1/debian/modules/http-echo

 PS. Пытался прописывать proxy_ssl_name, но шаманство не помогло, конечно.
-- 
 Eugene Berdnikov
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru