Лабораторная работа №3
Цель работы
Изучить инфраструктуру открытых ключей на примере создания сертификата удостоверяющего центра, подписи сертификата, и настройки веб-сервера для использования TLS.
Теоретическая часть
Файл hosts
Файл hosts - текстовый файл, содержащий доменные имена и соответствующие им IP адреса. Файл hosts - первый в списке алгоритмов распознавания имен, поэтому если для доменного имени нашелся соответствующий IP адре с, то все остальные алгоритмы использованы не будут, т.е. не будет отправлен DNS запрос, NetBIOS запрос и т.д.
В ОС Windows файл hosts находится по пути C:\Windows\system32\drivers\etc
, в unix-based системах - /etc/hosts
.
Строка файла hosts обычно состоит из IP адреса, идущего за ним пробела, и доменного имени. Часто для блокировки подключения к конкретных доменным именам, им в соответствие ставят IP адрес 0.0.0.0.
Асимметричная криптография
В отличие от симметричной криптографии, в асимметричной используется два ключа: открытый (публичный, public) и закрытый (секретный, "приватный", private). Открытый ключ распространяется свободно, а закрытый держится в секрете и хранится только у владельца. Сообщение, зашифрованное для одного ключа, можно расшифровать только другим, поэтому для шифрования сообщений используют открытый ключ, при этом адресат расшифровывает сообщение соответствующим закрытым ключом, а для подписи - закрытый ключ, чтобы расшифровать (проверить действительность подписи, т.е. личность подписывающего) ее могли все, т.к. соответствующий открытый ключ распространяется свободно.
На практике операция шифрования данных асимметричной криптографией используется чаще всего в фазе установления соединения только для шифрования ключа симметричного шифра, который будет использоваться для шифрования всех остальных данных.
Инфраструктура открытых ключей
Инфраструктура открытых ключей (PKI - public key infrastructure) - набор средств, служб и компонентов, в совокупности используемых для поддержки криптозадач на основе закрытого и открытого ключей.
Основные Принципы:
- закрытый ключ (private key) известен только его владельцу
- удостоверяющий центр (УЦ или CA - certificate authority) создает сертификат, таким образом удостоверяя факт того, что закрытый ключ известен только владельцу этого сертификата
- никто не доверяет друг другу, но все доверяют удостоверяющему центру
- удостоверяющий центр подтверждает или опровергает принадлежность открытого ключа заданному лицу, которое владеет соответствующим закрытым ключом
Удостоверяющие центры
Удостоверяющий центр является структурой, формирующей цифровые сертификаты подчиненных центров сертификации и конечных пользователей. УЦ является доверенной третьей стороной.
Сертификат - это данные пользователя/сервера и его открытый ключ, скрепленные электронной подписью удостоверяющего центра. Выпуская сертификат открытого ключа, удостоверяющий центр тем самым подтверждает, что лицо, записанное в сертификате, владеет закрытым ключом, который соответствует этому открытому ключу.
Корневые удостоверяющие центры - центры сертификации, которым доверяют изначально все, либо руководствуясь политикой предприятия, либо из-за предустановленных настроек хранилища сертификатов, и которые могут находиться в начале пути доверия.
Сертификаты
Простой сертификат содержит следующие поля:
Serial Number
- серийный номер, используется для идентификации сертификата в автоматизированных системах УЦSubject
- кому принадлежит сертификат: конкретной машине, лицу, организацииIssuer
- издатель сертификата, тот, кто его подписалNot Before
- дата начала действия сертификатаNot After
- дата конца действия сертификатаKey Usage
- задачи, для которых действителен публичный ключ сертификата: проверка подписи, подпись других сертификатов (только для УЦ, не разрешена у конечных сертификатов) и т.д.Extended Key Usage
- для каких еще задач может быть использован сертификат: аутентификация сервера, защита почты, подпись программного кодаPublic Key
- публичный ключSignature Algorithm
- алгоритм подписиSignature
- подпись: хеш и подпись (алгоритмом из поляSignature Algorithm
) секретным ключом издателя сертификата
Поле Subject
часто состоит из:
common name
(CN) - доменное имяorganization
(O) - организацияorganizational unit
(OU) - единица внутри организации, например отделcountry
(C) - страна (например US)locality
(L) - город (например San Francisco)state
(ST) - штат или область (например California)
Сертификат считается самоподписанным, если его издатель совпадает с самим сертификатом. Подпись в таком случае проверяется публичным ключом самого сертификата. Сертификаты корневых УЦ обычно самоподписанные.
Для получения сертификата у УЦ необходимо сформировать запрос на подпись сертификата (CSR - certificate signing request), который не будет рассматриваться в контексте данной лабораторной работы.
Цепь сертификатов на примере сайта https://www.opennet.ru:
$ openssl s_client -showcerts -connect www.opennet.ru:443
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = opennet.ru
verify return:1
---
Certificate chain
0 s:CN = opennet.ru
i:C = US, O = Let's Encrypt, CN = R3
a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
v:NotBefore: Jul 10 18:53:16 2023 GMT; NotAfter: Oct 8 18:53:15 2023 GMT
...
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Sep 4 00:00:00 2020 GMT; NotAfter: Sep 15 16:00:00 2025 GMT
...
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
a:PKEY: rsaEncryption, 4096 (bit); sigalg: RSA-SHA256
v:NotBefore: Jan 20 19:14:03 2021 GMT; NotAfter: Sep 30 18:14:03 2024 GMT
...
Виден сертификат CN = opennet.ru
, который принадлежит непосредственно сайту, который издан C = US, O = Let's Encrypt, CN = R3
, который издан C = US, O = Internet Security Research Group, CN = ISRG Root X1
.
Последний является серт ифкатом корневого УЦ. Найти его можно в системном хранилище сертификатов корневых УЦ, а также в веб-браузерах, которые обычно имеют свои списки, которые обновляются независимо от механизма обновления ОС. ISRG Root X1
в хранилище сертификатов Firefox:
Сертификат между корневым и принадлежащим конкретно opennet.ru, принадлежит Let's Encrypt. Let's Encrypt - популярный УЦ, появившийся в 2014 году, предоставляющий бесплатные сертификаты при условии подтверждения владения сервером. Подтверждение может быть целиком автоматизировано и состоит из создания файла с одноразовой строкой на сервере и отдачей его по HTTP.
Сертификат, принадлежащий opennet.ru, не имеет способности подписывать другие сертификаты.
С точки зрения безопасности, атакующий, получивший доступ к сертификату доверенного УЦ, может подписывать любые сертификаты и использовать их, например, для перехвата трафика, если организует атаку типа "человек посередине" (не обязательно активная атака, это может сделать, например, VPN-провайдер). Неоднократно из списка корневых сертификатов удалялись сертификаты УЦ, действия которых были подозрительными (примеры: TrustCor, Symantec).
Тем не менее, по сей день в списке корневых сертификатов можно встретить например Hongkong Post Root CA
(виден на скриншоте выше), который, судя по всему, принадлежит почте Гонконга. Срок его действия абсурдно большой - 2017-2042 годы. Стоит ли доверять почте Гонконга так, как это делает по умолчанию Firefox?
Практическая часть
В практической части будет рассмотрено создание сертификата УЦ, подписи сертификата веб-сервера и настройка веб-сервера nginx. Создание УЦ или использование самоподписанных сертификатов на практике часто используется в интранетах различных компаний.
Инструменты
Kali Linux - дистрибутив GNU/Linux для проведения тестов безопасности. Основан на основе Debian, имеет множество предустановленных инструментов.
XCA - программа для управления ключами и сертификатами.
nginx - веб-сервер.
Firefox - веб-браузер.
Создание и запуск виртуальной машины
- Тип: Linux, Debian (64-bit)
- Оперативная память: 2560 МиБ, процессор: 2+
- Жесткий диск: отсутствует
- CD диски:
kali-linux-2023.1-live-amd64.iso
иkalipackages.iso
После создания ВМ:
- Запустить ВМ
- Выбрать "Live system (amd64)" в загрузчике
- Дождаться загрузки
- Открыть терминал: ПКМ по рабочему столу > Open Terminal Here
- Если рабочий стол виртуальной машины слишком маленький относительно размера окна в хост-системе, то попробовать изменить размер окна ВМ. Если не помогло, то ПКМ по рабочему столу > Open Terminal Here, ввести
xrandr --output Virtual1 --mode 1920x1080
, где 1920x1080 - одно из поддерживаемых разрешений. Полный список можно посмотреть выполнивxrandr
без агрументов. - Открыть диск
Packages
(значок есть на рабочем столе), открыть терминал в открывшейся директории, выполнитьsudo dpkg -i xca*.deb
Создание БД в XCA
XCA хранит все данные в базе данных. Для создания базы данных необходимо выбрать File > New DataBase, после чего ввести название и нажать Save. После этого программа предложит ввести пароль, при этом разрешается использовать пустые пароли.
Создание приватных ключей в XCA
- Выбрать вкладку
Private Keys
- Нажать
New Key
- Ввести название ключа, выбрать тип и длину
- Нажать
Create
Генерация сертификата
- Выбрать вкладку
Certificates
- Нажать
New Certificate
- Выбрать шаблон (
Template for new certificate
). В контексте лабораторной работы либо[default] CA
для удостоверяющего центра, либо[default] TLS_server
для веб-сервера. НажатьApply all
. - Выбрать издателя сертификата: либо другой сертификат, либо самоподписанный (
Create a self signed certificate
) - Заполнить поля во вкладке
Subject
. ПоляcommonName
в контексте лабораторной работы будет достаточно. - Выбрать правильный приватный ключ (
Private key
) - Нажать
OK
Если сертификат был издан УЦ, то он будет скрыт в раскрывающемся списоке соответствующего сертификата УЦ.
Экспорт сертификатов из XCA
- Выбрать необходимый сертификат
- Нажать кнопку
Export
(справа) - Ввести название файла
- Выбрать формат. В контексте лабораторной работы: если необходима полная цепочка, то необходимо выбрать
PEM chain (*.pem)
, иначеPEM (*.crt)
. - Нажать
OK
Экспорт ключей из XCA
- Выбрать необходимый ключ
- Нажать кнопку
Export
(справа) - Ввести название файла
- Выбрать формат. В контексте лабораторной работы
PEM private (*.pem)
. - Нажать
OK
Настройка TLS в nginx
-
Открыть терминал: нажать на значок в верхнем левом углу (рядом с цифрой 1)
-
Открыть
/etc/nginx/nginx.conf
в любом текстовом редакторе (предустановленыvim
иnano
) с правамиroot
.В случае nano:
sudo nano /etc/nginx/nginx.conf
. Перемещение стрелками, Ctrl-S - сохранить, Ctrl-X - выйти. -
В блок
http
(начинается со строкиhttp {
) добавить:server {
listen 443 ssl;
ssl_certificate /home/kali/XXYY.com.pem;
ssl_certificate_key /etc/nginx/Cert_key.pem;
}Где
XXYY.com.pem
- имя файла экспортированного сертификата,Cert_key.pem
- имя файла приватного ключа. -
Сохранить, выйти из текстового редактора, выполнить
sudo systemctl restart nginx
.
Добавление записи в файл hosts
Аналогично прошлому пункту открыть файл /etc/hosts
в текстовом редакторе, добавить строку:
127.0.0.1 XXYY.com
Сохранить и выйти из редактора.
Это необходимо делать так как при подключении по HTTPS будет проверяться соответствие сертификата доменному имени, поэтому при подключении к https://127.0.0.1/ будет выведена ошибка, а при подключении к https://XXYY.com/ - нет.
Добавление УЦ в Firefox
Нажать Alt на клавиатуре > Edit > Settings > Privacy & Security > View Certificates > Authorities > Import > УЦ_ИУ5-XX_YY.crt
(название файла сертификата УЦ), поставить галочку "Trust this CA to identify websites", нажать OK.
Информация о сертификатах в Firefox
На примере имени xx1.com
.
Нажать на значок с изображением замка:
Далее Connection secure
> More information
> View Certificate
.
Начало информации о сертификате веб-сервера будет выглядеть примерно так:
А информация об УЦ так:
Задание
Далее XXYY - число, где XX - номер группы, YY - порядковый номер студента в группе.
- Запустить ВМ
- Запустить XCA, создать базу данных
- Создать два приватных ключа: один для удостоверяющего центра, другой для сертификата веб-сервера
- Создать самоподписанный сертификат УЦ. В
commonName
включить номер группы и порядковый номер студента в группе. - Создать сертификат для веб-сервера, изданный УЦ.
commonName
в форматеXXYY.com
- Экспортировать полную цепочку сертификата веб-сервера, приватный ключ сертификата веб-сервера, и сертификат УЦ
- Настроить TLS в веб-сервере nginx
- Добавить запись для распознавания доменного имени
XXYY.com
в файл hosts - Добавить УЦ в Firefox
- Открыть https://XXYY.com/ в Firefox (значок слева от значка терминала), продемонстрировать демо-страницу, информацию о сертификате веб-сервера и УЦ