Для тестирования, разработки и внутреннего использования часто используются самозаверенные (самоподписанные) сертификаты. Технически такой сертификат ничем не отличается от публичного, только вместо передачи на подпись в удостоверяющий центр (УЦ) пользователь создаёт свою собственную подпись.

Под Linux мы можем сгенерировать сертификат командой mkcert или OpenSSL. Единственная проблема в том, что браузер не доверяет такому сертификату, поскольку он не подписан доверенным УЦ. Поэтому нужно ещё запустить и настроить собственный УЦ, который подписывает наши сертификаты — и добавить этот УЦ в список доверенных центров сертификации УЦ (или браузера).


Посмотрим, как это делается с помощью mkcert и OpenSSL.

Использование mkcert

Мы уже рассказывали об удобной утилите mkcert, которая работает под всеми ОС и не требует какой-то конфигурации. С тех пор утилита обновилась.

Сначала устанавливаем certutil:

sudo apt install libnss3-tools
    -или-
sudo yum install nss-tools
    -или-
sudo pacman -S nss
    -или-
sudo zypper install mozilla-nss-tools

Затем устанавливаем mkcert. Можно использовать пакетный менеджер Homebrew для Linux:

brew install mkcert

или собираем из исходников (требует Go 1.13+):

git clone https://github.com/FiloSottile/mkcert && cd mkcert
go build -ldflags "-X main.Version=$(git describe --tags)"

Есть также готовые бинарники.

Для пользователей Arch Linux утилита mkcert находится в официальном репозитории:

sudo pacman -Syu mkcert

Под macOS устанавливаем утилиту через пакетный менеджер Homebrew:

brew install mkcert
brew install nss # если используем Firefox

Или MacPorts:

sudo port selfupdate
sudo port install mkcert
sudo port install nss # если используем Firefox

Под Windows можно установить её через Chocolatey:

choco install mkcert

Или Scoop:

scoop bucket add extras
scoop install mkcert

Как вариант, просто взять скомпилированные бинарники.

Создаём локальный УЦ:

$ mkcert -install
Created a new local CA 💥
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊

$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1

Created a new certificate valid for the following names 📜
 - "example.com"
 - "*.example.com"
 - "example.test"
 - "localhost"
 - "127.0.0.1"
 - "::1"

The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅

Mkcert поддерживает следующие корневые хранилища:

  • Системное хранилище macOS

  • Системное хранилище Windows

  • Системные хранилища Linux: update-ca-trust (Fedora, RHEL, CentOS), update-ca-certificates (Ubuntu, Debian, OpenSUSE, SLES) или trust (Arch)

  • Firefox (только macOS и Linux)

  • Chrome и Chromium

  • Java (с установкой JAVA_HOME)

Чтобы сертификаты принимались доверенными на мобильных устройствах, придётся установить корневой УЦ. Это файл rootCA.pem в папке, указанной командой mkcert -CAROOT.

В iOS можно использовать AirDrop, отправить сертификат себе по почте или разместить его на HTTP-сервере. После открытия нужно установить профиль и включить полное доверие к нему.

Под Android придётся установить сертификат УЦ, а затем включить пользовательские корневые сертификаты в тестовой сборке приложения. Подробнее см. здесь.

Использование OpenSSL

Как вариант, самоподписанный сертификат можно сгенерировать с помощью стандартной утилиты OpenSSL.

Сначала генерируем ключи:

openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes -keyout cert.key -out cert.crt

Эта команда создаёт два файла cert.key и cert.crt. Их можно отдать локальному веб-серверу, и тот будет нормально работать — все подключения к нему будут полностью зашифрованы. Но браузер заблокирует запрос и сообщит, что продолжать небезопасно. Как было сказано, чтобы устранить такую ошибку, нужно создать локальный УЦ и добавить его в доверенные хранилища. Инструкция под Linux включает три шага:

Шаг 1. Сгенерировать секретный ключ и сертификат для УЦ:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out rootca.key
openssl req -x509 -key rootca.key -out rootca.crt -subj "/CN=localhost-ca/O=localhost-ca"

Шаг 2. Сгенерировать секретный ключ для сертификата, в данном примере это ключ localhost.key:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out localhost.key

Шаг 3. Создать файл запроса на подпись сертификата (CSR) для получения подписанного сертификата от УЦ. Сначала создаётся файл конфигурации, который потом передаётся командам openssl (хотя информацию можно передавать в аргументах, а не из конфигурационного файла). Назовём его csr.conf:

[req]
distinguished_name = dn
prompt             = no
req_extensions = req_ext

[dn]
CN="localhost"

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.0 = localhost

Строка CN=localhost указывает, что это файл для получения сертификата на доменное имя localhost. Дополнительные доменные имена можно указать в разделе [alt_names]:первое доменное имя называется DNS.0, второе — DNS.1, и так далее.

Теперь создаём файл CSR:

openssl req -new -key localhost.key -out localhost.csr -config csr.conf

Последний шаг — получить подписанный сертификат от нашего УЦ:

openssl x509 -req -days 365 -extensions req_ext -extfile csr.conf -CA rootca.crt -CAkey rootca.key -in localhost.csr -out localhost.crt

Мы получаем файл localhost.crt, то есть сертификат для домена localhost. Он подписан закрытым ключом нашего УЦ.

После этого осталось только добавить сертификат УЦ в доверенные хранилища ОС и браузеров.

Добавление корневого сертификата в системное хранилище Ubuntu:

sudo cp rootca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

Добавление в системное хранилище Arch Linux:

sudo trust anchor rootca.crt

Браузеры

Браузеры обычно используют собственные хранилища сертификатов, а не системные, так что туда добавляем вручную корневой сертификат УЦ.

Например, в Firefox это делается в меню «Настройки» — «Приватность и защита» — раздел «Сертификаты». Там нажимаем «Просмотр сертификатов» и кнопку «Импортировать...» в разделе «Центры сертификации», куда добавляем наш файл rootca.crt.

Теперь https://localhost открывается в браузере без предупреждений безопасности.

В Chromium сертификаты добавляются в разделе «Настройки» — «Конфиденциальность и безопасность» — «Безопасность» — «Настроить сертификаты».


Есть и другие утилиты для генерации и управления УЦ под Linux: например, Smallstep, XCA и easy-rsa.