
本文详解如何在 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(推荐使用最新稳定版,旧版本可能存在兼容性问题)。
✅ 替代方案(更安全)
对于长期维护的项目,建议优先采用以下方式替代全局忽略证书:
立即学习“Python免费学习笔记(深入)”;
- 将目标站点的根证书添加至系统/Playwright 浏览器信任库;
- 使用 --ignore-certificate-errors 启动参数(仅限 Chromium)并配合 chromium.launch(..., args=["--ignore-certificate-errors"]) —— 但此方式粒度更粗,且 WebKit/Firefox 不支持;
- 在测试环境中部署有效 TLS 证书(如通过 mkcert 生成本地可信证书)。
总之,ignore_https_errors=True 是快速解耦网络证书问题的有效开关,但务必理解其安全含义,并在代码中添加清晰注释说明使用原因与限制范围。










