2016-05-30 68 views
0

我试图通过https url发送请求来获取数据,当我尝试在浏览器上执行它时,域需要安全证书。来自urllib3 HTTPSConnectionPool request_encode_body证书问题

但我的问题是如何调用我的Python代码的URL来获取响应数据? 我已经写了follwing代码:

conn = HTTPSConnectionPool(BETTING_CONFG['api_url'], 
           maxsize = BETTING_CONFG['connection_max_size']) 

response = conn.request_encode_body('POST', service_uri, headers= headers, 
             encode_multipart=False, body = body) 

,我得到如下回应:

Response: status = 200, payload = {"_status":"error","payload":{"_code":"0-2","_message":"invalid_app_key"}} . 

和此警告在终端上:

/usr/local/lib/python2.7/dist-packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning. 
    SNIMissingWarning 
/usr/local/lib/python2.7/dist-packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
    InsecurePlatformWarning 
/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py:821: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html 
    InsecureRequestWarning) 
[555WIN] 2016-05-30 14:02:06,043 - INFO - Betting Response: status = 200, payload = {"_status":"error","payload":{"_code":"0-2","_message":"invalid_app_key"}} . 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/logging/handlers.py", line 76, in emit 
    if self.shouldRollover(record): 
    File "/usr/lib/python2.7/logging/handlers.py", line 156, in shouldRollover 
    msg = "%s\n" % self.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 724, in format 
    return fmt.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 464, in format 
    record.message = record.getMessage() 
    File "/usr/lib/python2.7/logging/__init__.py", line 324, in getMessage 
    msg = str(self.msg) 
TypeError: __str__ returned non-string (type dict) 
Logged from file jsonapi.py, line 137 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/logging/__init__.py", line 851, in emit 
    msg = self.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 724, in format 
    return fmt.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 464, in format 
    record.message = record.getMessage() 
    File "/usr/lib/python2.7/logging/__init__.py", line 324, in getMessage 
    msg = str(self.msg) 
TypeError: __str__ returned non-string (type dict) 

时我在Chrome上添加了证书并尝试发送请求邮递员,它工作正常吗?

任何帮助如何解决它?

回答

1

请理解您的Chrome证书存储区与您的Python应用程序使用的证书存储区不同。

如果您只能获得有效的SSL证书而不是尝试使自签名证书正常工作,那将会容易得多。

此外,请确保您升级您的Python和urllib。这些警告信息不容忽视!先解决它们!

SSL证书过去很贵,但现在您可以从LetsEncrypt获得有效的,完全支持的证书免费。我运行我的own website使用他们的证书,我可以向你保证,Python加载他们的证书没有问题。