Установка и настройка центра сертификации в Ubuntu 20.04

Центр сертификации (Certificate Authority, CA) – это сторона (организация), ответственная за выдачу цифровых сертификатов для проверки подлинности в Интернете. Часто для проверки подлинности веб-сайтов и других сервисов, предоставляемых широкой публике, используются публичные ЦС, а частные ЦС обычно используются для закрытых групп и частных сервисов.

Создав частный центр сертификации, вы сможете настраивать, тестировать и запускать программы, которые требуют зашифрованных соединений между клиентом и сервером. С частным ЦС у вас появится возможность выдавать сертификаты для пользователей, серверов или отдельных программ и сервисов в вашей инфраструктуре.

Среди программ Linux, которые используют свои собственные частные ЦС – OpenVPN и Puppet. Вы также можете настроить свой веб-сервер для поддержки сертификатов, выданных частным ЦС, чтобы среда разработки и промежуточная среда соответствовали производственным серверам, использующим TLS для шифрования соединений.

Читайте также: Управление сертификатами Puppet 4

В этом мануале мы поговорим о том, как настроить частный центр сертификации на сервере Ubuntu 20.04, а также как сгенерировать и подписать сертификат с помощью этого нового ЦС. Вы также узнаете, как импортировать открытый сертификат сервера ЦС в хранилище сертификатов вашей операционной системы, чтобы можно было проверить цепочку между ЦС и удаленными серверами или пользователями. А еще вы научитесь отзывать сертификаты и распространять список отзыва сертификатов, чтобы только авторизованные пользователи и системы могли использовать сервисы, которые зависят от вашего ЦС.

Требования

Вам понадобится сервер Ubuntu 20.04 для обслуживания сервиса OpenVPN (этот сервер будет называться сервером ЦС). Настройте этот сервер по этому мануалу.

Сервер ЦС должен быть автономным. Он будет использоваться только для импорта, подписи и отзыва запросов на сертификат. Он не должен запускать какие-либо другие сервисы, в идеале он должен быть отключен, если вы не используете ЦС.

Примечание: Последний раздел этого мануала является опциональным, он для тех, кто хочет узнать больше о подписании и отзыве сертификатов. Если вы решите выполнить его, вам понадобится еще один сервер Ubuntu 20.04. Также можно использовать свой локальный компьютер с системой Debian или Ubuntu.

1: Установка Easy-RSA

Для начала нужно установить набор сценариев easy-rsa на ваш сервер ЦС. Пакет easy-rsa – это инструмент управления центрами сертификации, который вы будете использовать для создания закрытого ключа и открытого сертификата; позже они понадобятся для подписи запросов от клиентов и серверов, которые будут обращаться к вашему ЦС.

Войдите на свой сервер ЦС как пользователь sudo (не root) и выполните следующие команды:

sudo apt update
sudo apt install easy-rsa

Нажмите y, чтобы подтвердить, что вы хотите установить пакет.

Теперь у вас есть все, что вам нужно для настройки Easy-RSA. На следующем этапе мы создадим инфраструктуру открытых ключей, а затем начнем создавать ЦС.

2: Подготовка инфраструктуры открытых ключей

Теперь пора создать инфраструктуру открытых ключей (PKI) на сервере ЦС. Убедитесь, что вы работаете как пользователь sudo, и создайте каталог easy-rsa. Использовать sudo для запуска следующих команд не нужно, поскольку ваш обычный пользователь должен управлять и взаимодействовать с ЦС без повышенных привилегий.

mkdir ~/easy-rsa

Эта команда создаст в домашнем каталоге новый каталог по имени easy-rsa. Мы будем использовать его для создания символических ссылок (симлинков), указывающих на файлы пакета easy-rsa, которые мы установили на предыдущем этапе. Эти файлы находятся в папке /usr/share/easy-rsa.

Создайте симлинки с помощью команды ln:

ln -s /usr/share/easy-rsa/* ~/easy-rsa/

Примечание: В других мануалах вы можете прочесть, что вам нужно скопировать файлы easy-rsa в каталог PKI. Но в данном мануале используется метод символических ссылок. Это удобно, потому что в результате любые обновления пакета easy-rsa будут автоматически отражаться в скриптах вашей PKI.

Чтобы ограничить доступ к новому каталогу PKI, убедитесь, что он заблокирован для всех, кроме владельца:

chmod 700 /home/8host/easy-rsa

Теперь инициализируйте PKI в каталоге easy-rsa:

cd ~/easy-rsa
./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/8host/easy-rsa/pki

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

3: Создание центра сертификации

Прежде чем вы сможете создать закрытый ключ и сертификат ЦС, вам нужно создать файл по имени vars и заполнить его некоторыми значениями по умолчанию. Перейдите в каталог easy-rsa, затем создайте и отредактируете файл vars с помощью nano или другого текстового редактора:

cd ~/easy-rsa
nano vars

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

~/easy-rsa/vars
set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "MyOrganization"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "Community"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"

Когда вы закончите, сохраните и закройте файл. В nano для этого нужно нажать Ctrl + X, затем Y и Enter. Теперь вы готовы собрать свой ЦС.

Чтобы создать пару открытого и закрытого ключей для вашего центра сертификации, снова введите команду ./easy-rsa, но на этот раз с параметром build-ca:

./easyrsa build-ca

В выводе вы увидите несколько строк о версии OpenSSL. Также вам будет предложено ввести парольную фразу для вашей пары ключей. Обязательно выберите надежную фразу и сохраните ее в безопасном месте (или запомните). Эту фразу вам нужно ввести, чтобы получить доступ к своему ЦС (например, для подписи или отзыва сертификата).

Также вам будет предложено подтвердить Common Name (CN) для вашего ЦС. Common Name – это имя, используемое для обозначения этого компьютера в контексте центра сертификации. Вы можете ввести любую строку символов, но проще всего принять имя по умолчанию, нажав Enter.

. . .
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/8host/easy-rsa/pki/ca.crt

Примечание: Если вы не хотите, чтобы при каждом взаимодействии с вашим ЦС запрашивался пароль, вы можете запустить команду build-ca с параметром nopass:

./easyrsa build-ca nopass

Теперь у вас есть два важных файла – ~/easy-rsa/pki/ca.crt и ~/easy-rsa/pki/private/ca.key – открытый и закрытый компонент центра сертификации.

  • ca.crt – открытый файл сертификата ЦС. Пользователи, серверы и клиенты будут использовать его для проверки того, что они являются частью одной сети доверия. Каждый пользователь и сервер, который обращается к вашему ЦС, должен иметь копию этого файла. Все стороны будут полагаться на открытый сертификат, чтобы посторонние не могли выдавать себя за вашу систему (это предотвратит атаки посредника).
  • ca.key – это закрытый ключ, который ЦС использует для подписи сертификатов серверов и клиентов. Если злоумышленник получит доступ к вашему ЦС и, в свою очередь, к вашему файлу ca.key, вам нужно будет уничтожить ваш ЦС. И поэтому ваш файл ca.key должен находиться только на вашем компьютере ЦС (в идеале компьютер ЦС должен оставаться в оффлайн, если вы не подписываете запросы на сертификат в качестве дополнительной меры безопасности).

После этого ваш центр сертификации будет готов. Его можно использовать для подписи запросов и для отзыва сертификатов.

4: Распространение открытого сертификата ЦС

Теперь ваш ЦС настроен и готов выступать корнем доверия для любых систем, которые вы хотите настроить для его поддержки. Вы можете добавить сертификат ЦС на свои серверы OpenVPN, веб-серверы, почтовые серверы и т. д. Любой пользователь или сервер, которому необходимо проверить подлинность другого пользователя или сервера в вашей сети, должен иметь копию файла ca.crt, импортированного в хранилище сертификатов своей операционной системы.

Чтобы импортировать открытый сертификат ЦС во вторую систему Linux (например, на другой сервер или локальный компьютер), сначала получите копию файла ca.crt с вашего сервера ЦС. Вы можете использовать команду cat, чтобы вывести файл в терминал, а затем скопировать и вставить его в файл на втором компьютере (на который нужно импортировать сертификат). Также для передачи файла между системами вы можете использовать такие инструменты, как scp, rsync. Мы скопируем и вставим сертификат с помощью nano, поскольку это будет работать во всех системах.

Выполните следующую команду на сервере ЦС:

cat ~/easy-rsa/pki/ca.crt

В терминале появится такой вывод:

-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUcR9Crsv3FBEujrPZnZnU4nSb5TMwDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwMzE4MDMxNjI2WhcNMzAw
. . .
. . .
-----END CERTIFICATE-----

Скопируйте все, включая строки ——BEGIN CERTIFICATE—— и ——END CERTIFICATE——.

На второй машине откройте файл /tmp/ca.crt:

nano /tmp/ca.crt

Вставьте код, который вы только что скопировали с сервера ЦС, в редактор. Когда вы закончите, сохраните и закройте файл.

Теперь, когда у вас есть копия файла ca.crt во второй системе Linux, пора импортировать сертификат в хранилище сертификатов данной операционной системы.

В системах на основе Debian и Ubuntu для импорта сертификата выполните следующие команды:

cp /tmp/ca.crt /usr/local/share/ca-certificates/
update-ca-certificates

Чтобы импортировать сертификат в системы на основе CentOS, Fedora или RedHat, скопируйте сертификат в /etc/pki/ca-trust/source/anchors/ и запустите команду update-ca-trust.

sudo cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

Теперь вторая ваша система Linux будет доверять сертификатам, подписанным вашим ЦС.

Примечание: Если вы используете свой ЦС для веб-серверов и работаете с браузером Firefox, вам необходимо импортировать публичный сертификат ca.crt прямо в Firefox. Браузер Firefox не использует хранилище сертификатов локальной операционной системы. Подробную информацию о том, как добавить сертификат ЦС в Firefox, вы найдете в этой статье от Mozilla.

Если вы используете свой ЦС для интеграции со средой Windows или настольными компьютерами, ознакомьтесь с документацией по использованию certutil.exe.

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

Опционально: Создание запросов на подпись и отзыв сертификатов

Следующие разделы данного мануала выполнять не обязательно. Если вы выполнили все предыдущие разделы, у вас уже есть полностью готовый центр сертификации, который можно использовать (например, в качестве основы для выполнения других мануалов). Вы можете импортировать файл ca.crt вашего ЦС и проверить сертификаты, которые были им подписаны.

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

Создание и подпись запроса на сертификат

Теперь, когда у вас есть готовый центр сертификации, вы можете попрактиковаться в создании секретного ключа и запроса сертификата, чтобы ознакомиться с процессами подписания и распространения.

Запрос на подпись сертификата (CSR) состоит из трех частей: это открытый ключ, определение данных о запрашивающей системе и подпись запроса (создается с помощью закрытого ключа запрашивающей стороны). Закрытый ключ следует хранить в секрете, поскольку он будет использоваться для шифрования информации, расшифровать которую сможет только пользователь с подписанным открытым сертификатом.

Следующие действия нужно выполнять на вашей второй системе (Linux Debian, Ubuntu или дистрибутиве, который является производным от любой из этих систем). Это может быть другой удаленный сервер или локальная машина Linux – например, ноутбук или компьютер. Поскольку команда easy-rsa не доступна по умолчанию во всех системах, мы используем инструмент openssl для создания личного ключа и сертификата.

Пакет openssl по умолчанию предустановлен в большинстве дистрибутивов Linux, но если вы не уверены в этом, запустите такую команду:

sudo apt update
sudo apt install openssl

По запросу введите y, чтобы продолжить установку. Теперь вы готовы создать тестовый запрос с помощью openssl.

Первое, что необходимо сделать для создания CSR, — это создать закрытый ключ с помощью openssl. Давайте создадим каталог practice-csr, а затем сгенерируем в нем ключ. Мы создадим этот запрос для условного сервера 8host-server (не для идентификации пользователя или другого ЦС).

mkdir ~/practice-csr
cd ~/practice-csr
openssl genrsa -out 8host-server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
. . .
. . .
e is 65537 (0x010001)

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

openssl req -new -key 8host-server.key -out 8host-server.req
. . .
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:New York
Locality Name (eg, city) [Default City]:New York City
Organization Name (eg, company) [Default Company Ltd]:MyOrganization
Organizational Unit Name (eg, section) []:Community
Common Name (eg, your name or your server's hostname) []:8host-server
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Если вы хотите автоматически добавить эти значения прямо в вызов команды openssl (чтобы не вводить их через интерактивные окна), передайте аргумент -subj. Обязательно отредактируйте условные значения, указав вместо них свои.

openssl req -new -key 8host-server.key -out server.req -subj \
/C=US/ST=New\ York/L=New\ York\ City/O=MyOrganization/OU=Community/CN=8host-server

Чтобы проверить содержимое вашего запроса, вы можете просмотреть файл запроса:

openssl req -in 8host-server.req -noout -subject
subject=C = US, ST = New York, L = New York City, O = MyOrganization, OU = Community, CN = 8host-server

Если вы довольны вашим тестовым запросом на сертификат, скопируйте файл 8host-server.req на свой сервер ЦС, используя утилиту scp:

scp 8host-server.req 8host@your_ca_server_ip:/tmp/8host-server.req

Вы создали запрос на подпись сертификата для условного сервера 8host-server. В реальном сценарии запрос может быть предназначен для промежуточного веб-сервера или сервера разработки, который нуждается в TLS сертификате для целей тестирования. Также запрос может исходить от сервера OpenVPN, которому нужен сертификат, чтобы пользователи могли подключаться к VPN. Далее мы перейдем к подписанию запроса с помощью закрытого ключа сервера ЦС.

Подпись запроса на сертификат

На предыдущем этапе вы создали пробный запрос сертификата и ключ. Вы скопировали его в каталог /tmp на своем сервере ЦС (такой же процесс вы бы использовали, если бы у вас были реальные клиенты или серверы, отправляющие вам CSR-запросы, которые необходимо подписать).

Далее сервер ЦС должен импортировать тестовый сертификат и подписать его. Как только запрос сертификата будет подтвержден ЦС и передан обратно на сервер, клиенты, которые доверяют данному ЦС, также будут доверять только что выданному сертификату.

Поскольку на сервере ЦС доступна утилита easy-rsa, она будет использоваться на этапах подписания, чтобы упростить задачу (и не использовать openssl, как мы это делали в предыдущем разделе).

Первым делом для подписания запроса сертификата нужно импортировать этот запрос с помощью скрипта easy-rsa:

cd ~/easy-rsa
./easyrsa import-req /tmp/8host-server.req 8host-server
. . .
The request has been successfully imported with a short name of: 8host-server
You may now use this name to perform signing operations on this request.

Теперь вы можете подписать запрос, запустив скрипт easyrsa с параметром sign-req, за которым указывается тип запроса и значение Common Name, включенное в запрос. Запрос может использовать один из следующих типов: client, server или ca. Поскольку наш тестовый сертификат предназначен для вымышленного сервера, используйте тип server.

./easyrsa sign-req server 8host-server

В выводе вам будет предложено подтвердить, что запрос поступил из надежного источника. Введите yes, затем нажмите Enter:

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject=
commonName                = 8host-server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/8host/easy-rsa/pki/issued/8host-server.crt

Если вы зашифровали ключ ЦС, сейчас вам будет предложено ввести пароль.

Итак, вы подписали запрос сертификата 8host-server.req, используя закрытый ключ сервера ЦС из файла /home/8host/easy-rsa/pki/private/ca.key. Полученный файл 8host-server.crt содержит открытый ключ шифрования для нашего условного сервера, а также новую подпись от сервера ЦС. Смысл подписи заключается в том, чтобы сообщить всем, кто доверяет данному ЦС, что они также могут доверять сертификату сервера 8host-server.

Если бы этот запрос относился к реальному серверу (например, к веб- или VPN-серверу), сервер ЦС должен был бы передать новые файлы 8host-server.crt и ca.crt на удаленный сервер, который сделал запрос сертификата:

scp pki/issued/8host-server.crt 8host@your_server_ip:/tmp
scp pki/ca.crt 8host@your_server_ip:/tmp

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

Отзыв сертификата

У вас может возникнуть потребность отозвать подписанный сертификат, чтобы пользователь или сервер больше не могли его использовать: например, если ноутбук, для которого вы подписали сертификат, был украден, веб-сервер с вашим сертификатом взломали, сотрудник покинул вашу организацию и так далее.

Общий процесс отзыва сертификата состоит из таких этапов:

  1. Отзыв сертификата с помощью команды ./easyrsa revoke client_name.
  2. Создание нового запроса на сертификат с помощью команды ./easyrsa gen-crl.
  3. Перенос обновленного файла crl.pem на сервер или серверы, которые зависят от вашего ЦС; копирование файла в требуемый каталог или каталоги в этих системах для программ, которые к нему обращаются.
  4. Перезапуск всех сервисов, которые используют ваш ЦС и файл запроса.

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

Чтобы отозвать сертификат, перейдите в каталог easy-rsa на вашем сервере ЦС:

cd ~/easy-rsa

Затем запустите скрипт easyrsa с опцией revoke, после нее укажите имя клиента, сертификат которого вы хотите отозвать. Следуя нашему примеру, Common Name сертификата – это 8host-server:

./easyrsa revoke 8host-server

Команда попросит вас подтвердить отзыв, введя yes:

Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName                = 8host-server
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
. . .
Revoking Certificate 8348B3F146A765581946040D5C4D590A
. . .

Обратите внимание на значение в строке Revoking Certificate. Оно представляет собой уникальный серийный номер отзываемого сертификата. Если вы хотите проверить список отозванных сертификатов (об этом чуть ниже), чтобы убедиться, что в нем есть этот сертификат, вам понадобится это значение.

После подтверждения действия ЦС отзовет сертификат. Однако удаленные системы, которые используют ваш ЦС, не могут проверить, были ли отозваны какие-либо сертификаты. Пользователи и серверы по-прежнему смогут использовать отозванный сертификат до тех пор, пока список отзыва сертификатов ЦС (Certificate Revocation List, CRL) не будет распространен на все системы, использующие ваш ЦС.

Давайте создадим CRL или обновим существующий файл crl.pem.

Обновив список отзыва, вы сможете указать, какие пользователи и системы имеют действительные сертификаты в вашем ЦС.

Чтобы создать CRL, запустите команду easy-rsa с параметром gen-crl, находясь в каталоге ~/easy-rsa:

./easyrsa gen-crl

Если при создании файла ca.key вы использовали парольную фразу, вам будет предложено ввести ее. Команда gen-crl создаст файл crl.pem, содержащий обновленный список отозванных сертификатов для этого ЦС.

Затем вам нужно будет передать обновленный файл crl.pem на все серверы и клиенты, которые используют ваш ЦС. В противном случае клиенты и системы будут по-прежнему иметь доступ к сервисам и системам, которые используют ваш ЦС, поскольку они не будут знать об аннулированном статусе сертификата.

Чтобы передать файл на серверы, которые доверяют вашему ЦС, вы можете использовать команду scp.

Примечание: В этом мануале показано, как создавать и распространять CRL вручную. Но существуют и более надежные, автоматизированные методы для распространения и проверки списков отзыва, например OCSP-Stapling.

Убедитесь, что вы вошли на сервер ЦС как пользователь sudo, и запустите следующую команду, указав свой IP-адрес или DNS-имя своего сервера вместо your_server_ip:

scp ~/easy-rsa/pki/crl.pem 8host@your_server_ip:/tmp

Теперь, когда файл находится в удаленной системе, нам остается только обновить все сервисы, чтобы предоставить им новую копию списка отзыва. Мы не будем подробно останавливаться на этом этапе. В общих чертах: вам нужно скопировать файл crl.pem в то место, где сервис будет его искать, а затем перезапустить сервис с помощью systemctl.

Как только сервисы получат новый файл crl.pem, они смогут отклонять соединения от клиентов или серверов, которые используют отозванный сертификат.

Если вы хотите проверить файл CRL (например, чтобы просмотреть список отозванных сертификатов), используйте следующую команду openssl в каталоге easy-rsa на вашем сервере ЦС:

cd ~/easy-rsa
openssl crl -in pki/crl.pem -noout -text

Вы также можете запустить эту команду на любом сервере или системе, где установлен инструмент openssl с копией файла crl.pem. Например, если вы перенесли файл crl.pem в вашу вторую систему и хотите убедиться, что сертификат 8host-server отозван, вы можете использовать команду openssl, как показано ниже (но укажите свой серийный номер отзыва сертификата):

openssl crl -in /tmp/crl.pem -noout -text |grep -A 1 8348B3F146A765581946040D5C4D590A
Serial Number: 8348B3F146A765581946040D5C4D590A
Revocation Date: Apr  1 20:48:02 2020 GMT

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

Заключение

В этом мануале вы научились создавать частный центр сертификации на автономном сервере Ubuntu 20.04 с помощью пакета Easy-RSA. Вы также узнали, как работает модель доверия между сторонами, которые используют ваш ЦС. Вы создали и подписали запрос на сертификат (CSR) для условного сервера, а затем научились отзывать сертификаты. Теперь вы знаете, как создавать и распространять список отозванных сертификатов (CRL) для любой системы, которая доверяет вашему ЦС, чтобы пользователи или серверы без сертификатов не смогли получить доступ к сервисам.

Теперь вы можете выдавать сертификаты пользователям и использовать их с такими сервисами, как OpenVPN. Также ваш ЦС можно использовать для защиты веб-серверов промежуточной среды и среды разработки. В разработке сертификаты TLS могут обеспечить максимально возможное соответствие кода и рабочих сред.

Читайте также: Основы OpenSSL: SSL-сертификаты, закрытые ключи и запросы на подпись

Tags: , , , ,