# Клиентский SSL-сертификат в Linux: Chrome, Chromium, Firefox


<!--more-->

Эта инструкция -- продолжение статьи
[Настройка аутентификации по SSL сертификатам клиентов на Nginx]({{< relref "client-certificate-authentication-nginx" >}}).
У вас есть файл `user1.p12` с сертификатом и закрытым ключом и пароль от него. Осталось установить его в браузер.

В Linux нет общего системного хранилища для клиентских сертификатов, как в Windows или macOS. Каждое приложение
использует свою базу **NSS Shared Database**:

| Браузер | Где хранятся сертификаты |
|---|---|
| Chrome, Chromium, Яндекс Браузер, Opera, Brave, Vivaldi, Edge | общая база пользователя `$HOME/.pki/nssdb` |
| Chromium из Snap | `$HOME/snap/chromium/current/.pki/nssdb` |
| Браузеры из Flatpak | `$HOME/.var/app/<id приложения>/.pki/nssdb` |
| Firefox | собственная база в каталоге профиля |

Поэтому Chromium-браузеры достаточно настроить один раз, а Firefox -- отдельно.


## Chrome, Chromium и другие браузеры на Chromium

### Через интерфейс браузера

1. Откройте **Настройки → Конфиденциальность и безопасность → Безопасность → Настроить сертификаты**
   (или сразу введите в адресной строке `chrome://certificate-manager`).
2. Перейдите в раздел **Ваши сертификаты** (в старых версиях -- вкладка **Ваши сертификаты** в окне
   **Управление сертификатами**).
3. Нажмите **Импорт**, выберите файл `user1.p12` и введите пароль от него.

Сертификат появится в списке. Перезапустите браузер, чтобы он точно подхватил изменения, и откройте сайт.
Браузер предложит выбрать сертификат -- выбирайте установленный.

### Через консоль

Для работы с базой NSS нужен пакет утилит. Для Debian/Ubuntu/Mint:

```shell
sudo apt update
sudo apt install libnss3-tools
```

Для Fedora/CentOS/RHEL:

```shell
sudo dnf install nss-tools
```

Для Arch Linux утилиты входят в пакет `nss`.

Если базы еще нет (браузер ни разу не запускался), создайте ее:

```shell
mkdir -p $HOME/.pki/nssdb
certutil -d sql:$HOME/.pki/nssdb -N --empty-password
```

Импортируйте сертификат в формате **PKCS#12** из файла `.p12` или `.pfx`. Утилита запросит пароль от файла:

```shell
pk12util -d sql:$HOME/.pki/nssdb -i user1.p12
```

Посмотреть установленные сертификаты (**-L**) и закрытые ключи (**-K**):

```shell
certutil -d sql:$HOME/.pki/nssdb -L
certutil -d sql:$HOME/.pki/nssdb -K
```

Удалить ненужный сертификат вместе с закрытым ключом. Имя сертификата берите из вывода `certutil -L`:

```shell
certutil -d sql:$HOME/.pki/nssdb -F -n "Certificate Name"
```

Для Chromium из Snap или браузеров из Flatpak подставьте в команды путь к их базе из таблицы выше.


## Firefox

### Через интерфейс браузера

Откройте меню и выберите **Настройки**.

![Меню Firefox](firefox-menu.png)

Перейдите в раздел **Приватность и Защита**, найдите блок **Сертификаты** и нажмите **Просмотр сертификатов...**
Можно сразу открыть страницу `about:preferences#privacy`.

![Блок «Сертификаты» в настройках Firefox](firefox-certificates.png)

На вкладке **Ваши сертификаты** нажмите **Импортировать...**, выберите файл `user1.p12` и введите пароль от него.

![Окно «Управление сертификатами» в Firefox](firefox-import.png)

Сертификат появится в списке. При первом заходе на сайт Firefox спросит, какой сертификат использовать. Если
отметить **Запомнить это решение**, выбор сохранится на вкладке **Решения по аутентификации** -- там же его можно
сбросить.

### Через консоль

Firefox использует ту же базу NSS, поэтому подойдут утилиты из пакета `libnss3-tools` / `nss-tools`. Нужно только
указать каталог профиля. Узнать его можно на странице `about:profiles` -- строка **Корневой каталог** у профиля
по умолчанию. Обычно это:

- `$HOME/.mozilla/firefox/xxxxxxxx.default-release` -- Firefox из пакетов дистрибутива или с сайта Mozilla;
- `$HOME/snap/firefox/common/.mozilla/firefox/xxxxxxxx.default` -- Firefox из Snap (по умолчанию в Ubuntu);
- `$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox/xxxxxxxx.default-release` -- Firefox из Flatpak.

Перед импортом закройте Firefox, чтобы он не держал базу открытой.

```shell
PROFILE=$HOME/.mozilla/firefox/xxxxxxxx.default-release
pk12util -d sql:$PROFILE -i user1.p12
certutil -d sql:$PROFILE -L
```

Если на базе Firefox установлен главный пароль, `pk12util` сначала спросит его, а затем пароль от файла `.p12`.

Удаление выполняется так же, как для Chromium:

```shell
certutil -d sql:$PROFILE -F -n "Certificate Name"
```


## Если сертификат не работает

- **Браузер не предлагает выбрать сертификат.** Проверьте, что сертификат подписан тем центром сертификации, который
  указан в `ssl_client_certificate` в настройках nginx, и что у CA и клиента разные поля **Organization Name**.
- **Выбран не тот сертификат.** Chromium запоминает выбор до перезапуска браузера -- закройте все его окна. В Firefox
  удалите запись на вкладке **Решения по аутентификации**.
- **Ошибка пароля при импорте.** Убедитесь, что пароль правильный. Если файл создан очень старой версией OpenSSL с
  устаревшими алгоритмами, пересоздайте его современной версией.
- **Проверка без браузера.** Если `curl --cert user1.crt --key user1.key https://example.com` проходит, а браузер нет --
  проблема в установке сертификата, а не в настройках сервера.

Инструкции для других систем:
[Windows]({{< relref "client-certificate-windows" >}}),
[macOS]({{< relref "client-certificate-macos" >}}),
[Android и iOS]({{< relref "client-certificate-android-ios" >}}).

