###### 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 ``` Вывод: ![](https://i.imgur.com/qCiXCKW.png) ## Создание ЦС. Прежде чем создавать закрытый ключ и сертификат ЦС, необходимо создать файл с именем vars и заполнить его значениями по умолчанию. Используйте команду cd для перехода в директорию easy-rsa, а затем создайте и отредактируйте файл vars с помощью nano или другого предпочитаемого текстового редактора: ``` cd ~/easy-rsa cp vars.example vars nano vars ``` Отыщите вот эту часть: ![](https://i.imgur.com/xmYIUJs.png) Раскоментите и измените под себя. К примеру так: ![](https://i.imgur.com/2Qpyopj.png) Для создания корневой пары открытого и закрытого ключей для Центра сертификации необходимо запустить команду ./easyrsa еще раз, но уже с опцией build-ca: ``` ./easyrsa build-ca ``` Вы увидите несколько строк с указанием версии OpenSSL, а затем вам будет предложено ввести фразу-пароль для пары ключей. Используйте надежную фразу-пароль и запишите ее в безопасном месте. Вам нужно будет вводить фразу-пароль каждый раз, когда вам потребуется взаимодействовать с ЦС, в частности при подписании или отзыве сертификата. Также вам будет предложено подтвердить обычное имя (CN) вашего ЦС. CN — это имя, которое будет использоваться для данного компьютера в контексте Центра сертификации. Вы можете использовать любую строку символов как обычное имя ЦС, но для простоты нажмите ENTER, чтобы использовать имя по умолчанию. ![](https://i.imgur.com/S5MHNqj.png) :::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 ``` Скопируйте ключ. ![](https://i.imgur.com/fq3WKfy.png) Используйте 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 к примеру сертифика добавляеться через связку ключей: ![](https://i.imgur.com/7WHmKZm.png) Нужно просто перетащить файл сертификата в связку ключей в нужный раздел. И в свойствах выбрать всегда доверять. В 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 ``` ![](https://i.imgur.com/UQfopuB.png) Теперь у нас имеется закрытый ключ, с помощью которого можно создать CSR, используя утилиту openssl. Вам будет предложено заполнить ряд полей, в том числе указать страну, область и город. Вы можете ввести ., если хотите оставить поле пустым, но для реальных CSR лучше использовать правильные значения при указании своего расположения и организации: ``` openssl req -new -key supernova.key -out supernova.req ``` Когда вас устроит тема запроса тренировочного сертификата, скопируйте файл supernova.req на сервер ЦС с помощью sftp: ![](https://i.imgur.com/5DCG7To.png) ## Подписание 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 ``` ![](https://i.imgur.com/wV3Cp7t.png) :::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://i.imgur.com/c8t7gXK.png) ## Проверка работы инфраструктуры ЦС. Для проверки я импортировал открытый сертификат ЦС себе на ноутбук. А на втором сервере создам сайт с 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. Как можем заметить все работает без всяких предупреждений и есть иерархия сертификатов: ![](https://i.imgur.com/A8pfTpw.png) Поскольку есть доверие к сертификату ЦС то будет и доверие ко всем сертификатам которые он подписал своим закрытым ключем. ## Итог В целом мы рассмотрели почти все что вам нужно, но отдельно можете посмотреть как настроить отзыв сертификатов. :::danger На демо экзамене обязательно будет задание по созданию локального центра сертификации. Поэтому рекомендую выучить наизусть команды из этого гайда, поскольку доступа в интернет у вас не будет. ::: Источник: [Настройка Центра сертификации](https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-debian-10-ru).