Playwright Python 中处理 HTTPS 证书错误的完整解决方案

本文详解如何在 playwright(python)中正确配置 ignore_https_errors=true 以绕过 ssl 证书验证失败问题,并强调其适用场景、安全边界与最佳实践。

在使用 Playwright 进行自动化测试或网页抓取时,若目标网站使用自签名证书、过期证书或内部 CA 签发的非受信证书(例如开发环境、内网系统如 http://minha.anem.dz/pre_inscription),WebKit 或 Chromium 浏览器实例会因 SSL/TLS 握手失败而抛出如下错误:

playwright._impl._errors.Error: SSL peer certificate or SSH remote key was not OK

⚠️ 注意:该错误实际发生在 HTTPS 请求阶段(即使 URL 写的是 http://,但页面可能重定向至 https://,或资源加载了 HTTPS 子资源)。因此,仅修改 URL 协议无法根本解决。

✅ 正确解决方案:在 browser.new_context() 中启用证书忽略

关键在于将 ignore_https_errors=True 传入 new_context() 方法(而非 launch()),因为该参数控制的是上下文级网络请求策略,影响所有后续页面导航与资源加载:

import asyncio
from playwright.async_api import async_playwright, Playwright

async def run(playwright: Playwright):
    browser = await playwright.webkit.launch(headless=False)  # 也可用 chromium/firefox
    # ✅ 正确位置:在 new_context() 中设置 ignore_https_errors=True
    context = await browser.new_context(ignore_https_errors=True)
    page = await context.new_page()

    # 即使页面重定向到 HTTPS 或加载 HTTPS 资源,也不会中断
    await page.goto("http://minha.anem.dz/pre_inscription")

    # 可选:验证是否生效(检查控制台是否仍有证书警告)
    await page.screenshot(path="success.png")
    await browser.close()

async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

⚠️ 重要注意事项

  • ignore_https_errors=True 仅适用于调试与受控环境(如测试内网系统、本地开发服务器),绝不可用于生产环境或涉及用户敏感数据的场景,否则将导致中间人攻击(MITM)风险。
  • 该参数对 page.goto()、page.wait_for_response()、APIRequestContext 等所有上下文内网络操作均生效。
  • 若仍报错,请确认:
    • 是否误将 ignore_https_errors=True 错置于 browser.launch()(该参数不被支持);
    • 目标站点是否强制 HSTS(HTTP Strict Transport Security),此时浏览器可能拒绝降级到 HTTP —— 此时需确保 URL 明确为 https:// 并配合 ignore_https_errors=True;
    • Playwright 版本 ≥ 1.20(推荐使用最新稳定版,旧版本可能存在兼容性问题)。

✅ 替代方案(更安全)

对于长期维护的项目,建议优先采用以下方式替代全局忽略证书:

  • 将目标站点的根证书添加至系统/Playwright 浏览器信任库;
  • 使用 --ignore-certificate-errors 启动参数(仅限 Chromium)并配合 chromium.launch(..., args=["--ignore-certificate-errors"]) —— 但此方式粒度更粗,且 WebKit/Firefox 不支持;
  • 在测试环境中部署有效 TLS 证书(如通过 mkcert 生成本地可信证书)。

总之,ignore_https_errors=True 是快速解耦网络证书问题的有效开关,但务必理解其安全含义,并在代码中添加清晰注释说明使用原因与限制范围。