Jak radzić sobie z certyfikatami przy użyciu Selenium?

86

Używam Selenium do uruchomienia przeglądarki. Jak radzić sobie ze stronami internetowymi (adresami URL), które będą prosić przeglądarkę o zaakceptowanie certyfikatu lub nie?

W przeglądarce Firefox może być taka witryna, która prosi mnie o zaakceptowanie jej certyfikatu w następujący sposób:

Firefox

W przeglądarce Internet Explorer może pojawić się coś takiego:

Wprowadź tutaj opis obrazu

W Google Chrome:

Google Chrome

Powtarzam pytanie: Jak mogę zautomatyzować akceptację certyfikatu strony internetowej, gdy uruchamiam przeglądarkę (Internet Explorer, Firefox i Google Chrome) z Selenium (język programowania Python) ?

Peter Mortensen
źródło

Odpowiedzi:

143

W przeglądarce Firefox musisz ustawić accept_untrusted_certs FirefoxProfile()opcję 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()

W przypadku przeglądarki Chrome musisz dodać argument:--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()

W przypadku przeglądarki Internet Explorer musisz ustawić acceptSslCertsżądane możliwości:

from selenium import webdriver

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

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

driver.close()

Właściwie, zgodnie z Desired Capabilitiesdokumentacją , ustawienie opcji acceptSslCertsna Truepowinno działać dla wszystkich przeglądarek, ponieważ jest to ogólna możliwość odczytu / zapisu:

acceptSslCerts

boolean

Określa, czy sesja powinna domyślnie akceptować wszystkie certyfikaty SSL.


Działające demo dla przeglądarki Firefox:

>>> from selenium import webdriver

Ustawienie acceptSslCertsna 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()

Ustawienie acceptSslCertsna 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
źródło
12
Nie jestem w stanie zrobić to działa na IE 11, to po prostu utrzymuje pokazując mi stronę Błąd certyfikatu
estemendoza
Dla firefox 48+ korzystania geckodriver wciąż mają problem, to jest sprawa otwarta w geckodriver, wciąż nie mają pomysłu na to, patrz Issue Bug
Alter Hu
6
Ta odpowiedź nie jest już prawidłowa, użyj zamiast niej „acceptInsecureCerts”
rtaft
2
Ten komentarz może być bardzo późny, ale pomocny dla osób, które teraz sięgają do pytania. Wypróbowałem wszystkie powyższe i nic nie działało. Udało się tylko zdać błąd z:driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina
3
dla chromedriver przekazałem wszystkie te cztery ciągi do options.add_argument -> allow-running-insecure-contentand ignore-certificate-errorsand allow-insecure-localhostand unsafely-treat-insecure-origin-as-secure(możesz spróbować znaleźć więcej przez: strings /opt/google/chrome/chrome | grep insecurei podobne grepping)
pestophagous
8

W przeglądarce Firefox:

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

W przypadku Chrome możemy użyć:

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

W przeglądarce Internet Explorer możemy użyć:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);      
Webdriver driver = new InternetExplorerDriver(capabilities);
Susanta Adhikary
źródło
4
Pytanie dotyczyło Pythona. Mógłbyś przynajmniej napisać, jaki to język.
użytkownik1
1
Uważaj, „ProfilesIni” jest przestarzałe!
Happy Bird
Mam nadzieję, że wersja java może pomóc w ChromeOptions options = new ChromeOptions (); opcje .addArguments ("- ignore-ssl-errors = yes", "--ignore-certificate-errors"); Sterownik ChromeDriver = nowy ChromeDriver (opcje);
Roberto Petrilli
6

W przeglądarce Firefox Python:

Błąd certyfikatu z podpisem własnym Firefoksa został już naprawiony: akceptuj certyfikat SSL za pomocą Marionette Firefox Webdrive Python Splinter

„acceptSslCerts” należy zastąpić wyrażeniem „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")
Rémi Debette
źródło
1
A teraz Firefox 52 jest dostępny. Uaktualnij Firefoksa , uaktualnij selen do v3.3, pobierz geckodriver do v0.15 i nie potrzebujesz już nawet ścieżki binarnej!
Rémi Debette
4

A w C # (.net core) używając Selenium.Webdriveri Selenium.Chrome.Webdrivertak:

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

Dla osób, które przychodzą do tego pytania związanego z bezgłowym chromem za pomocą selenu Pythona, przydatne może być https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 .

Wygląda na to, że możesz to zrobić

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

lub coś podobnego do następującego (może wymagać dostosowania do Pythona):

ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)
oxer
źródło
3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);
Vasista TVN
źródło
1
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod
Ak47
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
źródło
2

Napotkałem ten sam problem z Selenium i Behat. Jeśli chcesz przekazać parametry przez behat.yml, oto jak to powinno wyglądać:

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my-app.com
            default_session: selenium2
            selenium2:
                browser: firefox
                capabilities:
                    extra_capabilities:
                        acceptInsecureCerts: true
Chris
źródło
1

Utworzenie profilu, a następnie sterownika pomaga nam ominąć problem z certyfikatem w przeglądarce Firefox:

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);
user2062360
źródło
3
a co z Internet Explorerem i Google Chrome?
1

W pytonie selenowym musisz ustawić desired_capabilitiesjako:

desired_capabilities = {
    "acceptInsecureCerts": True
}
nattster
źródło
1

Dla tych, którzy przychodzą do tego problemu za pomocą przeglądarki Firefox i powyższe rozwiązania nie działają, możesz wypróbować poniższy kod (moja oryginalna odpowiedź jest tutaj ).

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
źródło
0

Usuń wszystkie certyfikaty oprócz niezbędnego z magazynu certyfikatów przeglądarki, a następnie skonfiguruj przeglądarkę tak, aby automatycznie wybierała certyfikat, gdy obecny jest tylko jeden certyfikat.

wdzięczny kod
źródło
0

Tylko aktualizacja dotycząca tego problemu.

Wymagaj sterowników:

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)

Kod

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();
HA S
źródło
0

Udało mi się to zrobić na .net c # z PhantomJSDriver z selenowym sterownikiem sieciowym 3.1

 [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
źródło
0

Ilekroć napotykam ten problem w nowszych przeglądarkach, po prostu używam wersji AppRobotic Personal, aby klikać określone współrzędne ekranu lub zakładać przyciski i klikać.

Zasadniczo używa tylko funkcji makr, ale nie będzie działać w konfiguracjach bezgłowych.

James
źródło
0

Miałem dokładnie ten sam problem. Jednak gdy próbowałem otworzyć stronę ręcznie w przeglądarce, certyfikat był poprawny, ale w szczegółach nazwa brzmiała „NIE ZAUFAJ”.

Różnica w certyfikacie została spowodowana przez Fiddlera, który działał w tle i odszyfrowywał całą zawartość HTTPS przed jej ponownym zaszyfrowaniem.

Aby naprawić mój problem, po prostu zamknij aplikację Fiddler na komputerze. Jeśli chcesz, aby Fiddler był otwarty, możesz odznaczyć Odszyfruj SSL w Ustawieniach Fiddlera.

glautrou
źródło
0
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--ignore-certificate-errors");
driver = new ChromeDriver(options);

Użyłem go do Java z przeglądarką Chrome, działa dobrze

Ritesh
źródło
1
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Zmień swoją odpowiedź, aby dodać wyjaśnienia i wskazać, jakie ograniczenia i założenia mają zastosowanie.
David Buck
-3

Wygląda na to, że nadal nie ma standardowej decyzji dotyczącej tego problemu. Innymi słowy - nadal nie możesz powiedzieć „OK, zrób certyfikat, bez względu na to, czy jesteś Internet Explorer, Mozilla czy Google Chrome”. Ale znalazłem jeden post, który pokazuje, jak obejść problem w Mozilla Firefox. Jeśli jesteś tym zainteresowany, możesz to sprawdzić tutaj .

Stanimira Jakimowa
źródło
Ale co z powyższym kodem wykonanym w Javie? Prosi każdą przeglądarkę o zaakceptowanie certyfikatu aktualnie odwiedzanej witryny. Czy nie możemy zrobić tego samego w Pythonie?