Requests: Запросы не работают в контейнере Docker

Созданный на 31 мар. 2017  ·  37Комментарии  ·  Источник: psf/requests

Привет

Это старая история о том, что SSL не работает с запросами, но еще один шаг вперед ... Контейнеры Docker

У меня есть приложение, которое использует запросы, и оно отлично работает на моем локальном компьютере, но при его развертывании в контейнере Docker у меня возникает ошибка с модулем запросов (ошибка SSL)

[2017-03-31 11: 32: 29,863] ОШИБКА в приложении: исключение при отправке / отправке [POST]
Отслеживание (последний вызов последний):
Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 1982, в wsgi_app
response = self.full_dispatch_request ()
Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 1614, в full_dispatch_request
rv = self.handle_user_exception (e)
Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 1517, в handle_user_exception
ререйз (exc_type, exc_value, tb)
Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 1612, в full_dispatch_request
rv = self.dispatch_request ()
Файл "/usr/local/lib/python2.7/dist-packages/flask/app.py", строка 1598, в dispatch_request
вернуть self.view_functions rule.endpoint
Файл "app.py", строка 62, в sendrequest
response = sess.post (url, params, headers = h, verify = False)
Файл "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", строка 535, в сообщении
return self.request ('POST', url, data = data, json = json, * kwargs)Файл "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", строка 488, в запросеresp = self.send (подготовка, * send_kwargs)
Файл "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", строка 609, в отправке
r = adapter.send (запрос, ** kwargs)
Файл "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", строка 497, в отправке
поднять SSLError (e, request = request)
SSLError: ("плохое рукопожатие: SysCallError (-1, 'Неожиданный EOF')",)

Я слышал, что это может быть связано с openSSL. Есть идеи, как это можно решить? Должен ли я включать какую-либо зависимость?

Самый полезный комментарий

попробуйте установить эти версии:

requests[security]==2.7.0
cryptography==1.9
pyOpenSSL==17.4.0

Все 37 Комментарий

Можете ли вы запустить openssl version в своем контейнере?

Это также может быть связано с версией Python, мы также хотели бы знать об этом.

Привет

Python 2.7 (12)
Openssl 1.0.2g

Спасибо

Вы запускаете одну и ту же версию запросов в контейнере и за его пределами? Какие есть две версии?

2.11.1 при работе, а 2..12.5 внутри емкости. Какая разница?

Да, между этими двумя версиями есть несколько приличных изменений кода. Хотите попробовать быстро перейти на 2.11 в контейнере, чтобы посмотреть, что произойдет?

По-прежнему не работает, но с другим сообщением об ошибке
...
...
Файл "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", строка 491, в отправке
поднять SSLError (e, request = request)
SSLError: EOF произошел с нарушением протокола (_ssl.c: 590)

Грм. Эта другая ошибка почти такая же ошибка. Можете ли вы сообщить нам, с каким веб-сервером вы пытаетесь связаться?

Это мой собственный сервер с самоподписанным сертификатом. Я отправляю verify = False, чтобы игнорировать SSL, но мне это не нравится

response = sess.post (url, params, headers = h, verify = False)

Можете ли вы показать конфигурацию TLS для вашего сервера и с какой версией OpenSSL он связан?

Его TLS 1.2 и та же версия openSSL ... ничего особенного. Я не думаю об этом
что-то не так на стороне сервера, так как он отлично работает вне докера
контейнер

Пт, 31 марта 2017 г., 16:07, Кори Бенфилд [email protected]
написал:

Можете ли вы показать конфигурацию TLS для вашего сервера и какой OpenSSL
версия связана с?

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290738188 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55o2K5PaiflW3wHWD_rZYm_WFXXGyks5rrRa6gaJpZM4Mvjzc
.

Итак, «неправильный» здесь определяется только в том, есть ли несоответствие между ожиданиями клиента и сервера. Из интереса, ожидает ли ваш сервер SNI? Вы подключаетесь к своему серверу через имя хоста или IP?

Можете ли вы скрутить свой сервер в этом контейнере с тем же URL-адресом? Или даже просто телнет к нему? Интересно, могут ли запросы даже достигать сервера, на котором вы развернули контейнер.

Привет

В ответ на оба. он ожидает SNI, и я достигаю его через имя хоста

Из контейнера я могу подключиться к серверу через telnet, нет проблем с
тот. Я выставил другую службу через http, и она отлично работает, чисто
рукопожатие SSL, что не удается

В пятницу, 31 марта 2017 г., в 16:16, Ян Кордаско [email protected]
написал:

Можете ли вы скрутить свой сервер в этом контейнере с тем же URL-адресом? Или даже
просто телнет к нему? Интересно, могут ли запросы доходить до сервера из
где вы развернули контейнер.

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290740743 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55kVKzprqGA1n1PKJznWX_g_V7nsxks5rrRi-gaJpZM4Mvjzc
.

Хорошо, каков результат запуска openssl s_client -connect host:port на ваш сервер изнутри контейнера?

Привет

Он подключается без каких-либо проблем (подключен (00003))

В пятницу, 31 марта 2017 г., в 16:19, Кори Бенфилд [email protected]
написал:

Хорошо, каков результат запуска openssl s_client -connect host: port to
ваш сервер изнутри контейнера?

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290741631 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55oeDzw5HhrujLbMFLA6CCowT0umwks5rrRmLgaJpZM4Mvjzc
.

Извините, за весь результат. Меня интересует, каков результат переговоров.

Проверить код возврата: 19 (самоподписанный сертификат в цепочке сертификатов)

В пятницу, 31 марта 2017 г., в 16:34, Кори Бенфилд [email protected]
написал:

Извините, за весь результат. Меня интересует, каков результат
переговоры есть.

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290746053 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55o4JyAkpP5h1ZPLBOkRONN2z9Em8ks5rrRz-gaJpZM4Mvjzc
.

Это еще не весь результат. Скопируйте и вставьте все из этой команды.

Нет, весь результат. Все на выходе. Все, что он печатает.

Больше там ничего интересного нет, только версия tls, информация о сертификате и т. Д.

У меня точно такой же ответ вне контейнера
Эль-Эль-Вие, 31 марта 2017 г. в 16:40, Кори Бенфилд [email protected]
написать:

Нет, весь результат. Все на выходе. Все, что он печатает.

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290747930 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55iD8dY2eDxdfz1j0YzpteN8ThFJ3ks5rrR58gaJpZM4Mvjzc
.

Эта информация - именно то, что меня интересует. Что-то в нашем TLS-клиенте Hello сводит ваш сервер с ума, и поэтому мне интересно узнать, о чем ваш сервер договаривается.

Хорошо, давайте сделаем что-нибудь, чтобы убедиться, что это не мой сертификат. Я буду искать любой
другая страница, которая использует самоподписанный сертификат (если вы знаете какой-либо, пожалуйста
поделиться), и я попробую это сделать, так что вы сможете подключить это
сервер тоже

Эль-Ви, 31 марта 2017 г. в 16:46, Кори Бенфилд [email protected]
написать:

Именно эта информация меня интересует. Что-то в нашем TLS
Client Hello сводит ваш сервер с ума, поэтому мне интересно посмотреть
о чем договаривается ваш сервер.

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290749603 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55oT_6jlrkIO4VlXRsoohjEGzNy3pks5rrR_TgaJpZM4Mvjzc
.

Это не ваш сертификат. Рассматриваемое сообщение об ошибке (Неожиданный EOF) означает, что во время установления связи TLS сервер отправил нам пакет TCP FIN или RST. Это означает, что сервер решил закрыть соединение, а не мы. Это означает, что сервер решил, что мы не делаем то, что ему нравится. В результате это не может быть ошибкой вашего сертификата: мы еще не дошли до момента его проверки.

@javixeneize без информации, которую мы вас просили, я не уверен, что еще мы можем сделать, чтобы помочь.

Хорошо, хорошо ... я предоставлю это в понедельник
Эль-Вие, 31 марта 2017 г. в 17:19, Ян Кордаско [email protected]
написать:

@javixeneize https://github.com/javixeneize без информации
мы просили вас об этом, я не уверен, что еще мы можем сделать, чтобы помочь.

-
Вы получаете это, потому что вас упомянули.

Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290759070 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55ugTXZp-cZpp9JJJ7WmACcYXho2Rks5rrSeegaJpZM4Mvjzc
.

root<strong i="5">@4f66ccbaef3c</strong>:/# openssl s_client -connect api.quinto.ai:443
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = fbbot.quintoapp.com
verify return:1
---
Certificate chain
 0 s:/CN=fbbot.quintoapp.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFCjCCA/KgAwIBAgISA1Bg18LrjA3qyyrEDmzE+5YSMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAzMTQwNzMyMDBaFw0x
NzA2MTIwNzMyMDBaMB4xHDAaBgNVBAMTE2ZiYm90LnF1aW50b2FwcC5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0xbEa4W4k4BlPrIxeVX+ekPl1
Od4OuwepY5Ha2BQd6YMiphh+we5H6JVu2XDuPbQnmQMtEwGa2T2Adhic4bGPPC7+
0j+utJuqGBRIbYJ09A5EQOhB4HhOSI82l1ZpPkHpvOiC4UoEgG4KOLnqBX0JydI3
8vhiV4EgbLr77wARsEeinK+Zj+7bpsEK8q+B7mR5km6f6tKT/i++Wd4Fx3Pz7iuK
aCulKzG4IMxopE/9DDf608H/3cFcSHvg/4IguPoOCx2ArNKE7QCNFGYAx9HhnV2y
AYVbd2WGWeJKuNWEwCF+nvxGDo4cHdT6kq9HHB6kPTYrZb7PrKtkq1C3MNB/AgMB
AAGjggIUMIICEDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFENiqFyUkXGaxd/woyxi
6SqQz2WqMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUF
BwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNy
eXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5j
cnlwdC5vcmcvMB4GA1UdEQQXMBWCE2ZiYm90LnF1aW50b2FwcC5jb20wgf4GA1Ud
IASB9jCB8zAIBgZngQwBAgEwgeYGCysGAQQBgt8TAQEBMIHWMCYGCCsGAQUFBwIB
FhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYBBQUHAgIwgZ4MgZtU
aGlzIENlcnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1cG9uIGJ5IFJlbHlp
bmcgUGFydGllcyBhbmQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENlcnRp
ZmljYXRlIFBvbGljeSBmb3VuZCBhdCBodHRwczovL2xldHNlbmNyeXB0Lm9yZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAf80at95dsb9WsSMaChtKNEJR
FfuPd/5MZaqFxWM6+AtEGZt2qbeOExIShEHFehUSWQnrCBTiPY6ildK1E5nhduap
4K0O7FrnMVaNBhnoBT7jsZMs7ivLpaKCT6imR71hQTUv07xw1kQJMu/jrHHtVjNi
9iI+VryZeETIVBtCXbirwKxT0JYLicdS/9M9m9wC7/H8xWVkcRR5dMI2Im+4klX4
eGmgi+XCJPkDZZEpfQHmIqQQ9ccCpP0BFs0JqfwLich71NdPihVnJDhVZrEVMcgs
+412WdWCOTIXrEzsL6xddypVETY2k5Z3S8sZTInWA9nYOGHW82xwh6/tRU+yiQ==
-----END CERTIFICATE-----
subject=/CN=fbbot.quintoapp.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3157 bytes and written 433 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 78B1ABFE5A7BF1E698FB5D43D1A75D6F874DD9D2E12816E3276B349FC0C4B96B
    Session-ID-ctx:
    Master-Key: B6EE0F224CB1A93379B86524E9F01D618A018E2F1D68F5AB29F7570611F0D9CF4210F9946335A9FAAEEA143B0BC98D26
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 00 39 b1 81 4d f9 90 0a-b2 dd a8 e7 b5 6b 74 7c   .9..M........kt|
    0010 - ba 4e 8b 51 75 df c4 ae-e1 6c dc 3e 05 a1 0e fc   .N.Qu....l.>....
    0020 - 4e 61 83 34 f4 ea 06 b7-8d 54 82 01 a8 b2 fa 2a   Na.4.....T.....*
    0030 - 48 69 01 b5 06 6b ee 18-3d 93 f5 d7 31 d8 66 8f   Hi...k..=...1.f.
    0040 - a4 6f f4 6c 2d 48 37 9f-33 b7 36 49 39 1f 2f 31   .o.l-H7.3.6I9./1
    0050 - 1a 0d 8f 8e 34 36 3d d1-09 fb 6b 5b 5d 68 80 3e   ....46=...k[]h.>
    0060 - 66 d9 44 11 4d 12 d5 cc-df eb c3 45 ae 04 10 56   f.D.M......E...V
    0070 - 34 ad 98 8f f9 1b f2 33-00 a4 b3 3c a5 40 80 8e   4......3...<.@..
    0080 - 9b f1 b5 40 e5 2b 29 86-7e 2b f6 95 03 4b e3 b4   ...@.+).~+...K..
    0090 - ab 16 25 bc 47 bf fb 87-dc 13 0e 10 a8 1b 18 fb   ..%.G...........
    00a0 - 3b 65 07 96 05 ce 1a c2-9a d4 d8 73 fd 38 40 8b   ;e.........s.8@.
    00b0 - 0e 52 df 26 19 fc 9f 04-06 28 b3 25 5c e2 64 51   .R.&.....(.%\.dQ

    Start Time: 1496212705
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
read:errno=0

В чем ваша настоящая проблема @ harry1064?

@Lukasa, если вы видите приведенный выше результат команды openssl s_client -connect api.quinto.ai:443 я запустил внутри контейнера докеров, запущенного на моем сервере, вы увидите, что CN - это fbbot.quintoapp.com, который указывает на хост-сервер, на котором работает мой контейнер докеров.
Но та же самая команда, которую я запускал на хост-сервере, CN была api.quinto.ai.
Итак, в основном у меня есть сервер python, работающий в контейнере докеров, и я хочу сделать запрос на другой сервер api.quinto.ai, но я не могу сделать это с помощью запросов. Тот же код python, который я запускал на интерпретаторе на хост-машине, он работает нормально, но когда я вхожу в контейнер докеров и запускаю тот же код изнутри интерпретатора python, он не работает

По умолчанию OpenSSL s_client не представляет поле указания имени сервера, что означает, что удаленный сервер будет предоставлять любой сертификат, который он выберет. Вы получите одинаковый результат в обоих случаях, если измените свою команду на:

openssl s_client -connect api.quinto.ai:443 -servername api.quinto.ai

Даже если вы этого не сделаете, это похоже на проблему с докером, а не с запросами: похоже, вы воспроизводите проблему с помощью командной строки openssl, которая никак не использует запросы. Поэтому я не уверен, как вы хотите, чтобы мы решили вашу проблему.

Я получил одинаковый ответ по обоим делам. Поэтому я также думаю, что это проблема с докером, поскольку они, возможно, используют сопоставление между iptables.

Может, это кому-то поможет. Мне нужно было установить это:

OpenSSL 1.0.2g 1 марта 2016 г.

requests[security]==2.7.0  # not 2.18.x
cryptography==1.9   # not 2.0

Это обсуждение устарело несколько месяцев назад. Я закрываю это. При необходимости мы можем открыть его повторно.

@ harry1064 @javixeneize , ребята, вы нашли решение для этого? У меня такая же проблема, и, возможно, это проблема Docker. Но я действительно не знаю, как это преодолеть ...

Спасибо!

Неа...

Эль-июнь, 11 янв.2018 в 14:11, Габриэль Гуларте <
[email protected]> подписка:

@ harry1064 https://github.com/harry1064 @javixeneize
https://github.com/javixeneize вы, ребята, нашли решение для
это? У меня такая же проблема, и, возможно, это проблема Docker. Но
Я действительно не знаю, как это преодолеть ...

Спасибо!

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/requests/requests/issues/3948#issuecomment-356944272 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AMK55roWfMLccuizdHkWQTTOq2gU3BXMks5tJhYegaJpZM4Mvjzc
.

попробуйте установить эти версии:

requests[security]==2.7.0
cryptography==1.9
pyOpenSSL==17.4.0

Привет ,
У меня была аналогичная проблема, после перехода на вышеупомянутые версии все прошло гладко ( python 3.6 )

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

JimHokanson picture JimHokanson  ·  3Комментарии

eromoe picture eromoe  ·  3Комментарии

jake491 picture jake491  ·  3Комментарии

cnicodeme picture cnicodeme  ·  3Комментарии

remram44 picture remram44  ·  4Комментарии