###### tags: Linux
# Развертывание центра сертификации.
Центр сертификации (Certificate Authority, CA) – это сторона (организация), ответственная за выдачу цифровых сертификатов для проверки подлинности в Интернете. Часто для проверки подлинности веб-сайтов и других сервисов, предоставляемых широкой публике, используются публичные ЦС, а частные ЦС обычно используются для закрытых групп и частных сервисов.
Создав частный центр сертификации, вы сможете настраивать, тестировать и запускать программы, которые требуют зашифрованных соединений между клиентом и сервером. С частным ЦС у вас появится возможность выдавать сертификаты для пользователей, серверов или отдельных программ и сервисов в вашей инфраструктуре.
Среди программ Linux, которые используют свои собственные частные ЦС – OpenVPN и Puppet. Вы также можете настроить свой веб-сервер для поддержки сертификатов, выданных частным ЦС, чтобы среда разработки и промежуточная среда соответствовали производственным серверам, использующим TLS для шифрования соединений.
## Подготовка перед созданием ЦС.
Мы будем использовать инструмент управления ЦС easy-rsa для генерирования частного ключа и публичного корневого сертификата, с помощью которых вы будете подписывать запросы клиентов и серверов, использующих ваш ЦС.
Установите утилиту:
```
apt install easy-rsa
```
Подготовим директории для центра сертификации. Для этого войдите из под root пользователя:
```
sudo su -
```
Создадим директорию в домашнем каталоге пользователя root:
```
mkdir ~/easy-rsa
```
Мы используем эту директорию для создания символических ссылок, указывающих на файлы пакета easy-rsa, установленные на предыдущем шаге. Эти файлы находятся в папке /usr/share/easy-rsa на сервере ЦС.
Создайте символические ссылки с помощью команды ln:
```
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
```
:::success
Некоторые копируют файлы easy-rsa в директорию PKI, но мы используем символические ссылки, для того чтобы любые изменения пакета easy-rsa автоматически отражались в наших скриптах PKI.
:::
Чтобы ограничить доступ к созданной директории PKI, используйте команду chmod для предоставления доступа к ней только владельцу:
```
chmod 700 /root/easy-rsa/
```
Затем инициализируйте PKI в директории easy-rsa:
```
cd ~/easy-rsa
./easyrsa init-pki
```
Вывод:

## Создание ЦС.
Прежде чем создавать закрытый ключ и сертификат ЦС, необходимо создать файл с именем vars и заполнить его значениями по умолчанию. Используйте команду cd для перехода в директорию easy-rsa, а затем создайте и отредактируйте файл vars с помощью nano или другого предпочитаемого текстового редактора:
```
cd ~/easy-rsa
cp vars.example vars
nano vars
```
Отыщите вот эту часть:

Раскоментите и измените под себя. К примеру так:

Для создания корневой пары открытого и закрытого ключей для Центра сертификации необходимо запустить команду ./easyrsa еще раз, но уже с опцией build-ca:
```
./easyrsa build-ca
```
Вы увидите несколько строк с указанием версии OpenSSL, а затем вам будет предложено ввести фразу-пароль для пары ключей. Используйте надежную фразу-пароль и запишите ее в безопасном месте. Вам нужно будет вводить фразу-пароль каждый раз, когда вам потребуется взаимодействовать с ЦС, в частности при подписании или отзыве сертификата.
Также вам будет предложено подтвердить обычное имя (CN) вашего ЦС. CN — это имя, которое будет использоваться для данного компьютера в контексте Центра сертификации. Вы можете использовать любую строку символов как обычное имя ЦС, но для простоты нажмите ENTER, чтобы использовать имя по умолчанию.

:::success
Примечание. Если вы не хотите вводить пароль при каждом взаимодействии с ЦС, вы можете запустить команду 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` должен храниться только на компьютере ЦС, и для дополнительной безопасности компьютер ЦС следует выключать, когда он не используется для подписания запросов сертификатов.
Мы установили ЦС и готовы использовать его для подписания запросов сертификатов и отзыва сертификатов.
## Распространение публичного сертификата Центра сертификации.
Мы настроили ЦС и можем использовать его в качестве корня доверия для любых систем, которые захотим настроить для этого. Сертификат ЦС можно добавлять на серверы OpenVPN, веб-серверы, почтовые серверы и т. д. Каждый пользователь или сервер, которому потребуется подтвердить подлинность другого пользователя или сервера в вашей сети, должен иметь копию файла ca.crt, импортированную в хранилище сертификатов операционной системы.
Чтобы импортировать публичный сертификат ЦС во вторую систему Linux, например на сервер или локальный компьютер, нужно предварительно получить копию файла ca.crt с сервера ЦС. Вы можете использовать команду cat для ее вывода в терминал, а затем скопировать и вставить ее в файл на втором компьютере, который импортирует сертификат. Также вы можете использовать sftp, scp, rsync и другие подобные инструменты для передачи файла между системами. Мы используем для копирования и вставки текстовый редактор nano, поскольку этот вариант подойдет для всех систем.
```
cat pki/ca.crt
```
Скопируйте ключ.

Используйте nano или предпочитаемый текстовый редактор на второй системе Linux, чтобы открыть файл с именем /tmp/ca.crt:
```
nano /tmp/ca.crt
```
В системах под управлением Debian и Ubuntu для импорта сертификата нужно использовать следующие команды:
```
cp /tmp/ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
```
Теперь вторая система Linux будет доверять любому сертификату, подписанному нашим сервером ЦС.
:::success
Если вы используете ЦС с веб-серверами и браузер Firefox, вам нужно будет импортировать публичный сертификат ca.crt в Firefox напрямую. Firefox не использует локальное хранилище сертификатов операционной системы.
:::
В Mac OS к примеру сертифика добавляеться через связку ключей:

Нужно просто перетащить файл сертификата в связку ключей в нужный раздел. И в свойствах выбрать всегда доверять.
В Windows тоже все очень просто: [перейдите по ссылке](https://zawindows.ru/как-добавить-сертификат-центра-серти/).
## Создание запросов на подписание сертификатов.
Мы настроили ЦС для использования и теперь можем попробовать сгенерировать закрытый ключ и запрос сертификата, чтобы познакомиться с процессом подписания и распространения.
Запрос на подписание сертификата (CSR) состоит из трех частей, а именно открытого ключа, идентификационной информации запрашивающей системы и подписи запроса, создаваемой на основе закрытого ключа запрашивающей системы. Закрытый ключ остается секретным, и его можно будет использовать для шифрования информации, которую сможет расшифровать любой пользователь с подписанным открытым сертификатом.
Следующие шаги будут выполняться на второй системе Linux с Debian, Ubuntu или одним из производных дистрибутивов.
Поскольку по умолчанию easy-rsa доступна не на всех системах, мы используем инструмент openssl для создания тренировочного закрытого ключа и сертификата.
```
apt install openssl
```
В первую очередь для создания CSR необходимо сгенерировать закрытый ключ. Чтобы создать закрытый ключ с помощью openssl, создайте директорию practice-csr и сгенерируйте ключ в этой директории.
```
mkdir ~/practice-csr
cd ~/practice-csr
openssl genrsa -out supernova.key
```

Теперь у нас имеется закрытый ключ, с помощью которого можно создать CSR, используя утилиту openssl. Вам будет предложено заполнить ряд полей, в том числе указать страну, область и город. Вы можете ввести ., если хотите оставить поле пустым, но для реальных CSR лучше использовать правильные значения при указании своего расположения и организации:
```
openssl req -new -key supernova.key -out supernova.req
```
Когда вас устроит тема запроса тренировочного сертификата, скопируйте файл supernova.req на сервер ЦС с помощью sftp:

## Подписание CSR
Поскольку мы будем работать внутри инфраструктуры PKI в ЦС, где доступна утилита easy-rsa, мы будем использовать утилиту easy-rsa для большего удобства в отличие от использования openssl, как мы делали в предыдущем примере.
Первым шагом для подписания вымышленного CSR будет импорт запроса сертификата с помощью скрипта easy-rsa:
```
cd ~/easy-rsa
./easyrsa import-req /tmp/supernova.req supernova
```
Теперь вы можете подписать запрос, запустив скрипт easyrsa с опцией sign-req, указав затем тип запроса и общее имя, включаемое в CSR. Запрос может иметь тип client, server или ca. Поскольку мы тренируемся с сертификатом для вымышленного сервера, нужно использовать тип запроса server:
```
./easyrsa sign-req server supernova
```

:::danger
commonName должен совпадать с доменным именним сайта. Поэтому если необходимо сгенерировать ssl для сайта mpt.org указываете в поле commonName = mpt.org
:::
Если вы зашифровали ключ ЦС, вам будет предложено ввести пароль.
Выполнив эти шаги, мы подписали CSR supernova.req с помощью закрытого ключа сервера ЦС в директории /home/sammy/easy-rsa/pki/private/ca.key. Полученный файл sammy-server.crt содержит открытый ключ шифрования тренировочного сервера, а также новую подпись от сервера ЦС. Подпись сообщает всем, кто доверяет ЦС, что они также могут доверять сертификату supernova.
Если бы это был запрос веб-сервера, сервера VPN или другого реального сервера, последним шагом на сервере ЦС стало бы распространение новых файлов supernova.crt и ca.crt с сервера ЦС на удаленный сервер, отправивший запрос CSR:

## Проверка работы инфраструктуры ЦС.
Для проверки я импортировал открытый сертификат ЦС себе на ноутбук. А на втором сервере создам сайт с https на nginx c использованием ранее подписанного сертификата.
Создам конфиг сайта:
```
server{
listen 80;
return 301 "https://$host$request_uri";
}
server {
listen 443 ssl http2;
server_name supernova;
ssl_certificate /etc/nginx/ssl/supernova.crt;
ssl_certificate_key /etc/nginx/ssl/supernova.key;
}
```
Скопируем ранее созданные ключи в директорию `nginx/ssl`
```
cp supernova.key /etc/nginx/ssl/
cp supernova.crt /etc/nginx/ssl/
```
Перезапустим nginx. Учтите чтобы компьютер доверял сайту доменное имя должно совпадать с именем указанным в поле `common-Name`, когда создавался сертификат. В моем случае это просто supernova. И чтобы открыть сайт я отредактировал у себя файл hosts.
Как можем заметить все работает без всяких предупреждений и есть иерархия сертификатов:

Поскольку есть доверие к сертификату ЦС то будет и доверие ко всем сертификатам которые он подписал своим закрытым ключем.
## Итог
В целом мы рассмотрели почти все что вам нужно, но отдельно можете посмотреть как настроить отзыв сертификатов.
:::danger
На демо экзамене обязательно будет задание по созданию локального центра сертификации. Поэтому рекомендую выучить наизусть команды из этого гайда, поскольку доступа в интернет у вас не будет.
:::
Источник: [Настройка Центра сертификации](https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-debian-10-ru).