Для криптографических операций предлагается использовать кроссплатформенную программу и библиотеку 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
, для которого используйте свое имя латиницей. Последующие поля оставьте пустыми.
Пример:
Удовлетворите запрос Чарли, использовав для подписи его же закрытый ключ, то есть создайте для Чарли самоподписанный сертификат:
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. Сервер и клиент должны использовать созданные в этой ЛР ранее ключи и сертификаты.
Параметры для протокола Диффи-Хеллмана (dh2048.pem
) можно сгенерировать следующим образом:
openssl dhparam -out dh2048.pem dh2048
Шаблон конфигурации сервера OpenVPN: openvpn-server.conf
Шаблон конфигурации клиента сервеOpenVPN: openvpn-client.conf
Козлюк Д. А. для кафедры Управления и информатики НИУ «МЭИ», 2018 г.