Шаблон для выполнения работы

Для выполнения работы создайте новый файла в 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, обеспечивает три основных аспекта безопасности:

  1. Конфиденциальность — данные шифруются, чтобы предотвратить доступ третьих лиц;
  2. Аутентификация — подтверждение подлинности участвующих сторон;
  3. Целостность данных — проверка, что данные не были изменены во время передачи.

Эти элементы создают безопасный канал, позволяющий пользователям доверять серверам и защищать свою информацию. OpenSSL — библиотека с открытым исходным кодом, которая поддерживает протоколы TLS/SSL, а также предлагает инструменты для работы с цифровыми сертификатами и ключами, используемыми для безопасной передачи данных.

1. Основы работы TLS/SSL

Цель и задачи TLS/SSL

TLS/SSL разработан для обеспечения защиты данных на уровне приложений и сетевых протоколов. Защита достигается за счет выполнения следующих задач:

  • Аутентификация сторон — подтверждение подлинности сервера и, по возможности, клиента, используя цифровые сертификаты.
  • Конфиденциальность данных — защита информации от перехвата с помощью шифрования данных.
  • Целостность данных — предотвращение изменений данных во время передачи, используя алгоритмы контроля целостности.

Фазы TLS/SSL соединения

ssl-tls-handshake

Для установки защищенного соединения TLS/SSL выполняется несколько фаз, известные как TLS/SSL-хэндшейк:

  1. Хэндшейк (TLS/SSL Handshake):

    • Client Hello (Приветствие клиента): клиент отправляет серверу свой поддерживаемый набор криптографических алгоритмов и версию протокола.
    • Server Hello (Ответ сервера): сервер выбирает шифровальный набор и отправляет свой сертификат для аутентификации.
    • Аутентификация сервера: клиент проверяет подлинность сервера, удостоверяясь в его сертификате.
    • Обмен ключами: клиент и сервер устанавливают параметры защищенного канала и создают симметричные ключи для шифрования.
  2. Установка защищенного канала:

    • После хэндшейка обе стороны используют установленные симметричные ключи для шифрования передаваемых данных, так как симметричное шифрование выполняется быстрее и подходит для больших объемов информации.
  3. Завершение сессии:

    • Когда одна из сторон завершает соединение, сессионные ключи уничтожаются, что предотвращает повторное использование ключей в дальнейшем.

Цепочка доверия в TLS/SSL

Основой доверия в TLS/SSL является цифровой сертификат, выданный удостоверяющим центром (CA). CA подтверждает подлинность сертификатов, обеспечивая доверие между клиентом и сервером.

В цепочке доверия участвуют:

  • Центральный CA (Root CA) — главное доверенное лицо, которое выдает сертификаты другим удостоверяющим центрам.
  • Подчиненные CA (Intermediate CA) — получают сертификаты от Root CA и выдают их конечным пользователям.
  • Конечный сертификат — сертификат, который принадлежит конечному пользователю или серверу и подтверждает его подлинность.

ssl-tls-ca-chain

Когда браузер или клиентское приложение получает сертификат сервера, он проверяет его по цепочке доверия, начиная с конечного сертификата и поднимаясь до 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.