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