在很多公司的具体接口测试业务中,内部的接口都不是随随便便写个脚本就可以请求通的。
很多时候需要client证书,跟着请求一起发出去,服务器那边检测通过,才可以正常给处理和返回。
当然,可能很多粉丝都说自己公司目前并没有需要这种证书,如果这种情况,那么建议也还是看一看本章节,起码混个眼熟。以后跳槽的新公司万一要用,自己也不至于大脑空白。
这个client证书从哪来呢?当然是从你们公司的开发手里要。那么要怎么使用呢?
在charles中,我们是打开后这样做:
(图中点击顶部菜单-Proxy-SSL_Proxying_Settings....)
这里就是上传证书的地方了。注意首次使用这个地方,还需要你设置密码才可以。
点击Add。
这里我们除了写*,代表所有请求都使用。
然后还要选择导入一个PEM 或者 P12, 这俩个就是证书了。俩个格式,任选其一,主要看开发给你的证书后缀是什么,是.p12就直接导入。是.pem,就先用pycharm打开,然后复制粘贴即可,导入后一路ok即可。
不过本教程中,如何使用charles并不是我们要研究的重点,而是要在平台上如何安装这个证书才是我们要做的事。
平台的底层,目前用的requests进行请求的,所以,我们得先来研究,request如何夹带证书。
按照官方说法,在reuqests里直接加上cert参数,值为证书的路径即可。
req = requests.get(url,headers = headers, cert='./Imapp/static/client.pem')
比如上面这句中,cert 的值 就是一个证书,注意这里的后缀是.pem的,经过作者亲测和落地,.pem格式证书才能使用在请求中。
如果开发给你的是.p12证书,那么你就需要去百度搜个转换算法,把这个.p12改成.pem了。(如果.p12可以用,欢迎小伙伴留言反馈,必有重谢。)
所以我们现在的设计就很明确了。
在每个项目内增加一个属性,就是证书的【名字】和【是否启用】选项。
不同项目的证书完全隔离,每个接口都可选是否启用证书。在项目设置里,设置上传证书功能。
好,那我们说干就干。
打开我们的用例设置html:P_project_set.html:
找到地方,设置一个上传文件的功能。
代码如下:
<form style="" id="upload_file" action="/cert_upload/{{ project.id }}/" method="post" enctype="multipart/form-data">
<input type="file" name="fileUpload" style="width: 20%;margin-left: 40%;border:1px solid #fcbfbf;"/>
<br>
<button type="submit" style="width: 20%;" class="btn" > 上传证书 </button>
</form>
效果如下:
注意代码中我的input的name是 fileUpload 之后我们在后台取的时候 要用这个。
然后去写urls.py吧:
注意,我们要带上这个项目id,以便后台使用。
然后去后台写好这个函数,views.py:
在开始写之前,我们要先设计好这个函数。
这个函数要做的是首先是把上传的证书 拿出来。
拿出来后,我们要进行保存到指定目录下。但是避免名称重复,所以我们在存的时候,会给原始的名字前面加上”项目id“ 来保存,而这种静态资源当然是保存到static目录下了。
选中一个.pem证书文件,点击上传按钮。
打印结果:
我在前面加上了CERT_13_作为前缀。这样用来区分我们后续的不同项目内的证书。
然后继续 写存储代码:
# 上传证书文件
def cert_upload(request,pid):
file = request.FILES.get("fileUpload", None) # 靠name获取上传的文件,如果没有,避免报错,设置成None
if not file:
return HttpResponseRedirect('/project_set/%s/'%pid) # 如果没有则返回
new_name = 'CERT_'+pid+'_'+str(file) # 设置好这个证书的名字
destination = open("MyApp/static/" + new_name, 'wb+') # 打开特定的文件进行二进制的写操作
for chunk in file.chunks(): # 分块写入文件
destination.write(chunk)
destination.close()
return HttpResponseRedirect('/project_set/%s/' % pid) # 正常返回
测试结果,成功:
本节内容到此结束。
下一节:我们在数据库中设置 端的 一个新属性:绑定的证书名。