Client certificates

Client certificates (клиентские сертификаты) представляют собой метод аутентификации в веб-приложениях, при котором сервер проверяет личность клиента с помощью сертификата. В контексте автоматизированного тестирования с использованием Playwright, работа с клиентскими сертификатами становится важной частью процесса, когда необходимо симулировать действия пользователей, которые используют такие сертификаты для доступа к защищённым ресурсам.

Подключение клиентского сертификата

Playwright предоставляет возможность использовать клиентские сертификаты в тестах через настройку сессии браузера. Это важно в тех случаях, когда приложение требует от пользователя представления сертификата для аутентификации. Наиболее распространённый способ использования сертификатов — это их добавление через профиль браузера или конфигурацию браузера на этапе создания сессии.

Для того чтобы передавать клиентский сертификат в Playwright, нужно использовать параметр context.addCookies() или настроить сертификат на уровне браузера перед запуском тестов.

Пример загрузки сертификата с помощью Playwright:

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    // Указываем путь к файлу сертификата
    httpsCredentials: {
      certificate: fs.readFileSync('path/to/certificate.crt'),
      privateKey: fs.readFileSync('path/to/privateKey.key'),
      passphrase: 'your-passphrase'
    }
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  
  // Дополнительные действия с тестируемым сайтом
  await browser.close();
})();

В данном примере, сертификат и закрытый ключ загружаются с файловой системы с помощью модуля fs, и передаются в контекст браузера. После этого в тестах можно работать с защищёнными ресурсами, которые требуют клиентский сертификат.

Аутентификация с клиентским сертификатом

После того как сертификат добавлен в сессию, Playwright будет использовать его для аутентификации при обращении к серверу. Это может быть полезно при автоматизации тестов для приложений, где аутентификация по сертификату обязательна, например, для API, банковских сайтов, сервисов с повышенной безопасностью.

Playwright позволяет взаимодействовать с приложением, как если бы пользователь подключался с использованием своего сертификата, и, следовательно, открывает возможность тестировать такие механизмы, как:

  • Проверка правильности работы аутентификации.
  • Тестирование отказа в доступе при использовании неверных сертификатов.
  • Сценарии с мульти-уровневой аутентификацией.

Важно, что Playwright не предоставляет встроенной поддержки управления паролями для сертификатов. В случае, если сертификат защищён паролем, его нужно передавать в процессе создания сессии.

Обработка ошибок при использовании сертификатов

В случае неправильной конфигурации сертификата или при отсутствии необходимых файлов, Playwright будет выбрасывать ошибки, которые можно перехватывать и обрабатывать в тестах. Часто возникающие ошибки включают:

  • Неверный путь к файлу сертификата — не найден файл сертификата или ключа.
  • Неверный пароль сертификата — если сертификат защищён паролем, его нужно правильно передать.
  • Неверный формат сертификата — сертификаты должны быть в правильном формате (например, PEM или DER).

Пример обработки ошибок:

try {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    httpsCredentials: {
      certificate: fs.readFileSync('invalid/path/to/certificate.crt'),
      privateKey: fs.readFileSync('invalid/path/to/privateKey.key'),
      passphrase: 'wrong-passphrase'
    }
  });
} catch (error) {
  console.error('Ошибка загрузки сертификата:', error);
}

Настройка нескольких сертификатов

В некоторых случаях может возникнуть необходимость работать с несколькими сертификатами. Например, если приложение требует разных сертификатов для разных частей системы. В этом случае можно добавить несколько контекстов браузера с разными сертификатами.

Пример:

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  const browser = await chromium.launch();
  
  // Первый контекст с первым сертификатом
  const context1 = await browser.newContext({
    httpsCredentials: {
      certificate: fs.readFileSync('path/to/certificate1.crt'),
      privateKey: fs.readFileSync('path/to/privateKey1.key'),
      passphrase: 'passphrase1'
    }
  });

  // Второй контекст с вторым сертификатом
  const context2 = await browser.newContext({
    httpsCredentials: {
      certificate: fs.readFileSync('path/to/certificate2.crt'),
      privateKey: fs.readFileSync('path/to/privateKey2.key'),
      passphrase: 'passphrase2'
    }
  });

  const page1 = await context1.newPage();
  await page1.goto('https://example1.com');
  
  const page2 = await context2.newPage();
  await page2.goto('https://example2.com');
  
  await browser.close();
})();

Этот подход полезен, если требуется протестировать работу с разными сертификатами на одном браузере.

Работа с сертификатами в API-тестах

Для API тестирования, где сервисы могут требовать клиентскую аутентификацию с помощью сертификатов, Playwright может взаимодействовать не только с браузером, но и непосредственно с HTTP-запросами. В таких случаях сертификаты также могут быть использованы для аутентификации на уровне сетевых запросов.

Однако для такого рода тестов Playwright ограничен в возможностях работы с сертификатами напрямую через сетевые запросы. В этом случае будет целесообразно использовать другие инструменты, такие как axios или fetch, которые могут отправлять запросы с сертификатами, но эти запросы нужно будет интегрировать в тесты вместе с Playwright.

Заключение

Работа с клиентскими сертификатами в Playwright открывает множество возможностей для тестирования приложений, требующих аутентификации с помощью сертификатов. Возможность настройки сертификатов в контексте браузера позволяет тестировать приложения с повышенными требованиями безопасности, имитируя действия реальных пользователей, которые используют сертификаты для аутентификации.