Size: a a a

DocOps-сообщество

2019 December 10

SR

Stas Rychkov in DocOps-сообщество
Я вот с Confluence какой день торчу с, казалось бы, проблемой, которая должна быть изъезжена вдоль и поперёк. Вот она, кстати.


Confluence. Один из экземпляров конфы при подключении возвращает ошибку. Второй работает без проблем.


requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDHE-RSA-AES-GCM-SHA384'

requests.get(url, auth=HTTPDigestAuth(username, getpass.getpass()), verify=False)


Сниппет возвращает:


SSLError: HTTPSConnectionPool(host='host.example.net', port=443): Max retries exceeded with url: /my_passed_url (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'sslv3 alert handshake failure')]")))

Проверяем, что возвращает OpenSSL при подключении к этому же экземпляру:
openssl s_client -showcerts -connecy myhost.example.net:443

Возвращает:

SSL-Session:
Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES256-GCM-SHA384

Вопрос: что происходит? Откуда всплывает SSLv3 вообще, если экземпляру requests передаётся заданный набор шифров (cipher set)?

Библиотека Гончика возвращает ту же ошибку SSL. WTF?
источник

iv

iakov v in DocOps-сообщество
А если сравнить с работающим инстансом? s_client те же самые параметры возвращает?
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
А если сравнить с работающим инстансом? s_client те же самые параметры возвращает?
Какие параметры? Cipher set?

Нет, потому что на рабочем ослабленные ограничения безопасности.

А на том, где всё ломается, похоже разрешён только TLS 1.2
источник

iv

iakov v in DocOps-сообщество
Stas Rychkov
Я вот с Confluence какой день торчу с, казалось бы, проблемой, которая должна быть изъезжена вдоль и поперёк. Вот она, кстати.


Confluence. Один из экземпляров конфы при подключении возвращает ошибку. Второй работает без проблем.


requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDHE-RSA-AES-GCM-SHA384'

requests.get(url, auth=HTTPDigestAuth(username, getpass.getpass()), verify=False)


Сниппет возвращает:


SSLError: HTTPSConnectionPool(host='host.example.net', port=443): Max retries exceeded with url: /my_passed_url (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'sslv3 alert handshake failure')]")))

Проверяем, что возвращает OpenSSL при подключении к этому же экземпляру:
openssl s_client -showcerts -connecy myhost.example.net:443

Возвращает:

SSL-Session:
Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES256-GCM-SHA384

Вопрос: что происходит? Откуда всплывает SSLv3 вообще, если экземпляру requests передаётся заданный набор шифров (cipher set)?

Библиотека Гончика возвращает ту же ошибку SSL. WTF?
используемый в конечном итоге шифр зависит от того, как клиент и сервер договорятся. возможно, инстансы confluence отличаются настройками SSL. У вас там есть reverse proxy? кто терминирует SSL?
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
используемый в конечном итоге шифр зависит от того, как клиент и сервер договорятся. возможно, инстансы confluence отличаются настройками SSL. У вас там есть reverse proxy? кто терминирует SSL?
Я смотрю, что браузер всегда договаривается о TLS 1.2. Поэтому я думал, что можно из контекста выбить биты флагов TLS 1 | TLS 1_1.



import ssl
import requests

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_


class TlsAdapter(HTTPAdapter):

   def __init__(self, ssl_options=0, **kwargs):
       self.ssl_options = ssl_options
       super(TlsAdapter, self).__init__(**kwargs)

   def init_poolmanager(self, *pool_args, **pool_kwargs):
       ctx = ssl_.create_urllib3_context(ssl.PROTOCOL_TLS)
       # extend the default context options, which is to disable ssl2, ssl3
       # and ssl compression, see:
       # https://github.com/shazow/urllib3/blob/6a6cfe9/urllib3/util/ssl_.py#L241
       ctx.options |= self.ssl_options
       self.poolmanager = PoolManager(*pool_args,
                                      ssl_context=ctx,
                                      **pool_kwargs)

session = requests.session()
# disallow tls1.0 and tls1.1, allow only tls1.2 (and newer if suported by
# the used openssl version)
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)


Но такое монтирование контекста в сеанс не помогло. Может сеанс кривой, как проверить?

Как понять, кто терминирует SSL? Там на прокси идёт расшифровка с подменой сертификата похоже.
источник

SR

Stas Rychkov in DocOps-сообщество
TLS 1.2 у меня судя по всему (OpenSSL 1.1.1) поддерживается.

http://pyfound.blogspot.com/2017/01/time-to-upgrade-your-python-tls-v12.html?m=1
источник

iv

iakov v in DocOps-сообщество
я не очень умею в Python и его библиотеки, поэтому про код ничего сказать не могу. А про терминацию - какой софт в качестве прокси? nginx? просто у Confluence вроде не очень много вариантов в плане тонкой настройки SSL
источник

iv

iakov v in DocOps-сообщество
"у меня" - это то есть где? в том python-клиенте? на сервере? на reverse proxy?
источник

iv

iakov v in DocOps-сообщество
попробуйте оставить только 1.2 на том инстансе, который работает - если получите такую же ошибку, причина будет найдена 😊
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
я не очень умею в Python и его библиотеки, поэтому про код ничего сказать не могу. А про терминацию - какой софт в качестве прокси? nginx? просто у Confluence вроде не очень много вариантов в плане тонкой настройки SSL
А, я не понял сразу. В браузере видно, что хартбиты идут от Aleph/0.4.1. А как понять, что там ещё? В других пакетах ответа нет поля Server...
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
"у меня" - это то есть где? в том python-клиенте? на сервере? на reverse proxy?
На клиенте. С которого я шлю запросы через requests серверу Confluence.
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
попробуйте оставить только 1.2 на том инстансе, который работает - если получите такую же ошибку, причина будет найдена 😊
Проблема в том, что удалённый сервер Confluence вне моей досягаемости. Это чёрный ящик для меня. Нет туда админского доступа.
источник

iv

iakov v in DocOps-сообщество
ну значит у вас остаётся вариант вернуть в свой скрипт поддержку TLSv1.1 хотя бы и посмотреть, заработает ли.
источник

SR

Stas Rychkov in DocOps-сообщество
iakov v
ну значит у вас остаётся вариант вернуть в свой скрипт поддержку TLSv1.1 хотя бы и посмотреть, заработает ли.
TLS 1.1 однозначно нет. Это уже понятно. НужОн 1.2. Вопрос, откуда пролезает ошибка SSLv3, если бит контекста один -- TLS 1.2. Не пойму, как убедиться, что мой клиент и правда пытается соединиться по TLS 1.2...
источник

iv

iakov v in DocOps-сообщество
если объединить то, что вы говорили: 1) управление серверами вам недоступно, 2) серверы различаются по настройке выбора версии TLS, 3) TLSv1.1 вы включить не хотите для диагностики, то у вас закончились дальнейшие ходы
источник

NK

ID:0 in DocOps-сообщество
Агрессивный наброс на документацию и вполне адекватный ответ. https://github.com/valor-software/ngx-bootstrap/issues/5566
источник

VS

Vadim Smelyanskiy in DocOps-сообщество
Из агрессивных набросов тоже можно и нужно делать выводы

Как минимум, на каждого агрессивного есть сотни уравновешенных, которые молча не стали использовать ngx-bootstrap, потому что документация sucks
источник

НН

Нац Нац in DocOps-сообщество
Vadim Smelyanskiy
Из агрессивных набросов тоже можно и нужно делать выводы

Как минимум, на каждого агрессивного есть сотни уравновешенных, которые молча не стали использовать ngx-bootstrap, потому что документация sucks
Делаем по мере возмоности всё. Не везде она сакс
источник

VS

Vadim Smelyanskiy in DocOps-сообщество
Нац Нац
Делаем по мере возмоности всё. Не везде она сакс
Это, кстати, отличный ответ)
источник

VS

Vadim Smelyanskiy in DocOps-сообщество
Просто фразы "shame on you" и "easy man, don't use it" выглядят, будто проблема не признаётся, и, мягко говоря, симпатии не вызывают
источник