SSL是什么,为什么发送HTTPS请求时需要证书验证?
SSL(Secure Socket Layer,安全套接字层):位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。(是为了解决HTTP协议是明文,避免传输的数据被窃取,篡改,劫持等。)
TSL(Transport Layer Security,传输层安全协议):用于两个应用程序之间提供保密性和数据完整性。(TSL其实是SSL标准化后的产物,即SSL/TSL)
"SSL和TSL可以粗浅理解为"一个东西",它俩是并列关系
最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。
HTTPS:HTTPS是兼容HTTP的,可以把HTTPS理解为'HTTP over TSL',即HTTPS是HTTP协议和TSL协议的组合。
HTTPS请求过程
HTTPS在传输数据时,同样会先建立TCP连接,建立起TCP连接后,会建立TSL连接,这个过程可以通过抓包查看:
请求可以为HTTPS请求验证SSL证书,就像web浏览器一样,SSL验证默认是开启的,
如果证书验证失败,请求会抛出SSLError:
>>>import requests
>>>requests.get('https:xxxx.com') #发起一个https请求
>>>requests.exceptions.SSLError: xxx
证书处理
证书处理(SSL Cert Verification)
很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书如知乎\百度 等都是可带可不带,但有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站。
官方文档解释如下:
关闭证书
代码示例:
# 1,关闭证书
res = requests.get(url="https://www.12306.cn",verify=False) #不验证证书,报警告,返回200
print(res.content.decode("utf-8"))
关闭警告(忽略警告信息InsecureRequestWarning)
import requests,warnings
from requests.packages import urllib3
# 关闭警告
urllib3.disable_warnings()
warnings.filterwarnings("ignore")
安装pyopenssl模块,可以验证证书(可以在请求中不用 verify=False)
代码示例:
# 安装pyopenssl模块,可以验证证书(可以在请求中不用 verify=False)
res = requests.get(url="https://www.12306.cn")
print(res.content.decode("utf-8"))
加上证书(找公司开发人员要 .crt文件 推荐)
代码示例:
# 3,加上证书,找公司开发人员要 .crt文件 推荐
res = requests.get(url="https://www.12306.cn",cert=("/路径/证书.crt","/路径/key"))
标签:TSL,HTTPS,证书,SSL,https,requests
From: https://www.cnblogs.com/upstudy/p/16712561.html