你好
这就是关于 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 有关。 关于如何解决这个问题的任何想法? 我应该包括任何依赖吗?
你能在你的容器中运行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
)
最有用的评论
尝试安装这些版本: