Wie gehe ich mit Zertifikaten mit Selen um?

84

Ich verwende Selenium , um einen Browser zu starten. Wie kann ich mit den Webseiten (URLs) umgehen, die den Browser auffordern, ein Zertifikat zu akzeptieren oder nicht?

In Firefox kann eine solche Website mich auffordern, das folgende Zertifikat zu akzeptieren:

Feuerfuchs

Im Internet Explorer-Browser wird möglicherweise Folgendes angezeigt:

Geben Sie hier die Bildbeschreibung ein

Auf Google Chrome:

Google Chrome

Ich wiederhole meine Frage: Wie kann ich die Akzeptanz des Zertifikats einer Website automatisieren, wenn ich einen Browser (Internet Explorer, Firefox und Google Chrome) mit Selenium (Programmiersprache Python) starte ?

Peter Mortensen
quelle

Antworten:

138

Für den Firefox müssen Sie die accept_untrusted_certs FirefoxProfile()Option auf Folgendes setzen 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()

Für Chrome müssen Sie folgende Argumente hinzufügen :--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()

Für den Internet Explorer müssen Sie die acceptSslCertsgewünschte Funktion festlegen :

from selenium import webdriver

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

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

driver.close()

Laut Desired CapabilitiesDokumentation sollte die Einstellung acceptSslCertsauf Truefür alle Browser funktionieren, da es sich um eine generische Lese- / Schreibfunktion handelt:

acceptSslCerts

Boolescher Wert

Gibt an, ob die Sitzung standardmäßig alle SSL-Zertifikate akzeptieren soll.


Arbeitsdemo für Firefox:

>>> from selenium import webdriver

Einstellung acceptSslCertsauf False:

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

Einstellung acceptSslCertsauf True:

>>> 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()
Alecxe
quelle
12
Ich bin nicht in der Lage, es auf IE 11 zum
Laufen zu bringen
Für Firefox 48+ mit Geckodriver gibt es immer noch ein Problem. Dies ist ein offenes Problem in Geckodriver. Sie haben immer noch keine Ahnung davon. Siehe Bug Issue
Alter Hu,
6
Diese Antwort ist nicht mehr gültig, verwenden Sie ‚acceptInsecureCerts‘ statt
rtaft
2
Dieser Kommentar mag sehr spät sein, ist aber hilfreich für Leute, die die Frage jetzt erreichen. Ich habe alles versucht und nichts hat funktioniert. Nur geschafft, den Fehler zu bestehen mit:driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina
2
für chromedriver habe ich am Ende alle diese vier Zeichenfolgen an options.add_argument übergeben -> allow-running-insecure-contentund ignore-certificate-errorsund allow-insecure-localhostund unsafely-treat-insecure-origin-as-secure(Sie können versuchen, mehr zu finden durch: strings /opt/google/chrome/chrome | grep insecureund ähnliches Grepping)
pestophagous
8

Für Firefox:

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

Für Chrome können wir verwenden:

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

Für Internet Explorer können wir verwenden:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);      
Webdriver driver = new InternetExplorerDriver(capabilities);
Susanta Adhikary
quelle
4
Die Frage betraf Python. Sie könnten zumindest schreiben, welche Sprache das ist.
Benutzer1
1
Seien Sie vorsichtig, 'ProfilesIni' ist veraltet!
Happy Bird
Hoffe, dass die Java-Version ChromeOptions options = new ChromeOptions () helfen kann; options .addArguments ("- ignore-ssl-error = yes", "--ignore-certificate-error"); ChromeDriver-Treiber = neuer ChromeDriver (Optionen);
Roberto Petrilli
6

Für Firefox Python:

Der Firefox-Fehler mit selbstsignierten Zertifikaten wurde behoben: Akzeptieren Sie das SSL-Zertifikat mit dem Marionetten-Firefox-Webdrive-Python-Splitter

"acceptSslCerts" sollte durch "acceptInsecureCerts" ersetzt werden.

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")
Rémi Debette
quelle
1
Und jetzt ist Firefox 52 live. Aktualisieren Sie Firefox , Upgrade Selen auf v3.3, download geckodriver zu V0.15 und Sie brauchen noch nicht einmal den binären Pfad mehr!
Rémi Debette
4

Und in C # (.net Core) mit Selenium.Webdriverund Selenium.Chrome.Webdriverwie folgt:

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

Für Personen, die zu dieser Frage im Zusammenhang mit kopflosem Chrom über Python-Selen kommen, ist https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 möglicherweise hilfreich.

Es sieht so aus, als könnten Sie beides tun

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

oder etwas in der folgenden Richtung (muss möglicherweise für Python angepasst werden):

ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)
Ochse
quelle
3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);
Vasista TVN
quelle
1
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie in Zukunft die Frage an die Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Code-Vorschlag nicht kennen
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();
Jamil Aryan
quelle
2

Ich bin mit Selenium und Behat auf dasselbe Problem gestoßen. Wenn Sie die Parameter über übergeben möchten, behat.ymlmuss dies folgendermaßen aussehen:

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

Das Erstellen eines Profils und anschließend eines Treibers hilft uns, das Zertifikatproblem in Firefox zu umgehen:

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);
user2062360
quelle
3
Was ist mit Internet Explorer und Google Chrome?
1

In Selenpython müssen Sie Folgendes einstellen desired_capabilities:

desired_capabilities = {
    "acceptInsecureCerts": True
}
Nattster
quelle
1

Für diejenigen, die mit Firefox zu diesem Problem kommen und die oben genannten Lösungen nicht funktionieren, können Sie den folgenden Code ausprobieren (meine ursprüngliche Antwort ist hier ).

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)
C. Feng
quelle
0

Löschen Sie alle bis auf das erforderliche Zertifikat aus dem Zertifikatspeicher Ihres Browsers und konfigurieren Sie den Browser so, dass das Zertifikat automatisch ausgewählt wird, wenn nur ein Zertifikat vorhanden ist.

Gracefulcode
quelle
0

Nur ein Update zu diesem Thema.

Treiber erforderlich:

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)

Code

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();
HAT
quelle
0

Ich konnte dies auf .net c # mit PhantomJSDriver mit Selenium Web Driver 3.1 tun

 [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);
    }
user2728409
quelle
0

Immer wenn ich mit neueren Browsern auf dieses Problem stoße, verwende ich einfach AppRobotic Personal Edition, um auf bestimmte Bildschirmkoordinaten zu klicken, oder gehe durch die Schaltflächen und klicke auf.

Grundsätzlich wird nur die Makrofunktionalität verwendet, bei Headless-Setups funktioniert dies jedoch nicht.

James
quelle
0

Ich hatte genau das gleiche Problem. Als ich jedoch versuchte, die Website manuell im Browser zu öffnen, war das Zertifikat korrekt, aber im Detail lautete der Name "DONOTTRUST".

Der Unterschied zwischen den Zertifikaten wurde durch Fiddler verursacht, der im Hintergrund ausgeführt wurde und den gesamten HTTPS-Inhalt entschlüsselte, bevor er erneut verschlüsselt wurde.

Um mein Problem zu beheben, schließen Sie einfach Fiddler auf der Maschine. Wenn Sie Fiddler geöffnet lassen müssen, können Sie in den Fiddler-Einstellungen die Option SSL entschlüsseln deaktivieren.

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

Ich habe es für Java mit Chrome-Browser verwendet, es funktioniert gut

Ritesh
quelle
1
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
David Buck
-3

Es sieht so aus, als ob es immer noch keine Standardentscheidung für dieses Problem gibt. Mit anderen Worten - Sie können immer noch nicht sagen "Okay, machen Sie eine Zertifizierung, egal ob Sie Internet Explorer, Mozilla oder Google Chrome sind". Aber ich habe einen Beitrag gefunden, der zeigt, wie man das Problem in Mozilla Firefox umgeht. Wenn Sie daran interessiert sind, können Sie es hier überprüfen .

Stanimir Yakimov
quelle
Aber was ist mit dem obigen Code in Java? Jeder Browser wird aufgefordert, das Zertifikat der aktuell besuchten Website zu akzeptieren. Können wir das nicht auch in Python tun?