如何使用Python Requests通过带密码的自签名证书认证访问IIS服务器
使用Python Requests通过自签名证书向IIS发送HTTPS请求并完成认证
看起来你已经走对了第一步——生成了自签名证书和密钥,接下来咱们一步步把这个客户端证书认证在Requests里跑通,同时处理好响应解析:
先确认证书文件的状态
你提到用plainkey.pem作为私钥参数,我猜这应该是你把带密码的TestPrivateKey.pem转换成无密码版本后的文件?如果还没做这一步,先通过OpenSSL命令去掉私钥的密码(脚本自动化运行时,带密码的私钥需要额外处理,无密码版本更方便):
C:\OpenSSL-Win64\bin>openssl rsa -in TestPrivateKey.pem -out plainkey.pem
运行时会提示你输入证书的原始密码,输入后就能得到无密码的私钥文件。
方式一:直接用cert参数(无密码私钥场景)
这是最直接的用法,把证书和私钥的路径组成元组传给cert参数,同时处理服务器自签名证书的验证问题:
import requests # 替换成你的IIS服务器实际URL target_url = "https://your-iis-server-domain/your-endpoint" # 证书和私钥的路径元组 client_cert = ("path/to/TestPublicKey.pem", "path/to/plainkey.pem") try: # 这里有两种验证服务器证书的方式: # 1. 禁用验证(不太安全,适合测试):verify=False # 2. 让Requests信任你的自签名证书(推荐):传入证书路径 response = requests.get(target_url, cert=client_cert, verify="path/to/TestPublicKey.pem") # 检查请求是否成功(如果返回4xx/5xx状态码会抛出异常) response.raise_for_status() # 解析响应内容,根据实际格式调整 if "application/json" in response.headers.get("Content-Type", ""): parsed_data = response.json() print("解析后的JSON响应:", parsed_data) else: print("响应文本内容:", response.text) except requests.exceptions.RequestException as e: print(f"请求过程中出错:{str(e)}")
方式二:处理带密码的私钥(不想转换无密码版本时)
如果想保留私钥的密码,就需要用ssl.SSLContext来手动加载证书和密钥,指定密码后传给Requests:
import requests import ssl target_url = "https://your-iis-server-domain/your-endpoint" cert_file = "path/to/TestPublicKey.pem" key_file = "path/to/TestPrivateKey.pem" cert_password = "your-cert-password-here" # 替换成你的证书密码 # 创建SSL上下文并加载客户端证书和带密码的私钥 tls_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) tls_context.load_cert_chain(certfile=cert_file, keyfile=key_file, password=cert_password) # 加载信任的自签名证书,验证服务器身份 tls_context.load_verify_locations("path/to/TestPublicKey.pem") try: response = requests.get(target_url, ssl_context=tls_context) response.raise_for_status() # 解析响应 if "application/json" in response.headers.get("Content-Type", ""): parsed_data = response.json() print("解析后的JSON响应:", parsed_data) else: print("响应文本内容:", response.text) except requests.exceptions.RequestException as e: print(f"请求过程中出错:{str(e)}")
IIS服务器端的关键配置(别漏了!)
客户端配置好后,IIS这边也得跟上:
- 打开对应站点的SSL设置,勾选“要求SSL”,然后把“客户端证书”设置为“接受”或“要求”(根据你的业务需求)。
- 把你的
TestPublicKey.pem导入到IIS服务器的受信任的根证书颁发机构中,否则服务器会拒绝这个自签名的客户端证书。
几个关键点提醒
cert参数只接受两种格式:单个包含证书和密钥的PEM文件,或者(证书路径,私钥路径)的元组。verify参数设为False会跳过服务器证书验证,虽然测试时方便,但生产环境强烈建议传入自签名证书路径来验证服务器身份。- 如果请求失败,先检查证书路径是否正确、IIS的客户端证书配置是否生效、服务器是否信任你的自签名证书。
内容的提问来源于stack exchange,提问作者Auto-learner
相关产品推荐
相关产品推荐

