Как развернуть и настроить инфраструктуру открытого ключа (PKI) и корпоративным центом сертификации (CA)

Security

В закрытой корпоративной сети часто возникает необходимость в развертывании и настройки Инфраструктуры Открытого Ключа (Public Key Infrastructure — PKI) с корпоративным центом сертификации (Certificate authority — CA). В этой статье я опишу настройку простейшего CA одноуровневой иерархии PKI.

Настройку PKI будем рассматривать на базе Ubuntu 16.04, главным действующим лицом станет фирма с громким названием ООО “Рога и копыта” или по английски Horns and hooves, LLC, у этой фирмы есть свой веб сайт ca.hhbb.me, через который она будет распространять CRL (списки SSL-сертификатов, отозванных CA).

 

1. Теория

Прежде чем приступать к настройке стоит разобраться в нескольких основополагающих вопросах.

Что такое сертификат? Сертификат —это набор полей в формате x.509, содержащий идентификатор субъекта (например, имя пользователя или компьютера), время действия, имя издателя, назначение, используемые алгоритмы хеширования и шифрования, правила проверки подлинности и открытый ключ, а также цифровую подпись, которая позволяет удостоверить подлинность и целостность сертификата.

Как формируется цифровая подпись? От всех значащих полей сертификата считается хеш-функция и шифруется закрытым ключом центра сертификации. В само-подписанных сертификатах или сертификатах корневого центра сертификации результаты хеш-функции шифруются закрытым ключом непосредственного субъекта сертификации.

Как проверяется сертификат? Предположим, мы подключаемся к веб-серверу по протоколу https и получаем его сертификат.

  • Проверяем его срок годности.
  • Проверяем находится ли CA которым был выпущен сертификат, списке доверительных CA на нашем ПК.
  • Проверяем подпись сертификата, те считаем заново хеш-сумму от всех значащих полей сертификата, расшифровываем цифровую подпись сертификата при помощи открытого ключа CA и сравниваем с нашей хеш-суммой, если совпадает — значит сертификат действительный.
  • Если в сертификате указана точка распространения списка отзыва сертификатов (CDP), то забираем от-туда список отзыва сертификатов (CRL), проверяем его цифровую подпись и отсутствие в этом списке нашего сертификата.
  • Проверяем дополнительные поля, например, может ли этот сертификат использоваться для шифрования веб-трафика.

 

Этот процесс нужно очень хорошо понимать.

Что такое центр сертификации? Центр сертификации (CA) — это некоторый набор софта, главная функция которого выдача, контроль и отзыв сертификатов. Каждый CA имеет свой сертификат и закрытый ключ. Закрытый ключ нужно хранить как зеницу ока, потому что он используется для подписи всех выдаваемых сертификатов и списков отзыва (CRL). Сертификату CA должны по априори доверять все компьютеры в сети.

Что такое PKI? PKI (Public Key Infrastructure — Инфраструктура Открытого Ключа) — это набор средств и правил необходимых для поддержания иерархии сертификатов. Проще говоря — это совокупность сертификатов, правил их выдачи и отзыва, правил хранения ключей, центров сертификации и тд.

Что такое одноуровневая PKI? Одноуровневая иерархия PKI — это наиболее простое решение для управления сертификатами, это один корневой центр сертификации, который подписывает все выдаваемые сертификаты организации. Недостаток одноуровневой системы заключается в недостаточной защищенности, возможности компрометации закрытого ключа корневого центра сертификации.

 

2. Настройка корневого центр сертификации (CA)

Переходим в директорию /etc/pki/CA, с этого момента она станет нашей рабочей директорией и все 100% действий мы будем делать в пределах нее.

mkdir -p /etc/pki/CA
cd /etc/pki/CA

 

Создаем необходимые для работы файлы, в index.txt будут записываться все выдаваемые сертификаты, в файлах serial будет храниться последний серийный номер выданного сертификата, а в crlnumber номер последнего списка отзыва сертификатов. Кажется мелочь, а работать без них ничего не будет.

touch index.txt
echo 01 > serial
echo 01 > crlnumber

 

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

mkdir request

 

Копируем файл с настройками центра сертификации и переходим к его редактированию.

cp ../etc/ssl/openssl.cnf .
vim openssl.cnf

 

Далее, нужно подправить файл настроек чтобы все заработало как нужно.

 # немножко подправим чтобы работало
[ CA_default ]
dir = /etc/pki/CA # удаяем все лишнее, текущая директория будет рабочая
private_key = $dir/private/cakey.pem # перед коментарием поставить пробел!

# В этом разделе описывается список вопросов которые задаст нам openssl при запросе
# нового сертификата, что бы сформировать так называемое уникальное имя DN. Что бы
# каждый раз не отвечать на них вручную зададим значения по умолчанию.
[ req_distinguished_name ]
countryName_default = UA
stateOrProvinceName_default = Ukraine
localityName_default = Kiev
0.organizationName_default = Horns and hooves, LLC

# Здесь описываются параметры которые CA во время подписывания добавит в клиентский
# сертификат
[ usr_cert ]
# Добавляем точку распространения сертификатов CA
authorityInfoAccess = caIssuers;URI:http://ca.hhbb.me/rootca.crt
# Добавляем точку распространения списков отзыва сертификатов
crlDistributionPoints = URI:http://ca.hhbb.me/rootca.crl

# Дополнительные расширения для самоподписанных сертификатов, они будут добавлены
# в корневой сертификат CA при создании.
[ v3_ca ]
# Добавляем параметр pathlen, значение 0 говорит о том что этот CA не будет
# поддерживать подчиненные CA
basicConstraints = CA:true,pathlen:0
# Используется только для подписи сертификатов и списка отзыва сертификатов (CRL)
keyUsage = critical, cRLSign, keyCertSign 

 

Теперь создадим сертификат корневого ЦС сроком на 5 лет, он спросит у нас пароль что бы зашифровать закрытый ключ и предложит заполнить несколько полей, в принципе немного раньше мы задали для них значения по умолчанию, поэтому смело щелкаем Enter, за исключением Common Name (CN) туда мы вводим полное название нашего CA: Horns and hooves, LLC Certification Authority.

openssl req -config openssl.cnf -new -x509 -keyout private/cakey.pem -out cacert.pem -days 1825

 

Пример вывода:

Generating a 2048 bit RSA private key
................+++
.....................................+++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [UA]:
State or Province Name (full name) [Ukraine]:
Locality Name (eg, city) []:Kiev
Organization Name (eg, company) [Horns and hooves, LLC]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Horns and hooves, LLC
Email Address []:[email protected]

 

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

openssl openssl ca -config openssl.cnf -gencrl -out crl.pem
Using configuration from openssl.cnf
Enter pass phrase for ./private/cakey.pem:

 

Далее необходимо установить веб-сервер apache:

apt-get install apache2

 

Теперь нужно опубликовать в интернете сертификат CA и список отзыва. У фирмы ООО “Рога и копыта” есть сайт ca.hhbb.me, для простоты эксперимента предположим, что у нас настроен сервере Apache, который перенаправляет все запросы с ca.hhbb.me в директорию /var/www/html/pki. Настройка Apache более подробна описана в статье: Как установить LAMP на сервере Debian 10. Создадим две символические ссылки:

ln -s /etc/pki/CA/cacert.pem /var/www/html/rootca.crt
ln -s /etc/pki/CA/crl.pem /var/www/html/rootca.crl

 

В итоге у нас получился полностью работоспособный корневой центр сертификации.

 

3. Работа с сертификатами

Что делать с центром сертификации дальше? Здесь мы рассмотрим две основополагающие функции, то для чего нужен CA — это выдача и отзыв сертификатов.

 

3.1 Выдача сертификатов

Предположим, что нам нужно выдать сертификат для защищенного при помощи SSLv3 сайта hhbb.me. Создадим запрос к центру сертификации, как и при создании корневого ЦС он задаст нам кучу вопросов, мы на все щелкаем Enter, а в Common Name вводим имя узла: hhbb.me.

openssl req -config openssl.cnf -new -nodes -keyout private/hhbb.me.key -out request/hhbb.me.csr

 

Пример вывода:

Generating a 2048 bit RSA private key
................................................+++
.........................................................................................+++
writing new private key to 'private/hhbb.me.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [UA]:
State or Province Name (full name) [Ukraine]:
Locality Name (eg, city) []:Kiev
Organization Name (eg, company) [Horns and hooves, LLC]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:hhbb.me
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[email protected]:/etc/pki/CA#

 

Отправляем запрос на сертификат hhbb.me.csr на подпись в CA и на выходе мы получим готовый подписанный сертификат. Для подписи потребуется ввести пароль закрытого ключа CA и дважды согласиться щелкнув y:

mkdir newcerts certs
openssl ca -config openssl.cnf -out certs/hhbb.me.crt -infiles request/hhbb.me.csr

 

Пример вывода:



Using configuration from openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: May 19 13:21:20 2020 GMT
Not After : May 19 13:21:20 2021 GMT
Subject:
countryName = UA
stateOrProvinceName = Ukraine
organizationName = Horns and hooves, LLC
commonName = hhbb.me
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
F8:9B:F6:C0:BD:D6:6B:5A:C7:4A:B6:07:F1:1C:DB:A4:BC:FA:00:94
X509v3 Authority Key Identifier:
keyid:0C:53:FB:2C:71:40:C4:CA:9E:EB:7B:2F:41:86:2E:B9:18:BD:C9:AB

Authority Information Access:
CA Issuers - URI:http://ca.hhbb.me/rootca.crt

X509v3 CRL Distribution Points:

Full Name:
URI:http://ca.hhbb.me/rootca.crl

Certificate is to be certified until May 19 13:21:20 2021 GMT (365 days)
Sign the certificate? [y/n]:y

 

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[email protected]:/etc/pki/CA#

 

Сертификат для сервера hhbb.me будет лежать в файле certs/hhbb.me.crt, а закрытый ключ в файле private/hhbb.me.key.

При необходимости конферетируем сертификат в формат PEM или DER:

openssl x509 -in hhbb.me.crt -out hhbb.me.pem
openssl x509 -in hhbb.me.crt -out hhbb.me.der

 

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

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

Помечаем сертификат в базе CA как отозванный:

openssl ca -config openssl.cnf -revoke certs/hhbb.me.crt
Using configuration from openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Revoking Certificate 01.
Data Base Updated
[email protected]:/etc/pki/CA#

 

Обновляем список отзыва сертификатов CRL:

openssl ca -config openssl.cnf -gencrl -out crl.pem
Using configuration from openssl.cnf
Enter pass phrase for ./private/cakey.pem:
[email protected]:/etc/pki/CA# 

 

 

4. Вместо заключения

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

 

 

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Ciscoкурсы по кибербезопасности,  полный курс по кибербезопасностикурсы DevNet (программируемые сети) от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).

Курсы Cisco и Linux с трудоустройством!

Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
  • Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
  • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
  • Если хотите индивидуальный график — обсудим и осуществим.
  • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
  • отредактировать резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
Security

Больше похожих постов

Запуск Firefox в песочнице

197
0
Введение В августе 2015 года исследователь безопасности Mozilla Cody Crews уведомил Mozilla о том, что вредоносная реклама на российском новостном…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Most Viewed Posts
Меню