Аутентификация Selenium WebDriver (Java) с сертификатом.p12
Я провел пару дней в поисках решения для этого.
У меня есть проект, для которого я пытаюсь создать набор тестов Selenium WebDriver. Этот сайт предназначен для защиты двухфакторной аутентификацией. Два фактора будут использоваться для доставки сертификата, который будет аутентифицироваться на сервере.
На данный момент у нас есть это так, чтобы мы получили доступ к серверу с URL, начинающимся с "https: //". Когда мы идем по URL (в Firefox), мы видим всплывающее окно с надписью "Запрос идентификации пользователя" с выпадающим списком с надписью "Выберите сертификат для представления в качестве идентификации:".
Ранее я добавил сертификат (помеченный как "client1.p12"), выбрав "Параметры" -> "Конфиденциальность и безопасность" -> "Сертификаты" -> "Просмотр сертификатов", выбрав вкладку "Ваши сертификаты", нажав "Импорт" и перейдя к "client1". p12 "файл и ввод пароля. Таким образом, теперь я вижу соответствующий сертификат в раскрывающемся списке "Выберите сертификат для представления...".
У меня вопрос, как мне настроить Selenium WebDriver для выбора сертификата. Описанное выше всплывающее окно - это компонент Windows (не HTML), поэтому я не могу просто щелкнуть и выбрать сертификат. Я также пытаюсь использовать безголовый вариант для geckodriver.
Лучшее решение, которое мне удалось найти, заключалось в следующем:
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability("ssl-client-certificate-file", "<path-to-client1.p12>");
capabilities.setCapability("ssl-client-key-passphrase", "<password>");
WebDriver driver = new FirefoxDriver(capabilities);
driver.get(<url>);
К сожалению, я получаю "org.openqa.selenium.WebDriverException" в последней строке, "driver.get();"
1 ответ
Я выяснил частичное решение. В других обстоятельствах это может быть все, что мне нужно, но, по причинам, которые я опишу в конце, этого здесь недостаточно.
У этой проблемы было две стороны. Сначала мне нужно было настроить Selenium на прием сертификата сервера. Во-вторых, мне нужно было заставить Selenium доставить сертификат.p12 на сервер.
Чтобы принять сертификат сервера, я сделал что-то вроде следующего:
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
. . .
FirefoxOptions firefoxOptions = new FirefoxOptions();
. . .
firefoxOptions.addCapabilities(capabilities);
. . .
driver = new FirefoxDriver(firefoxOptions);
. . .
driver.get(nbisURL);
Чтобы отправить сертификат.p12 на сервер, я использовал профиль Firefox. Часть процедуры описана здесь: https://seleniumbycharan.wordpress.com/2015/07/12/how-to-create-custom-firefox-profile-in-selenium-webdriver/
По сути, я создал профиль ("eAgency-Client1"), как описано в статье, что привело к открытию браузера Firefox. В этом браузере я настраивал сертификат так, как я описал в своем первоначальном посте. Затем я настроил селен, чтобы использовать этот профиль:
ProfilesIni profile = new ProfilesIni();
FirefoxProfile ffProfile = profile.getProfile("eAgency-Client1");
ffProfile.setPreference("security.default_personal_cert", "Select Automatically");
. . .
FirefoxOptions firefoxOptions = new FirefoxOptions();
. . .
firefoxOptions.setProfile(ffProfile);
. . .
driver = new FirefoxDriver(firefoxOptions);
Таким образом, чередование двух приведенных выше фрагментов приводит к моему решению.
У меня сейчас проблема в том, что я не могу использовать этот профиль на других машинах, поэтому этот комплект тестирования Selenium не переносим.
Я запускаю тестовый пакет в Дженкинсе. Jenkins работает на сервере CentOS, который не имеет графического интерфейса. Я скопировал профиль "eAgency-Client1" со своего локального компьютера с Windows в нужное место на сервере CentOS и соответствующим образом изменил файл profiles.ini в CentOS.
(Я свободно следовал совету, данному здесь: http://forum.notebookreview.com/threads/migrate-firefox-profile-from-windows-to-linux.444601/. Однако мне нужно было добавить профиль в экземпляр Jenfo firefox скопировав его в /var/lib/jenkins/.mozilla/firefox. Я также не скопировал весь каталог Mozilla. Только профиль, после которого я изменил файл profiles.ini.)
Я знаю, что профиль был успешно скопирован, потому что.,,
FirefoxProfile ffProfile = profile.getProfile("eAgency-Client1");
,,, не возвращает ноль. Проблема приходит, когда я захожу на сайт. Когда я захожу на сайт и получаю исходный код страницы, я вижу стандартную ошибку, которая указывает, что я не отправил сертификат:
<html><head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.10.2</center>
</body></html>
Я не получаю этот источник на моей локальной машине. Моя локальная машина добирается до места, куда она должна идти, без проблем. Локально я не получаю "400 Bad Request".