本文详解如何在 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 协议无法根本解决。
关键
在于将 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 是快速解耦网络证书问题的有效开关,但务必理解其安全含义,并在代码中添加清晰注释说明使用原因与限制范围。