无头 chrome + 忽略证书错误

Posted

技术标签:

【中文标题】无头 chrome + 忽略证书错误【英文标题】:Headless chrome + ignore-certificate-errors 【发布时间】:2018-01-12 15:19:30 【问题描述】:

我需要使用 headless chrome 来忽略证书错误。在无头模式下运行时忽略该选项,并且驱动程序在导航到 https 资源时返回空的 html 正文标记。

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>

这就是我配置我的 chrome 驱动程序的方式。

 ChromeOptions chromeOptions = new ChromeOptions();
 chromeOptions.addArguments("--headless", "--disable-gpu", "--window-size=1920,1200","--ignore-certificate-errors");

 DesiredCapabilities cap=DesiredCapabilities.chrome();

 cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
 cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
 cap.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
 chromeHeadlessDriver = new ChromeDriver(cap);

This thread 确认 --ignore-certificate-errors 在无头模式下被忽略。

他们提到了devtool protocol。

我可以从 java 调用它吗?还有其他选择吗?

【问题讨论】:

对“acceptInsecureCerts”的支持将被添加到chromedriver bugs.chromium.org/p/chromium/issues/detail?id=721739 可以使用 Selenium 调用 DevTool API,并使用此端点:/session/:sessionId/chromium/send_command_and_get_result。此命令特定于 Chrome 驱动程序,尚未在客户端中实现。您可以通过重写命令执行器,用几行代码自己实现它。 【参考方案1】:

medium.com by sahajamit上有一篇很棒的文章

我已经测试了下面的代码,它与自签名证书 https://badssl.com/ 完美配合

    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    options.addArguments("--headless", "--window-size=1920,1200","--ignore-certificate-errors");

    DesiredCapabilities crcapabilities = DesiredCapabilities.chrome();
    crcapabilities.setCapability(ChromeOptions.CAPABILITY, options);
    crcapabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    crcapabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);

    System.setProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, "C:\\temp\\chrome\\chromedriver.log");
    System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, "C:\\temp\\chrome\\chromedriver.exe");

    ChromeDriverService service = null;
    try 
        service = new ChromeDriverService.Builder()
                .usingAnyFreePort()
                .withVerbose(true)
                .build();
        service.start();
     catch (IOException e) 
        e.printStackTrace();
    

    RemoteWebDriver driver = new RemoteWebDriver(service.getUrl(),crcapabilities);

    driver.get("https://self-signed.badssl.com/");
    System.out.println(driver.getPageSource());
    driver.quit();

软件/框架版本

谷歌浏览器版本 64.0.3282.186 Google Chrome 驱动程序版本 64.0.3282.186 Selenium 版本 3.11.0

【讨论】:

是的,它已在 chrome 65 中修复,已经在使用它。这是一个旧帖子。所有详细信息都在铬问题的链接中 我刚刚添加了这个供其他人参考:) @Amilakumura 你成就了我的一天!非常感谢!【参考方案2】:

@amila-kumara 正在工作,但使用 DesiredCapabilities.chrome() 会发出警告以使用 ChromeOptions。请查看更新后的答案。

设置 chrome 选项值

System.setProperty("webdriver.chrome.driver", Config.NDAC_WEBDRIVER_PATH);
ChromeOptions options = new ChromeOptions();
options.addArguments("--window-size=1920,1200");
options.setAcceptInsecureCerts(true);
options.setHeadless(true);

启动服务

ChromeDriverService service = null;
try 
    service = new ChromeDriverService.Builder()
            .usingAnyFreePort()
            .withVerbose(true)
            .build();
    service.start();
    remoteWebdriverUrl = service.getUrl();
    System.out.println("Starting the url " + remoteWebdriverUrl);
 catch (IOException e) 
    e.printStackTrace();

注意:我在关闭驱动程序时遇到了这个问题(使用 RemoteWebDriver),即使您使用 driver.quit(),chromedriver.exe 进程也不会关闭.要解决此问题,请使用 ChromeDriver 而不是 RemoteWebDriver

RemoteWebDriver driver = new ChromeDriver(service, options);

要正确关闭驱动程序,请使用

driver.close();
driver.quit();

【讨论】:

options.setAcceptInsecureCerts(true);救了我的命!!!谢谢。【参考方案3】:

这适用于我在 ChromeDriver 80 上。

ChromeOptions option = new ChromeOptions();
option.AddArgument("--headless");
option.AcceptInsecureCertificates = true;
driver = new ChromeDriver(option);

【讨论】:

以上是关于无头 chrome + 忽略证书错误的主要内容,如果未能解决你的问题,请参考以下文章

设置Chrome忽略网站证书错误

HttpClient 怎么忽略证书验证访问https

Chrome绕过HSTS抓取HTTPS

如何忽略windows10浏览器提示的证书错误

如何忽略windows10浏览器提示的证书错误

符合Chrome58的证书制作