Шаблон для выполнения работы
Для выполнения работы создайте новый файла в Obsidian, назовите его “Фамилия Имя Отчество Группа”, скопируйте и вставьте представленный ниже шаблон:
# Лабораторная работа №3
## Практическая часть
```bash
Вставьте сюда содержимое файла openssl_root.cnf
```
```bash
Вставьте сюда вывод команд из этапа 1.2
```
```bash
Вставьте сюда вывод команд из этапа 1.3
```
```bash
Вставьте сюда содержимое openssl_subca.cnf
```
```bash
Вставьте сюда вывод команд из этапа 2.2
```
```bash
Вставьте сюда вывод команд из этапа 2.3
```
```bash
Вставьте сюда вывод команд из этапа 2.4
```
```bash
Вставьте сюда вывод команд из этапа 3.1
```
```bash
Вставьте сюда вывод команд из этапа 3.2
```
```bash
Вставьте сюда вывод команд из этапа 4
```
```bash
# Вставьте сюда вывода следующей команды, где cert.pem -- название вашего конечного сертификата
$ openssl x509 -in cert.pem -noout -text
```
## Вопросы для самопроверки
1. **Что такое TLS/SSL и какие основные задачи оно решает?**
2. **Какие этапы включает процесс установления TLS/SSL-соединения?**
3. **Что такое CA и SubCA, и в чем разница между ними?**
4. **Что такое цепочка доверия и как она работает в контексте TLS/SSL?**
5. **Для чего используется файл конфигурации openssl.cnf при создании сертификатов?**
6. **Какие ключевые параметры конфигурации следует указывать для Root CA в openssl.cnf?**
7. **Как создать CSR (Certificate Signing Request) и для чего он используется?**
8. **Какими командами OpenSSL можно проверить цепочку доверия для конечного сертификата?**
9. **Какие поля включаются в CSR при его создании, и какие из них обязательны?**
10. **Что произойдет, если в цепочке доверия будет отсутствовать сертификат Root CA?**
Теоретическая часть
Введение
Протоколы TLS (Transport Layer Security) и SSL (Secure Sockets Layer) играют ключевую роль в защите данных, передаваемых через интернет. TLS, являясь развитием SSL, обеспечивает три основных аспекта безопасности:
- Конфиденциальность — данные шифруются, чтобы предотвратить доступ третьих лиц;
- Аутентификация — подтверждение подлинности участвующих сторон;
- Целостность данных — проверка, что данные не были изменены во время передачи.
Эти элементы создают безопасный канал, позволяющий пользователям доверять серверам и защищать свою информацию. OpenSSL — библиотека с открытым исходным кодом, которая поддерживает протоколы TLS/SSL, а также предлагает инструменты для работы с цифровыми сертификатами и ключами, используемыми для безопасной передачи данных.
1. Основы работы TLS/SSL
Цель и задачи TLS/SSL
TLS/SSL разработан для обеспечения защиты данных на уровне приложений и сетевых протоколов. Защита достигается за счет выполнения следующих задач:
- Аутентификация сторон — подтверждение подлинности сервера и, по возможности, клиента, используя цифровые сертификаты.
- Конфиденциальность данных — защита информации от перехвата с помощью шифрования данных.
- Целостность данных — предотвращение изменений данных во время передачи, используя алгоритмы контроля целостности.
Фазы TLS/SSL соединения
Для установки защищенного соединения TLS/SSL выполняется несколько фаз, известные как TLS/SSL-хэндшейк:
Хэндшейк (TLS/SSL Handshake):
- Client Hello (Приветствие клиента): клиент отправляет серверу свой поддерживаемый набор криптографических алгоритмов и версию протокола.
- Server Hello (Ответ сервера): сервер выбирает шифровальный набор и отправляет свой сертификат для аутентификации.
- Аутентификация сервера: клиент проверяет подлинность сервера, удостоверяясь в его сертификате.
- Обмен ключами: клиент и сервер устанавливают параметры защищенного канала и создают симметричные ключи для шифрования.
Установка защищенного канала:
- После хэндшейка обе стороны используют установленные симметричные ключи для шифрования передаваемых данных, так как симметричное шифрование выполняется быстрее и подходит для больших объемов информации.
Завершение сессии:
- Когда одна из сторон завершает соединение, сессионные ключи уничтожаются, что предотвращает повторное использование ключей в дальнейшем.
Цепочка доверия в TLS/SSL
Основой доверия в TLS/SSL является цифровой сертификат, выданный удостоверяющим центром (CA). CA подтверждает подлинность сертификатов, обеспечивая доверие между клиентом и сервером.
В цепочке доверия участвуют:
- Центральный CA (Root CA) — главное доверенное лицо, которое выдает сертификаты другим удостоверяющим центрам.
- Подчиненные CA (Intermediate CA) — получают сертификаты от Root CA и выдают их конечным пользователям.
- Конечный сертификат — сертификат, который принадлежит конечному пользователю или серверу и подтверждает его подлинность.
Когда браузер или клиентское приложение получает сертификат сервера, он проверяет его по цепочке доверия, начиная с конечного сертификата и поднимаясь до Root CA. Если все сертификаты в цепочке валидны и принадлежат доверенным удостоверяющим центрам, соединение признается безопасным.
2. Основные команды OpenSSL
OpenSSL предоставляет инструменты для работы с цифровыми сертификатами, создания запросов на сертификаты и управления криптографическими ключами. Рассмотрим некоторые базовые команды:
Генерация приватного ключа:
openssl genpkey -algorithm RSA -out private_key.pem
Эта команда генерирует RSA-приватный ключ, который используется для создания подписей и шифрования данных.
Создание запроса на сертификат (CSR):
openssl req -new -key private_key.pem -out csr.pem
CSR (Certificate Signing Request) — это запрос на сертификат, который содержит информацию о владельце и его открытый ключ. Он отправляется в CA для получения сертификата.
Создание самоподписанного сертификата:
openssl x509 -req -days 365 -in csr.pem -signkey private_key.pem -out certificate.pem
Эта команда позволяет создать самоподписанный сертификат, который можно использовать для тестирования и локальной разработки.
Эти команды позволяют генерировать ключи и сертификаты, которые являются основными элементами инфраструктуры открытых ключей (PKI) и основой для реализации безопасных соединений.
Практическая часть
В данной практической части мы будем использовать конфигурационные файлы openssl.cnf
для Root CA и SubCA, чтобы упростить настройку параметров и политики сертификатов. Выполнять данные инструкции следует на ПЕРВОМ СЕРВЕРЕ.
Подготовка конфигурационных файлов
Создайте две версии openssl.cnf
: одну для Root CA, другую для SubCA. Эти конфигурационные файлы будут содержать настройки путей к сертификатам и ключам, политику сертификатов, а также параметры для подписания.
Шаг 1: Настройка Root CA с использованием конфигурации openssl.cnf
1.1 Подготовка конфигурационного файла openssl.cnf для Root CA
Создайте файл openssl_root.cnf
и добавьте следующие параметры:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = ./rootCA # Директория CA
certs = $dir/certs # Сертификаты
crl_dir = $dir/crl # Список отозванных сертификатов
new_certs_dir = $dir/newcerts # Новые сертификаты
database = $dir/index.txt # База данных
serial = $dir/serial # Счетчик серийных номеров
RANDFILE = $dir/private/.rand # Файл с случайными числами
# Параметры сертификата
private_key = $dir/private/root_ca_key.pem # Приватный ключ CA
certificate = $dir/certs/root_ca_cert.pem # Сертификат CA
default_md = sha256 # Хэш-алгоритм
policy = policy_strict # Политика сертификатов
email_in_dn = no # Запрет email в DN
name_opt = ca_default # Настройки имени
cert_opt = ca_default # Настройки сертификата
copy_extensions = copy # Копирование расширений
[ policy_strict ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca # Расширения для самоподписанного сертификата
prompt = no
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = RU
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Moscow
organizationName = Organization Name (eg, company)
organizationName_default = I.Ivanov
commonName = Common Name (eg, YOUR name)
commonName_default = Root CA
[ v3_ca ]
basicConstraints = critical,CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
Примечание: Путь
$dir
в конфигурацииopenssl_root.cnf
указывает на директориюrootCA
, где будут храниться сертификаты, ключи и файлы базы данных CA.
1.2 Инициализация файлов и директорий для Root CA
Создайте структуру директорий:
mkdir -p rootCA/{certs,crl,newcerts,private}
touch rootCA/index.txt
echo 1000 > rootCA/serial
1.3 Генерация приватного ключа и сертификата Root CA с использованием конфигурации
Используя файл openssl_root.cnf
, сгенерируйте ключ и сертификат Root CA:
openssl req -x509 -new -nodes -keyout rootCA/private/root_ca_key.pem -out rootCA/certs/root_ca_cert.pem -days 3650 -config openssl_root.cnf
Шаг 2: Настройка SubCA с использованием конфигурации openssl.cnf
2.1 Подготовка конфигурационного файла openssl.cnf для SubCA
Создайте файл openssl_subca.cnf
с аналогичной структурой, но для SubCA:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = ./subCA # Директория SubCA
certs = $dir/certs # Сертификаты
crl_dir = $dir/crl # Список отозванных сертификатов
new_certs_dir = $dir/newcerts # Новые сертификаты
database = $dir/index.txt # База данных
serial = $dir/serial # Счетчик серийных номеров
RANDFILE = $dir/private/.rand # Файл с случайными числами
# Параметры сертификата
private_key = $dir/private/subca_key.pem # Приватный ключ SubCA
certificate = $dir/certs/subca_cert.pem # Сертификат SubCA
default_md = sha256 # Хэш-алгоритм
policy = policy_loose # Политика сертификатов
email_in_dn = no # Запрет email в DN
name_opt = ca_default # Настройки имени
cert_opt = ca_default # Настройки сертификата
copy_extensions = copy # Копирование расширений
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca # Расширения для сертификата SubCA
prompt = no
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = RU
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Moscow
organizationName = Organization Name (eg, company)
organizationName_default = I.Ivanov
commonName = Common Name (eg, YOUR name)
commonName_default = SubCA
[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:0
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
2.2 Инициализация файлов и директорий для SubCA
Создайте структуру директорий:
mkdir -p subCA/{certs,crl,newcerts,private}
touch subCA/index.txt
echo 1000 > subCA/serial
2.3 Генерация приватного ключа и CSR для SubCA
Используя файл openssl_subca.cnf
, сгенерируйте ключ и CSR для SubCA:
openssl req -new -keyout subCA/private/subca_key.pem -out subCA/subca_csr.pem -config openssl_subca.cnf
2.4 Подпись CSR SubCA с использованием Root CA
Подпишите CSR SubCA с использованием Root CA и его конфигурационного файла:
openssl ca -config openssl_root.cnf -in subCA/subca_csr.pem -out subCA/certs/subca_cert.pem -days 3650 -batch
Шаг 3: Выпуск конечного SSL-сертификата для пользователя с использованием SubCA
3.1 Генерация приватного ключа и CSR для конечного пользователя
Сгенерируйте ключ и CSR для конечного пользователя:
$ openssl req -new -keyout user_private_key.pem -out user_csr.pem -config openssl_user.cnf
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.
-----
Country Name (2 letter code) [RU]: RU
State or Province Name (full name) [Moscow]: Moscow
Locality Name (eg, city) [Moscow]: Moscow
Organization Name (eg, company) [I.Ivanov]: I.Ivanov
Organizational Unit Name (eg, section) []: MIIGAiK Student
Common Name (eg, YOUR name) []: static.ivanov.local
Email Address []: i.ivanov@ivanov.local
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
3.2 Подпись конечного сертификата с использованием SubCA
Подпишите CSR конечного пользователя с использованием SubCA и его конфигурации:
openssl ca -config openssl_subca.cnf -in user_csr.pem -out user_cert.pem -days 365 -batch
Шаг 4: Проверка цепочки доверия
Для проверки цепочки доверия:
openssl verify -CAfile rootCA/certs/root_ca_cert.pem -untrusted subCA/certs/subca_cert.pem user_cert.pem
Теперь у нас есть Root CA, SubCA и конечный SSL-сертификат, объединенные цепочкой доверия с использованием конфигурационных файлов OpenSSL.