为什么请求使用ssl认证返回html?

mid*_*ori 3 python ssl python-2.7 python-requests

我有一个问题

我正在尝试将一些数据发布到网络服务器并获得响应.Webserver具有SSL证书验证,因此我为其提供文件.在响应中我应该收到xml文件,但我收到一些HTML.

我的小脚本看起来像这样:

import requests, sys, os

program_directory=sys.path[0]
verify = os.path.join(program_directory, "test.pem")
data='some data'

print requests.post('https://somewebsite', data=data, verify=verify).text
Run Code Online (Sandbox Code Playgroud)

这就是我在html之前得到的:

C:\Python27\lib\site-packages\requests\packages\urllib3\connection.py:251: SecurityWarning: Certificate has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 for details.) SecurityWarning
Run Code Online (Sandbox Code Playgroud)

如果我使用verify=False并且不提供文件,它可以正常工作并返回正确的数据.什么可能是一个问题,为什么我会收到此警告和HTML?

Mou*_*Tio 6

引用GrahamDumpleton:

这是因为在较旧的Python版本中,_ssl模块不会在SSL证书的字段集中返回"subjectAltName".即使存在也不返回该字段意味着即使SSL证书有效,检查也将失败并记录警告.

要消除警告,您可以全局禁用urllib3警告.

requests模块包含urllib3的捆绑版本,您很可能需要使用:

import requests
requests.packages.urllib3.disable_warnings()
Run Code Online (Sandbox Code Playgroud)

如果您只想忽略该特定警告,可以使用:

from requests.packages.urllib3.exceptions import SubjectAltNameWarning
requests.packages.urllib3.disable_warnings(SubjectAltNameWarning)
Run Code Online (Sandbox Code Playgroud)