Як поводитися із сертифікатами за допомогою селену?


84

Я використовую Selenium для запуску браузера. Як я можу мати справу з веб-сторінками (URL-адресами), які попросять браузер прийняти сертифікат чи ні?

У Firefox у мене може бути такий веб-сайт, який просить мене прийняти його сертифікат таким чином:

Firefox

У браузері Internet Explorer я можу отримати щось подібне:

Введіть тут опис зображення

У Google Chrome:

Гугл хром

Я повторюю своє запитання: Як я можу автоматизувати прийняття сертифіката веб-сайту під час запуску браузера (Internet Explorer, Firefox та Google Chrome) за допомогою Selenium (мова програмування Python) ?

Відповіді:


138

Для Firefox вам потрібно встановити accept_untrusted_certs FirefoxProfile()параметр 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

Установка acceptSslCertsдля 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()

Установка acceptSslCertsдля 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()

12
Я не можу змусити його працювати на IE 11, він просто продовжує показувати мені сторінку з помилкою сертифіката
estemendoza

Щодо Firefox 48+, що використовує geckodriver, проблема все ще є, це відкрита проблема в geckodriver, вони все ще не мають про неї уявлення, див. Випуск помилок
Alter Hu

6
Ця відповідь більше недійсна, натомість використовуйте 'acceptInsecureCerts'
rtaft

2
Цей коментар може бути дуже пізнім, але корисним для людей, які зараз відповідають на питання. Я спробував усе вищесказане і нічого не вийшло. Помилку вдалося передати лише з:driver.get("javascript:document.getElementById('overridelink').click()")
Дієго Ф Медіна

2
для chromedriver я в кінцевому підсумку передав усі ці чотири рядки до options.add_argument -> allow-running-insecure-contentта ignore-certificate-errorsі allow-insecure-localhostта unsafely-treat-insecure-origin-as-secure(ви можете спробувати знайти більше за допомогою: strings /opt/google/chrome/chrome | grep insecureта подібного грепінгу)
пестофаг

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

1
Будьте обережні, "ProfilesIni" застаріло!
Happy Bird

Сподіваюся, що версія Java може допомогти ChromeOptions options = new ChromeOptions (); options .addArguments ("- ignore-ssl-error = yes", "--ignore-certificate-error"); Драйвер ChromeDriver = новий ChromeDriver (опції);
Роберто Петріллі,

6

Для Firefox Python:

Виправлено помилку самоподписаного сертифіката Firefox : прийміть ssl-сертифікат з маріонетками firefox webdrive python splinter

"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, і вам навіть не потрібен двійковий шлях!
Rémi Debette

4

І в C # (ядро .net) за допомогою Selenium.Webdriverі Selenium.Chrome.Webdriverтак:

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

3

Для людей, які звертаються до цього питання, пов’язаного з безголовим хромом через пітон селен, вам може стати в нагоді 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
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання читачам у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду
Абхішек,

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

Я натрапив на те саме питання з Селеном та Бехатом. Якщо ви хочете передати параметри 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

У селеновому пітоні вам потрібно встановити 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

Я зміг зробити це на .net c # за допомогою PhantomJSDriver із веб-драйвером селену 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);
    }

0

Кожного разу, коли я стикаюся з цією проблемою з новішими браузерами, я просто використовую AppRobotic Personal Edition, щоб натискати певні координати екрана або клацнути вкладку за допомогою кнопок і натискати.

В основному він просто використовує свою макрофункціональність, але не працює на безголових настройках.


0

У мене була така сама проблема. Однак, коли я спробував відкрити веб-сайт вручну в браузері, сертифікат був правильним, але в деталях ім'я було "DONOTTRUST".

Різниця в сертифікаті була спричинена Fiddler, який працював у фоновому режимі та дешифрував весь вміст HTTPS перед його повторним шифруванням.

Щоб виправити мою проблему, просто закрийте Fiddler на машині. Якщо вам потрібно тримати Fiddler відкритим, ви можете зняти прапорець Дешифрувати SSL у налаштуваннях Fiddler.


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

Я використовував його для Java з браузером Chrome, він працює приємно


1
Хоча цей код може вирішити питання, включаючи пояснення того, як і чому це вирішує проблему, справді допомогло б поліпшити якість вашої публікації, і, можливо, призведе до збільшення кількості голосів. Пам’ятайте, що ви відповідаєте на запитання читачам у майбутньому, а не лише тому, хто задає зараз. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Девід Бак,

-3

Схоже, він все ще не має стандартного рішення цієї проблеми. Іншими словами - ви все ще не можете сказати "Добре, пройдіть сертифікацію, незалежно від того, чи є ви Internet Explorer, Mozilla або Google Chrome". Але я знайшов одне повідомлення, яке показує, як вирішити проблему в Mozilla Firefox. Якщо вас це цікавить, ви можете перевірити це тут .


Але як щодо наведеного вище коду, зробленого на Java? Він просить кожен браузер прийняти сертифікат поточного відвідуваного веб-сайту. Чи не можемо ми зробити те саме в Python?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.