Python requests报403 SNI is required错误且pip安装包失败如何解决
报错成因
- 你使用的是Python 2.7旧版本,低于2.7.9版本的Python自带的ssl模块不支持SNI(服务器名称指示)扩展,而当前几乎所有主流HTTPS站点(包括PyPI源)都要求客户端必须支持SNI才能正常建立SSL连接,因此无论是requests发起请求还是pip拉取包都会触发SSL相关报错。
- 旧版本requests库依赖的底层SSL库版本过低,不支持现在站点普遍要求的TLS 1.2及以上协议版本,SSL握手阶段直接失败,抛出
tlsv1 alert internal error报错。 - 旧版本pip同样受底层ssl模块能力限制,访问PyPI的HTTPS地址时被服务端拦截,返回403错误提示SNI是必填项。
解决方案
- 方案一:升级Python版本
优先升级Python 2.7到最终版本2.7.18,该版本自带的ssl模块已经支持SNI和TLS 1.2,可以直接解决两个报错。如果条件允许,建议直接迁移到Python 3的稳定版本(如3.8+),Python 2已经在2020年停止官方维护,后续会持续遇到兼容性和安全问题。 - 方案二:手动安装SNI支持依赖(无法升级Python时使用)
因为当前pip无法访问HTTPS的PyPI源,可以临时使用国内HTTP源安装所需依赖,执行命令:pip install --index-url http://pypi.douban.com/simple/ --trusted-host pypi.douban.com pyopenssl ndg-httpsclient pyasn1
安装完成后,requests和pip就可以正常支持SNI,访问HTTPS站点。 - 方案三:临时禁用SSL校验(仅测试场景使用,禁止生产环境使用)
如果只是临时测试请求,不需要严格校验SSL证书,可以在requests请求中添加verify=False参数跳过证书校验,示例:requests.get("目标请求地址", verify=False)
内容的提问来源于stack exchange,提问作者Harshita
相关产品推荐
相关产品推荐

