You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:59:19