如何使用硒处理证书?


84

我正在使用Selenium启动浏览器。如何处理要求浏览器接受证书的网页(URL)?

在Firefox中,我可能有一个类似的网站要求我接受这样的证书:

火狐浏览器

在Internet Explorer浏览器上,我可能会得到以下信息:

在此处输入图片说明

在谷歌浏览器上:

谷歌浏览器

我重复我的问题:当我启动使用Selenium(Python编程语言)的浏览器(Internet Explorer,Firefox和Google Chrome)时,如何自动接受网站的证书

Answers:


138

对于Firefox,您需要将accept_untrusted_certs FirefoxProfile()option设置为True

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True

driver = webdriver.Firefox(firefox_profile=profile)
driver.get('https://cacert.org/')

driver.close()

对于Chrome,您需要添加参数:--ignore-certificate-errors ChromeOptions()

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')

driver = webdriver.Chrome(chrome_options=options)
driver.get('https://cacert.org/')

driver.close()

对于Internet Explorer,您需要设置acceptSslCerts所需的功能:

from selenium import webdriver

capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True

driver = webdriver.Ie(capabilities=capabilities)
driver.get('https://cacert.org/')

driver.close()

实际上,根据Desired Capabilities文档,将acceptSslCerts功能设置为True应该适用于所有浏览器,因为它是通用的读/写功能:

acceptSslCerts

布尔值

默认情况下,会话是否应接受所有SSL证书。


Firefox的工作演示:

>>> from selenium import webdriver

设置acceptSslCertsFalse

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = False
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Untrusted Connection
>>> driver.close()

设置acceptSslCertsTrue

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = True
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Welcome to CAcert.org
>>> driver.close()

12
我无法使其在IE 11上正常运行,它只会向我显示证书错误页面
estemendoza 2014年

对于使用geckodriver的firefox 48+仍然存在问题,这是geckodriver中的未解决问题,他们仍然不知道,请参见Bug Issue
Alter Hu

6
这个答案是不再有效,使用“acceptInsecureCerts”,而不是
rtaft

2
此评论可能很晚,但对于现在提出问题的人们很有帮助。我尝试了以上所有方法,但没有任何效果。仅设法通过以下方式通过了错误:driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina,

2
对于chromedriver我结束了所有这四个字符串传递给options.add_argument - >allow-running-insecure-contentignore-certificate-errorsallow-insecure-localhostunsafely-treat-insecure-origin-as-secure(你可以尝试寻找更多:strings /opt/google/chrome/chrome | grep insecure和类似grepping)
pestophagous

8

对于Firefox:

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("default");
myprofile.setAcceptUntrustedCertificates(true);
myprofile.setAssumeUntrustedCertificateIssuer(true);
WebDriver driver = new FirefoxDriver(myprofile);

对于Chrome,我们可以使用:

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);

对于Internet Explorer,我们可以使用:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);      
Webdriver driver = new InternetExplorerDriver(capabilities);

4
问题是关于Python。你至少可以写下那是什么语言。
user1 2013年

1
注意,“ ProfilesIni”已弃用!
快乐鸟

希望Java版本可以帮助ChromeOptions options = new ChromeOptions(); 选项.addArguments(“-ignore-ssl-errors = yes”,“ --ignore-certificate-errors”); ChromeDriver驱动程序=新的C​​hromeDriver(选项);
罗伯托·佩特里里

6

对于Firefox Python:

Firefox自签名证书错误现已修复: 用木偶版firefox Webdrive python splinter接受ssl cert

“ acceptSslCerts”应替换为“ acceptInsecureCerts”

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

caps = DesiredCapabilities.FIREFOX.copy()
caps['acceptInsecureCerts'] = True
ff_binary = FirefoxBinary("path to the Nightly binary")

driver = webdriver.Firefox(firefox_binary=ff_binary, capabilities=caps)
driver.get("https://expired.badssl.com")

1
现在Firefox 52已发布。升级Firefox,将升级到v3.3,将geckodriver下载到v0.15,您甚至不需要二进制路径!
雷米Debette

4

在C#(。net核心)中,使用Selenium.WebdriverSelenium.Chrome.Webdriver像这样:

ChromeOptions options = new ChromeOptions();
options.AddArgument("--ignore-certificate-errors");
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),options))
{ 
  ...
}

3

对于通过python硒来解决与无头铬相关的问题的人,您可能会发现https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102很有用。

看来您可以

chrome_options = Options()
chrome_options.add_argument('--allow-insecure-localhost')

或类似以下内容的内容(可能需要适应python):

ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)

3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);

1
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而那些人可能不知道您提出代码建议的原因
Abhishek

2

Javascript:

const capabilities = webdriver.Capabilities.phantomjs();
capabilities.set(webdriver.Capability.ACCEPT_SSL_CERTS, true);
capabilities.set(webdriver.Capability.SECURE_SSL, false);
capabilities.set('phantomjs.cli.args', ['--web-security=no', '--ssl-protocol=any', '--ignore-ssl-errors=yes']);
const driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome(), capabilities).build();

2

我遇到了Selenium和Behat的同一问题。如果您想通过传递参数behat.yml,则其外观如下所示:

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my-app.com
            default_session: selenium2
            selenium2:
                browser: firefox
                capabilities:
                    extra_capabilities:
                        acceptInsecureCerts: true

1

创建配置文件,然后创建驱动程序可帮助我们解决Firefox中的证书问题:

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);

3
Internet Explorer和Google Chrome呢?

1

在Selenium python中,您需要设置desired_capabilities为:

desired_capabilities = {
    "acceptInsecureCerts": True
}

1

对于那些谁对这个问题来使用的Firefox和上述解决方案不起作用,您可以尝试下面的(我原来的答复是代码在这里)。

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.DEFAULT_PREFERENCES['frozen']['marionette.contentListener'] = True
profile.DEFAULT_PREFERENCES['frozen']['network.stricttransportsecurity.preloadlist'] = False
profile.DEFAULT_PREFERENCES['frozen']['security.cert_pinning.enforcement_level'] = 0
profile.set_preference('webdriver_assume_untrusted_issuer', False)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", temp_folder)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
                   "text/plain, image/png")
driver = webdriver.Firefox(firefox_profile=profile)

0

从浏览器的证书存储中删除所有证书(必要的证书除外),然后将浏览器配置为在仅存在一个证书时自动选择证书。


0

只是有关此问题的更新。

需要驱动程序:

Linux: Centos 7 64bit, Window 7 64bit

Firefox: 52.0.3

Selenium Webdriver: 3.4.0 (Windows), 3.8.1 (Linux Centos)

GeckoDriver: v0.16.0 (Windows), v0.17.0 (Linux Centos)

System.setProperty("webdriver.gecko.driver", "/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver");

ProfilesIni ini = new ProfilesIni();


// Change the profile name to your own. The profile name can 
// be found under .mozilla folder ~/.mozilla/firefox/profile. 
// See you profile.ini for the default profile name

FirefoxProfile profile = ini.getProfile("default"); 

DesiredCapabilities cap = new DesiredCapabilities();
cap.setAcceptInsecureCerts(true);

FirefoxBinary firefoxBinary = new FirefoxBinary();

GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary)
    .usingDriverExecutable(new 
File("/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver"))
    .usingAnyFreePort()
    .usingAnyFreePort()
    .build();
try {
    service.start();
} catch (IOException e) {
    e.printStackTrace();
}

FirefoxOptions options = new FirefoxOptions().setBinary(firefoxBinary).setProfile(profile).addCapabilities(cap);

driver = new FirefoxDriver(options);
driver.get("https://www.google.com");

System.out.println("Life Title -> " + driver.getTitle());
driver.close();

0

我能够使用带有硒Web驱动程序3.1的PhantomJSDriver在.net c#上执行此操作

 [TestMethod]
    public void headless()
    {


        var driverService = PhantomJSDriverService.CreateDefaultService(@"C:\Driver\phantomjs\");
        driverService.SuppressInitialDiagnosticInformation = true;
        driverService.AddArgument("--web-security=no");
        driverService.AddArgument("--ignore-ssl-errors=yes");
        driver = new PhantomJSDriver(driverService);

        driver.Navigate().GoToUrl("XXXXXX.aspx");

        Thread.Sleep(6000);
    }

0

每当我在较新的浏览器中遇到此问题时,我都使用AppRobotic Personal版本单击特定的屏幕坐标,或通过按钮进行选择并单击。

基本上,它仅使用其宏功能,但在无头设置中将无法使用。


0

我有完全一样的问题。但是,当我尝试在浏览器中手动打开网站时,证书是正确的,但在详细信息中,名称为“ DONOTTRUST”。

证书的差异是由Fiddler在后台运行并在重新加密之前解密所有HTTPS内容引起的。

要解决我的问题,只需在机器上关闭Fiddler。如果需要保持Fiddler处于打开状态,则可以在Fiddler Settings中取消选中Decrypt SSL。


0
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--ignore-certificate-errors");
driver = new ChromeDriver(options);

我已经将其用于Java和Chrome浏览器,效果很好


1
尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
David Buck

-3

似乎仍然没有关于此问题的标准决定。换句话说,无论您是Internet Explorer,Mozilla还是Google Chrome,您仍然不能说“好的,请进行认证”。但是我发现了一篇帖子,展示了如何在Mozilla Firefox中解决该问题。如果您对此感兴趣,可以在此处进行检查。


但是上面用Java完成的代码呢?它要求每个浏览器接受当前访问的网站的证书。我们不能在Python中做同样的事情吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.