首页 > 编程语言 >Python requests库指定IP请求,并使用HTTPS证书验证

Python requests库指定IP请求,并使用HTTPS证书验证

时间:2022-12-22 21:56:19浏览次数:67  
标签:HTTPS Python IP self hostname https requests com pool

背景

运维同学通过网关平台下发nginx配置文件,下发的过程是先灰度发布,发灰度机器,然后需要验证域名的请求是否正常,然后在下发其他生产机器,但是验证过程是人为操作,这就不可避免的会有些同学不进行验证,点击“继续”发布,如果出现问题将是灾难性的(别问为什么是灾难性的)。
为了避免这个问题的出现,发布平台添加自动校验的过程,也就是在灰度机器发完,点击继续时,网关平台会将重点域名进行准确性校验,但是只验证连通性和证书,不会进行具体数据的验证。

过程

一般人工校验都是本地配置DNS解析(/etc/hosts),在通过域名请求,使域名打到目标机器上。如果是机器自动校验还是要配置DNS解析就难免有些不够便利
所以还是想通过参数传入目标IP的形式,使重点域名可以达到目标机器上

代码

按照以下代码可以实现流量打到目标机器

response = requests.request("GET", "https://10.12.13.14/healthcheck", headers={'Host':'www.nginxtest.com'}, data={}, verify = False)

但是如果是https,必须得指定verify=false,禁用证书校验。但是却违背了我们的意愿
因为在requests校验证书不会从headers里取,只会从url中取,所以会报无法匹配10.12.13.14的证书

有两种方式去解决
本环境是Python2的环境,与Python3稍微有些差别,已经标出。

方法1

使用requests的底层 urllib3

import urllib3

pool = urllib3.HTTPSConnectionPool("123.456.23.123",assert_hostname="nginxtest.com")
# pool = urllib3.HTTPSConnectionPool("123.456.23.123",assert_hostname="nginxtest.com", server_hostname="nginxtest.com" ) 
# 注释掉的是Python3的写法,Python2 如果这么写会报 TypeError: __init__() got an unexpected keyword argument 'server_hostname'

ss = pool.urlopen("GET","/healthcheck",headers={"Host": "nginxtest.com"},assert_same_host=False)

print(ss.status)

方法2

用urllib3 封装 HTTPAdapter

# 封装函数 resolved_ip是目标IP
import requests

class HostHeaderSSLAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, resolved_ip):
        super(HostHeaderSSLAdapter,self).__init__()    #python2 
        #super().__init__()                                         #python3
        self.resolved_ip = resolved_ip

    def send(self, request, **kwargs):
        from urlparse import urlparse                       #python2
        #from urllib.parse import urlparse                 #python3

        connection_pool_kwargs = self.poolmanager.connection_pool_kw

        result = urlparse(request.url)

        if result.scheme == 'https' and self.resolved_ip:
            request.url = request.url.replace(
                'https://' + result.hostname,
                'https://' + self.resolved_ip,
            )
            #connection_pool_kwargs['server_hostname'] = result.hostname  # SNI  python2 需要屏蔽掉 不然会报 非预期的字段 key_server_hostname
            connection_pool_kwargs['assert_hostname'] = result.hostname
            # overwrite the host header
            request.headers['Host'] = result.hostname
        else:
            # theses headers from a previous request may have been left
            #connection_pool_kwargs.pop('server_hostname', None)            #python2 需要屏蔽掉
            connection_pool_kwargs.pop('assert_hostname', None)
           
        return super(HostHeaderSSLAdapter, self).send(request, **kwargs)

#使用-------------------------------------------------------------------------->
            url = "https://nginxtest.com/healthcheck" 
            session = requests.Session()
            session.mount('https://', HostHeaderSSLAdapter("123.456.23.123"))
            try:
                r = session.get(url)
            except Exception as e:
                return  "err : "+ str(e)
            if  r.status_code != 200:
                return "not 200 " + "resp : "+ r.text

以上就是整个解决过程
参考引用:
https://www.zhihu.com/question/266700601/answer/2263452766
https://stackoverflow.com/questions/22609385/python-requests-library-define-specific-dns

标签:HTTPS,Python,IP,self,hostname,https,requests,com,pool
From: https://www.cnblogs.com/zhaosc-haha/p/16999583.html

相关文章

  • JavaScript 数组结构与树结构的转换
    前言作为前端开发的同学,在与后端进行数据联调的时候,我们前端的同学处理Array数组结构的数据是最多的,list、table、card各种需要遍历的展示显示我们都会用数组来处理。当数......
  • python中单下划线与双下划线命名变量的作用与区别
    在python中有一些与下划线相关的约定,这是一个有趣的主题,值得分析分析。对于变量前面有一个下划线,大家都知道这意味着这个变量是类内私有变量,但是奇怪的是这样的类内变量是......
  • 【Python爬虫课程设计】BiliBili UP主数据——绘制数据柱状图和词云
    一、选题的背景1.背景:哔哩哔哩(www.bilibili.com,英文名称:bilibili,简称B站)现为中国年轻世代高度聚集的文化社区和视频平台,该网站于2009年6月26日创建。B站早期是一个ACG(动......
  • JavaScript-DOM基础【获取元素和对其属性/事件的操作】
     文档对象模型(DocumentObjectModel,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。W3C已经定义了一系列的DOM接口,通过这些DOM接口可以......
  • 教你用JavaScript实现鼠标特效
    案例介绍欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个鼠标爱心特效。鼠标在页面移动时会出现彩色爱心特效。通过实战我......
  • Python安装
    1、安装包:https://pan.baidu.com/s/1Y5J_9-RNCpIJK9GfeoJhNA2、下载完成后双击执行下载的exe程序,进入安装界面。安装界面可以选择默认安装,也可以自定义安装,我比较喜欢自定义......
  • k8s域名解析错误:pod中/etc/reslove.conf中nameserver和kube-dns中ip不一致
    问题:k8s集群中,某台node节点上,dns解析失败,进入pod中查看/etc/reslove.conf中nameserver和kube-dns不一致,如图: pod中如下:   kube-dns如下:   造成这种......
  • NOIP2022游记
    当时考完记错了一个地方,真的以为自己退役了,哭到不能自已,感谢上帝,感谢OI,感谢自己再给自己一个追逐梦想的机会。Day-1离开考还有两天的晚上,宿舍在讨论奇奇怪怪的话题,内容......
  • 教你用JavaScript实现鼠标特效
    案例介绍欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个鼠标爱心特效。鼠标在页面移动时会出现彩色爱心特效。通过实战......
  • Python|文件处理与数据库编程
    某农带专业Python课实验三txt文件处理题目描述:编程新建一个名为test.txt文件,存放在代码文件所在目录中,并且打开该文件。然后写入如图1-1所示内容到文件中。最后分别读......