title | lang |
---|---|
Лабораторная работа № 8. Технологии защищенных каналов связи |
ru |
Для криптографических операций предлагается использовать кроссплатформенную программу и библиотеку OpenSSL. В лаборатории эта программа размещена на сетевом диске. Для возможности запуска предлагаемых по заданию команд необходимо в открытой консоли указать путь к OpenSSL (путь может измениться, тогда его можно уточнить у лаборанта):
set PATH=Z:\ИСиТ\OpenSSL;%PATH%
Утилита openssl
объединяет очень разные функции. Как правило,
первый аргумент openssl
— команда (слово), затем следуют ключи команды
(параметры с дефиса). Список команд можно получить через openssl help
.
По любой команде можно получить справку так: openssl <команда> -help
.
(@) Получите один псевдослучайный килобайт для использования в качестве ключа:
```
openssl rand -out symmetric.key 1024
```
(@) Зашифруйте файл с сообщением при помощи шифратора AES-256-CBC с полученным ключом:
```
openssl enc -e -kfile symmetric.key -in message.txt -out message.enc -aes-256-cbc
```
Здесь -e
означает шифрование (команда enc
используется и для расшифровки
с ключом -d
).
(@) Расшифруйте файл обратно:
```
openssl enc -d -kfile symmetric.key -in message.enc -out message.dec -aes-256-cbc
```
Проверьте, что оригинал открытого текста совпадает с восстановленным:
```
comp message.txt message.dec
```
(ОС семейтсва \*nix используют для той же цели программу `cmp`.)
(@) Создайте закрытый (приватный) ключ размером 2048 бит для алгоритма RSA:
```
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out alice.pri
```
Команда генерирует только закрытый ключ, потому что открытый можно восстановить из закрытого (это остаток от его деления на известное простое число). Закрытый ключ используется для расшифровки и нанесения электронной подписи, поэтому его необходимо держать в тайне.
(@) Получите открытый ключ из закрытого:
```
openssl pkey -in alice.pri -out alice.pub -pubout
```
Открытый ключ используется для шифрования и проверки электронной подписи, поэтому может свободно распространяться. Например, можно опубликовать открытый ключ на своем сайте, чтобы любой мог написать зашифрованное письмо, которое прочтет только владелец, и проверить, что ответ тоже написан им.
(@) Создайте еще две ключевые пары Боба и Чарли:
bob.pri
с bob.pub
и charlie.pri
с charlie.pub
соответственно.
(@) Зашифруйте сообщение открытым ключом Алисы:
```
openssl rsautl -encrypt -pubin -inkey alice.pub -in message.txt -out message.rsa.enc
```
(@) Расшифруйте сообщение закрытым ключом Алисы:
```
openssl rsautl -decrypt -inkey alice.pri -in message.rsa.enc -out message.rsa.dec
```
Проверьте, что восстановленный открытый текст соответствует оригиналу.
(@) Убедитесь, что расшифровать сообщение закрытым ключом Боба нельзя.
(@) Сформируйте ЭЦП сообщения, то есть его хэш, зашифрованный закрытым ключом.
```
openssl dgst -sha256 -sign alice.pri -out message.txt.sig message.txt
```
(@) Выполните проверку ЭЦП, то есть расшифровку хэша якобы сообщения открытым ключом и его сличение и хэшем сообщения.
```
openssl dgst -sha256 -verify alice.pub -signature message.txt.sig message.txt
```
(@) Убедитесь, что если подпись формировать закрытым ключом Боба, проверка открытым ключом Алисы покажет отрицательный результат.
(@) Создайте запрос на подпись сертификата (certificate sign request, CSR) для Чарли:
```
openssl req -new -key charlie.pri -out charlie.csr
```
Сведения о владельце заполните произвольно, кроме `Common Name`,
для которого используйте свое имя *латиницей.* Последующие поля
оставьте пустыми.
Пример:
* Country: RU
* State/province: N/A
* Locality: Moscow
* Organization: MPEI
* Organizational Unit: Control and Automation
* Common Name: Alice
(@) Удовлетворите запрос Чарли, использовав для подписи его же закрытый ключ, то есть создайте для Чарли самоподписанный сертификат:
```
openssl x509 -req -signkey charlie.pri -in charlie.csr -out charlie.crt -days 365
```
(@) Просмотрите сертификат Чарли:
```
openssl x509 -in charlie.crt -text -noout
```
(@) Создайте запрос на подпись сертификата Алисы.
(@) Подпишите сертификат Алисы ключом Чарли:
```
openssl x509 -req -days 365 \
-CAkey charlie.pri -CA charlie.crt -CAserial charlie.srl -CAcreateserial \
-in alice.csr -out alice.crt
```
Здесь обратные косые черты использованы как символ переноса строк,
в Windows следует вести одно длинную строку, убрав `\`, либо заменить
эти символы на `^`.
(@) Просмотрите сертификат Алисы.
(@) Проверьте подлинность сертификата Алисы:
```
openssl verify -verbose -issuer_checks -CAfile charlie.crt alice.crt
```
(@) Аналогичным образом создайте сертификат Боба, заверенный Чарли.
Используются внешние серверы, доступ к которым следует получить у лаборантов.
Очень просто организовать SOCKS-прокси, имя доступ на удаленный сервер по SSH.
При этом прокси-сервер запускается на клиентской машине (где запущена ssh
или PuTTY), и программы на ней могут подключиться к указанному порту
по адресу 127.0.0.1
.
Из консоли прокси-сервер запускается ключом -D
с указанием порта:
```
ssh -D 8888 <прочие параметры>
```
При использовании PuTTY необходимо в разделе настроек
Connection → SSH → Tunnels в поле Source port ввести локальный порт,
к которому должны будут подключаться клиенты, ниже выбрать переключатели
Dynamic и IPv4, после чего нажать Add, чтобы в список туннелей
оказалась добавлена такая строка: 4D8888
, что очевидно.
Для работы прокси необходимо оставить подключенный терминал открытым.
В распространенных ОС имеются системные настройки прокси, откуда их может получить любая программа. Также большая часть ПО, способного работать через прокси, позволяет указать адрес прокси в своих настройках (крупным исключением является Google Chrome и другие браузеры этого семейства).
(@) Организуйте локальный SOCKS5-прокси с выделенным вам сервером.
(@) Настройте бразуер использовать запущенный прокси и убедитесь, что он действительно применяется, то есть запросы к сайтам делаются с адреса сервера. Для этого посетите любой сайт, отображающий адрес IP клиента, с прокси и без него.
(boss fight)
Напомним, что виртуальная частная сеть (virtual private network, VPN) представляет собой систему туннелей и действует на сетевом уровне.
(@) Настроить сервер OpenVPN и подключиться к нему клиентом, взяв за основу инструкцию.
Для этого можно использовать два внешних сервера, если в лаборатории невозможно установить OpenVPN. Сервер и клиент должны использовать созданные в этой ЛР ранее ключи и сертификаты.
-
Параметры для протокола Диффи-Хеллмана (
dh2048.pem
) можно сгенерировать следующим образом:openssl dhparam -out dh2048.pem dh2048
-
Шаблон конфигурации сервера OpenVPN:
openvpn-server.conf
-
Шаблон конфигурации клиента сервеOpenVPN:
openvpn-client.conf