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


<!--more-->

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

В Windows все просто: у системы есть общее хранилище сертификатов пользователя (**Личное**), и браузеры берут
клиентские сертификаты из него:

- **Chrome, Edge, Яндекс Браузер, Opera, Brave, Vivaldi** -- только из системного хранилища;
- **Firefox** начиная с версии 90 тоже видит сертификаты из системного хранилища, а кроме того имеет собственное.

Поэтому достаточно один раз установить сертификат в систему, и он будет доступен всем браузерам.

Сертификат ставится в хранилище **текущего пользователя** -- права администратора не нужны.


## Установка через интерфейс

1. Дважды щелкните по файлу `user1.p12`. Откроется **Мастер импорта сертификатов**.
2. **Расположение хранилища** -- оставьте **Текущий пользователь** и нажмите **Далее**.
3. Путь к файлу уже подставлен -- нажмите **Далее**.
4. Введите пароль от файла. Параметры импорта:
   - **Пометить этот ключ как экспортируемый** -- не отмечайте, если пользователю не нужно переносить ключ на другие
     устройства. Так закрытый ключ нельзя будет выгрузить из системы;
   - **Включить усиленную защиту закрытого ключа** -- по желанию. Windows будет спрашивать подтверждение (или пароль)
     при каждом использовании ключа.
5. Выберите **Автоматически выбрать хранилище на основе типа сертификата** -- сертификат с ключом попадет в
   **Личное**.
6. Нажмите **Готово**. Должно появиться сообщение **Импорт успешно выполнен**.

Тот же мастер можно открыть из браузера: в Chrome и Edge это **Настройки → Конфиденциальность и безопасность →
Безопасность → Управление сертификатами** (в новых версиях -- **Управление сертификатами, импортированными из
Windows**), кнопка **Импорт**.

Проверить установленные сертификаты можно в оснастке `certmgr.msc` (**Win + R → certmgr.msc**): раздел
**Личное → Сертификаты**. Там же сертификат удаляется -- правой кнопкой **Удалить**.


## Установка через консоль

### PowerShell

Пароль лучше вводить интерактивно, чтобы он не остался в истории команд:

```powershell
$password = Read-Host -AsSecureString -Prompt "Пароль от p12"
Import-PfxCertificate -FilePath .\user1.p12 -CertStoreLocation Cert:\CurrentUser\My -Password $password
```

По умолчанию закрытый ключ импортируется как неэкспортируемый. Чтобы разрешить экспорт, добавьте параметр
`-Exportable`.

Посмотреть установленные сертификаты:

```powershell
Get-ChildItem Cert:\CurrentUser\My | Format-List Subject, Issuer, Thumbprint, NotAfter
```

Удалить сертификат вместе с закрытым ключом:

```powershell
Get-ChildItem Cert:\CurrentUser\My | Where-Object Subject -like "*CN=user1*" | Remove-Item -DeleteKey
```

### certutil

Утилита `certutil` есть в любой Windows и работает в обычной командной строке. Ключ `-user` обязателен -- без него
сертификат попадет в хранилище компьютера, и потребуются права администратора. Пароль утилита спросит сама.

```bat
certutil -user -importpfx user1.p12 NoExport
```

Посмотреть сертификаты в хранилище **Личное**:

```bat
certutil -user -store My
```

Удалить сертификат по серийному номеру или имени из вывода предыдущей команды:

```bat
certutil -user -delstore My "user1"
```


## Firefox

Начиная с версии 90 Firefox автоматически использует сертификаты из системного хранилища Windows. Если вы установили
сертификат способами выше, больше ничего делать не нужно -- при заходе на сайт Firefox предложит его выбрать.

Если Firefox не видит сертификат, откройте `about:config` и проверьте, что параметр
`security.osclientcerts.autoload` равен `true`.

Можно установить сертификат только в Firefox, не трогая систему: **Настройки → Приватность и Защита → Сертификаты →
Просмотр сертификатов... → Ваши сертификаты → Импортировать...** Так сертификат будет доступен только в этом профиле
Firefox.


## Автоматический выбор сертификата

При каждом новом запуске браузер спрашивает, какой сертификат использовать. Если у пользователя он один, выбор можно
автоматизировать политикой **AutoSelectCertificateForUrls**. Например, для Chrome создайте в реестре строковый
параметр:

```bat
reg add "HKCU\Software\Policies\Google\Chrome\AutoSelectCertificateForUrls" /v 1 /t REG_SZ /d "{\"pattern\":\"https://example.com\",\"filter\":{\"ISSUER\":{\"O\":\"Company Name\"}}}"
```

В фильтре укажите **Organization Name** вашего центра сертификации. Для Edge используйте раздел
`HKCU\Software\Policies\Microsoft\Edge\AutoSelectCertificateForUrls`. Применение политики можно проверить на
странице `chrome://policy` или `edge://policy`.


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

- **Браузер не предлагает выбрать сертификат.** Проверьте в `certmgr.msc`, что сертификат лежит в **Личное** и у него
  есть закрытый ключ (на значке ключик, в свойствах -- «Есть закрытый ключ для этого сертификата»). Если сертификат
  попал в **Другие пользователи** или **Доверенные корневые центры**, удалите его и импортируйте заново в **Личное**.
- **Выбран не тот сертификат.** Chrome и Edge запоминают выбор до перезапуска браузера -- закройте все его окна,
  включая фоновые процессы в трее.
- **Сервер отклоняет сертификат.** Проверьте, что он подписан тем центром сертификации, который указан в
  `ssl_client_certificate` в настройках nginx, и что у CA и клиента разные поля **Organization Name**.

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

