Requests: 请求在 Docker 容器中不起作用

创建于 2017-03-31  ·  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 中
响应 = 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 行,在帖子中
返回 self.request('POST', url, data=data, json=json, *kwargs)文件“/usr/local/lib/python2.7/dist-packages/requests/sessions.py”,第488行,请求resp = self.send(prep, * send_kwargs)
文件“/usr/local/lib/python2.7/dist-packages/requests/sessions.py”,第609行,发送
r = 适配器。发送(请求,**kwargs)
文件“/usr/local/lib/python2.7/dist-packages/requests/adapters.py”,第497行,发送
引发 SSLError(e, request=request)
SSLError: ("握手错误:SysCallError(-1, 'Unexpected EOF')",)

我听说它可能与 openSSL 有关。 关于如何解决这个问题的任何想法? 我应该包括任何依赖吗?

最有用的评论

尝试安装这些版本:

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

所有37条评论

你能在你的容器中运行openssl version吗?

这也肯定与 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 版本......没什么特别的。 我不认为有
服务器端有什么问题,因为它在 docker 之外工作正常
容器

2017 年 3 月 31 日星期五下午 4:07,Cory Benfield通知@ github.com
写道:

你能显示你的服务器的 TLS 配置,以及什么 OpenSSL
它所链接的版本?


您收到此消息是因为您创作了该线程。
直接回复本邮件,在GitHub上查看
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290738188
或静音线程
https://github.com/notifications/unsubscribe-auth/AMK55o2K5PaiflW3wHWD_rZYm_WFXXGyks5rrRa6gaJpZM4Mvjzc
.

因此,这里的“错误”仅定义为客户端和服务器期望之间是否存在不匹配。 出于兴趣,您的服务器是否需要 SNI? 您是通过主机名还是 IP 访问服务器?

在那个容器中,你能用相同的 URL 卷曲你的服务器吗? 或者甚至只是 telnet 到它? 我想知道请求是否甚至可以从您部署容器的位置到达服务器。

你好

对两者的回应。 它需要 SNI,我通过主机名到达它

从容器我可以telnet到服务器,没有问题
那。 我通过 http 公开了另一个服务,它工作正常,纯粹是
SSL握手失败了

2017 年 3 月 31 日星期五下午 4:16,Ian Cordasco通知@github.com
写道:

在那个容器中,你能用相同的 URL 卷曲你的服务器吗? 甚至
只是telnet 到它? 我想知道请求是否可以从
您部署容器的位置。


您收到此消息是因为您创作了该线程。
直接回复本邮件,在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))

2017 年 3 月 31 日星期五下午 4:19,Cory Benfield通知@ github.com
写道:

好的,运行 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(证书链中的自签名证书)

2017 年 3 月 31 日星期五下午 4:34,Cory Benfield通知@ github.com
写道:

对不起,整个结果。 我对结果如何感兴趣
谈判是。


您收到此消息是因为您创作了该线程。
直接回复本邮件,在GitHub上查看
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290746053
或静音线程
https://github.com/notifications/unsubscribe-auth/AMK55o4JyAkpP5h1ZPLBOkRONN2z9Em8ks5rrRz-gaJpZM4Mvjzc
.

这还不是全部结果。 请复制并粘贴该命令中的所有内容。

不,整个结果。 所有的输出。 它打印的一切。

那里没有其他有趣的东西,只有 tls 版本、证书信息等......

我在容器外有完全相同的响应
El El vie,2017 年 3 月 31 日 a las 16:40,Cory Benfield通知@ github.com
escribió:

不,整个结果。 所有的输出。 它打印的一切。


您收到此消息是因为您创作了该线程。
直接回复本邮件,在GitHub上查看
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290747930
或静音线程
https://github.com/notifications/unsubscribe-auth/AMK55iD8dY2eDxdfz1j0YzpteN8ThFJ3ks5rrR58gaJpZM4Mvjzc
.

这些信息正是我感兴趣的。我们的 TLS Client Hello 中的某些东西让您的服务器发疯,所以我很想看看您的服务器正在协商什么。

好的,让我们做一些事情以确保它不是我的证书。 我会搜索任何
使用自签名证书的其他页面(如果您知道任何请
分享),我会尝试反对,所以你将能够连接
服务器也是

El El vie,2017 年 3 月 31 日 a las 16:46,Cory Benfield通知@ github.com
escribió:

这些信息正是我感兴趣的。我们的 TLS 中的一些东西
客户你好让你的服务器发疯,所以我很想看看
您的服务器正在协商什么。


您收到此消息是因为您创作了该线程。
直接回复本邮件,在GitHub上查看
https://github.com/kennethreitz/requests/issues/3948#issuecomment-290749603
或静音线程
https://github.com/notifications/unsubscribe-auth/AMK55oT_6jlrkIO4VlXRsoohjEGzNy3pks5rrR_TgaJpZM4Mvjzc
.

这不是你的证书。 有问题的错误消息(Unexpected EOF)意味着在 TLS 握手期间,服务器向我们发送了一个 TCP FIN 或 RST 数据包。 这意味着服务器选择关闭连接,而不是我们。 这意味着服务器已经决定我们不做它喜欢的事情。 因此,这不能是您的证书的错:我们还没有到验证它的地步。

@javixeneize没有我们要求您提供的信息,我不确定我们还能做些什么来提供帮助。

好的好的...我会在星期一提供
El El vie,2017 年 3 月 31 日 a las 17:19,Ian Cordasco通知@github.com
escribió:

@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如果您看到我在服务器上运行的 docker 容器内运行的openssl s_client -connect api.quinto.ai:443命令的上述结果,您将看到 CN 是 fbbot.quintoapp.com,它指向我的 docker 容器正在运行的主机服务器。
但是我在主机服务器上运行的相同命令 CN 是 api.quinto.ai。
所以基本上,我有一个在 docker 容器上运行的 python 服务器,我想向另一台服务器 api.quinto.ai 发出请求,但我无法使用请求来做到这一点。 我在主机上的解释器上运行相同的 python 代码,它工作正常,但是当我登录到 docker 容器并从 python 解释器内部运行相同的代码时,它不起作用

默认情况下,OpenSSL s_client 不显示服务器名称指示字段,这意味着远程服务器将显示它选择的任何证书。 如果将命令更改为:

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

即使您不这样做,这听起来也像是 docker 的问题,而不是 Requests 的问题:您似乎在使用 openssl 命令行重现问题,该命令行不以任何方式使用 Requests。 所以我不确定您希望我们如何解决您的问题。

我对这两种情况都得到了相同的回应。 所以我也认为这是 docker 的问题,因为他们可能正在使用 iptables 之间的映射。

也许这可以帮助某人。 对我来说,我需要安装这个:

OpenSSL 1.0.2g 2016 年 3 月 1 日

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

这个讨论在几个月前就过时了。 我正在关闭这个。 如有必要,我们可以重新打开它。

@harry1064 @javixeneize你们找到解决方案了吗? 我遇到了同样的问题,也许这可能是 Docker 问题。 但我真的不知道如何克服这个......

谢谢!

不...

El El jue, 11 ene 2018 a las 14:11, Gabriel Gularte <
通知@github.com> escribió:

@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 等级