- UNIXHOME.ORG.UA
- Security → Шифрование файлов в Linux с помощью OpenSSL
- Немного об OpenSSL
- Практика
- OpenSSL
- Материал из Xgu.ru
- Содержание
- Вопросы и ответы
- Введение
- Как определить какую версию OpenSSL я использую?
- Как получить список доступных команд?
- Как посмотреть список доступных шифров?
- Измерение производительности
- Как измерить производительность системы с помощью openssl?
- Как измерить производительность сетевого соединения?
- Сертификаты
- Как сгенерировать самоподписной сертификат?
- Как сгенерировать запрос сертификата у VeriSign?
- Как проверить новый сертификат?
- Как получить удалённый сертификат?
- Как извлечь какую-либо информацию из сертификата?
- Как экспортировать или импортировать сертификат PKCS#12?
- Проверка сертификата
- Как проверить сертификат?
- Какие центры сертификации распознаёт OpenSSL?
- Как мне заставить OpenSSL признавать сертификат?
- Клиенты и серверы для командной строки
- Как подключиться к безопасному SMTP-серверу?
- Как подключиться к [какому-либо] безопасному серверу?
- Как запустить SSL-сервер из командной строки?
- Дайджесты
- Как создавать дайджесты MD5 или SHA1?
- Как подписать дайджест?
- Как проверить подписанный дайджест?
- Как создать запись типа digest для файла паролей Apache?
- Какие ещё есть дайджесты?
- Шифрование/расшифровка
- Как закодировать что-то по методу base64?
- Как зашифровать файл?
- Ошибки
- Как интерпретировать сообщения об ошибках SSL?
- Ключи
- Как сгенерировать ключ RSA?
- Как сгенерировать открытый ключ RSA?
- Как сгенерировать ключ DSA?
- Как создать ключ, основанный на эллиптических кривых (elliptic curve key)?
- Как создать открытый EC ключ?
- Как удалить парольную фразу у ключа?
- Хэши для паролей
- Как сгенерировать хэш в стиле crypt?
- Как сгенерировать хэш пароля в стиле shadow?
- Простые числа
- Как проверить, является ли число простым?
- Как сгенерировать набор простых чисел?
- Случайные данные
- Как генерировать случайные данные?
- S/MIME
- Как проверить подписанное сообщение S/MIME?
- Как зашифровать сообщение S/MIME?
- Как подписать сообщение S/MIME?
UNIXHOME.ORG.UA
Security → Шифрование файлов в Linux с помощью OpenSSL
Немного об OpenSSL
Последнее время я активно интересуюсь темой шифрования файлов и криптологией в целом, тема интересная, захватывающая, но от части сложная, так как сопряжена с математикой и программированием. Так что такое OpenSSL? OpenSSL — это криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA и сертификаты X.509, подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений. (по версии Wikipedia).
Давайте сразу проясним для себя некоторые части этого определения. TLS – это так называемый «транспорт» или от английского — Transport Layer Security — криптографический протокол, обеспечивающий защищённую передачу данных между узлами в сети Интернет. SSL от английского Secure Sockets Layer — уровень защищённых сокетов — криптографический протокол, который обеспечивает установление безопасного соединения между клиентом и сервером, именно так нам объясняет Wikipedia понятия TLS & SSL и это верно.
Алгоритмы шифрования поддерживаемые пакетом OpenSSL:
Blowfish, Camellia ,DES, RC2, RC4, RC5, IDEA, AES, ГОСТ 28147-89, RSA, DSA, Diffie-Hellman key exchange, ГОСТ Р 34.10-2001, к слову я их тут в кучу налепил, а вообще они делятся на симметричные и асимметричные, если вы хотите узнать об этом больше, то читайте Wikipedia и по возрастающей.
Применение OpenSSL:
- Создание RSA, DH и DSA ключей
- Создание сертификатов X.509, CSR и CRL
- Шифрование и дешифрование с помощью алгоритмов
- SSL/TLS клиент и сервер тесты
- Обработка, дешифровка и шифровка электронной почты
Практика
Нас будет интересовать пункт, шифрование и дешифрование файлов с помощью различных алгоритмов. Предположим у вас есть файл с именем file который требуется зашифровать.
После ввода команды, она запросит у вас пароль.
Ключи:
enc – говорит утилите, что шифруем с помощью алгоритма (AES256)
-e – указывает шифровать
-in – входящий файл
-out – выходящий, зашифрованный файл
Этот метод может быть не надежным, с точки зрения видимости пароля на экране, если у вас стоят за спиной, пароль им будет известен.
Для дешифрования полученного файла ile.encoded:
В данном простом примере, мы шифровали одиночный файл, он может быть текстовый, бинарный, какой угодно. Используя архиваторы, мы можем шифровать директории, т.е. натравить архиватор на директорию, завернуть ее, и через конвеер скормить архив утилите openssl, которая его зашифрует:
И в обратном порядке, для расшифровки:
Однако можно поступить и по другому, в Linux файлом может быть контейнер, именно так мы шифровали с помощью GnuPG и Truecrypt, тут все просто. Действуем так, создаем контейнер размером 1Гб, делаем для него файловую систему Ext4, монтируем в систему, записываем файлы, отмонтируем и шифруем его. Поехали:
Создаем контейнер размером 1Gb:
Получаем файл secret размером 1G
Ключи:
— bs (block size) – размер блока
-count — количество блоков (тут можно использовать шаблоны для простоты)
Создаем для него файловую систему:
Монтируем контейнер в систему:
Теперь переместите внутрь файлы которые вы хотите зашифровать и отмонтируйте контейнер:
И теперь шифруем его как файл:
Такой метод мне больше по душе, я не могу утверждать, что он более правильный или менее правильный, но тот, что такие программы как Truecrypt работают по аналогичному механизму показывает, что метод вполне приемлемый и главное надежный.
Недостаток шифрования контейнера с помощью OpenSSL только один, готовый зашифрованный файл выходит точно такого же размера, как и начальный контейнер. Вот для примера:
Тогда как, если я зашифрую этот же контейнер с помощью GnuPG получим следующее:
Как видите из полученного примера, GnuPG обеспечил нам сжатие, и контейнер размером 1G теперь может уместиться на Floppy дискете, при этом когда вы расшифруете контейнер и примонтируете, он будет размером ровно 1G. А OpenSSL сжал наш контейнер с 1G до 1,1G, что не очень удобно, так как «таскать» столь тяжелый файл накладно.
Источник
OpenSSL
Материал из Xgu.ru
OpenSSL — универсальный криптографический инструмент, построенный вокруг протоколов SSL/TLS и сертификатов X.509.
Помимо того, что этот инструмент позволяет работать с соединениями SSL/TLS, сертификатами X.509, он может делать множество других полезных вещей: шифровать и расшифровывать файлы, создавать и проверять цифровые подписи, проверять числа на простоту, тестировать производительность компьютера и другое.
Содержание
Вопросы и ответы
Введение
Как определить какую версию OpenSSL я использую?
Использовать опцию version:
Расширенная информация с опцией -a:
Как получить список доступных команд?
Вызвать с неправильным ключом (например, help или -h).
Аналогично с подкомандами:
Как посмотреть список доступных шифров?
Использовать команду ciphers:
Измерение производительности
Как измерить производительность системы с помощью openssl?
Пример для 2.16GHz Intel Core 2.
Каждый тест можно вызывать отдельно:
Как измерить производительность сетевого соединения?
Помимо этого простейшего измерения у подкоманды s_time есть множество других возможностей:
Сэмулировать web-сервер с помощью openssl s_server:
Сертификаты
Как сгенерировать самоподписной сертификат?
Создать файл mycert.pem, в котором будет и секретный ключ и открытый сертификат, основанный на нём. Сертификат будет действителен в течение 365 дней; ключ (благодаря опции -nodes) будет нешифрованным.
После вызова команды надо будет ответить на несколько вопросов: Country Name, State, City и так далее. На вопрос “Common Name” нужно отвечать именем сервера, по которому будут обращаться люди.
Можно автоматизировать ввод ответов с помощью опции -subj.
Как сгенерировать запрос сертификата у VeriSign?
Секретный ключ в файле mykey.pem и запрос на сертификат myreq.pem:
Если ключ уже есть, и его надо использовать только для генерации сертификата, используется команда попроще:
Или, с информацией для сертификата прямо в командной строке:
Не допускайте ошибок в названиях! Каждый символ важен.
Файл с ключом нужно сохранить в надёжном месте.
Как проверить новый сертификат?
Подкоманда s_server предоставляет простой, но эффективный метод тестирования. В примерах ниже предполагается, что ключ и сертификат хранятся в файле mycert.pem.
Запустите тестовый сервер на машине, на которой будет использоваться сертификат. По умолчанию, открывается порт 4433; другой порт можно задать опцией -accept.
Если команда запустилась без ошибок, открывайте в браузере страницу: https://127.0.0.1:4433/
Как получить удалённый сертификат?
С помощью openssl и sed:
Можно вернуть данные openssl, например, для того чтобы выяснить, для каких дат он действителен:
Как извлечь какую-либо информацию из сертификата?
В SSL-сертификате есть много информации, в частности:
- кто выдал сертификат (issuer);
- насколько долго он действителен (valid dates);
- получатель сертификата (subject);
- разнообразная криптографическая информация.
Опция текст даёт весь объём информации:
Другие опции дают другую информацию:
Извлечение открытого ключа, который требуется для проверки цифровой подписи (дайджеста):
Как экспортировать или импортировать сертификат PKCS#12?
Файлы PKCS#12 используются в разных приложениях типа MS IIS. Они часто имеют расширение .pfx.
Превратить pfx в pem:
Проверка сертификата
Приложения, слинкованные с библиотеками OpenSSL, могут проверять подлинность сертификатов, выданных сервером сертификатов (certificate authority, CA).
Как проверить сертификат?
Использовать подкоманду verify:
Если в сертификате всё в норме, то будет выдано сообщение OK:
Если чего-то не хватает, появятся соответствующие сообщения об ошибках, например:
- error 10 at 0 depth lookup:certificate has expired. Время действия сертификата истекло.
- error 18 at 0 depth lookup:self signed certificate. Если не указать явным образом, openssl не будет проверять самоподписные сертификаты (self-signed certificate).
Какие центры сертификации распознаёт OpenSSL?
При сборке OpenSSL в нём настраивается местоположение OpenSSL-файлов (Directory for OpenSSL files). Этот параметр задаётся опцией —openssldir, передающейся конфигурационному скрипту. В этом каталоге, как правило, хранится информация о центрах сертификации, которым доверяет система.
По умолчанию, этот каталог находится в /usr/local/ssl, но большинство сборщиков размещает его в других местах, таких как /etc/pki/tls (Red Hat/Fedora), /etc/ssl (Gentoo), /usr/lib/ssl (Debian) или /System/Library/OpenSSL (Macintosh OS X).
Посмотреть, какой именно каталог используется в конкретной инсталляции, можно с помощью опции version(параметр OPENSSLDIR):
Внутри данного каталога есть подкаталог certs/, в котором находятся файлы трёх разных типов:
- Большой файл под названием cert.pem, объёмистый сборник многих сертификатов от признанных общеизвестных центров сертификации, таких как VeriSign и Thawte.
- Множество маленьких файлов с расширением .pem, каждый из которых содержит сертификат от отдельного центра сертификации;
- Символические ссылки в со странными именами вида 052eae11.0. Как правило, для каждого .pem-файла есть такая ссылка.
Первая часть странного имени ссылки — это, на самом деле, хэш, основанный на сертификате внутри .pem-файла, на который эта ссылка указывает. Расширение файла это итератор (то есть, номер), поскольку теоретически возможно, что разные сертификаты укажут на одинаковый хэш.
Например, ссылка f73e89fd.0 указывает на файл vsignss.pem. Значит, сертификат соответствует хэшу, который равен имени ссылки:
Когда приложение получает удалённый сертификат, оно сначала проверяет, есть ли этот сертификат в cert.pem и, если нет, смотрит в файле, соответствующем хэшу сертификата. Если такой файл найден, сертификат считается верным.
Нужно иметь в виду, что некоторые приложения, такие как Sendmail, например, позволяют во время исполнения указывать местоположение сертификатов, а некоторые, например Pine, нет.
Как мне заставить OpenSSL признавать сертификат?
Сертификат, которому нужно доверять, должен быть размещён в каталоге certs/. После этого необходимо создать хэшированную символическую ссылку на него. Вот небольшой скрипт, который делает это:
Клиенты и серверы для командной строки
Подкоманды s_client и s_server предоставляют возможность для запуска SSL-клиентов для командной строки.
Как подключиться к безопасному SMTP-серверу?
С помощью подкоманды s_client можно проверить или даже использовать SMTP-сервер с поддержкой SSL.
Безопасные SMTP-серверы могут предлагать безопасные соединения на портах: 25 (TLS), 465 (SSL) и 587 (TLS). Где-то в районе релиза 0.9.7 у openssl появилась возможность использовать STARTTLS в ходе общения с SMTP-серверами.
Чтобы использовать для обозначения конца строки именно CRLF, а не CR или LF, используется опция -crlf. Это важно особенно для Qmail.
Как подключиться к [какому-либо] безопасному серверу?
На момент написания openssl поддерживал TLS из командной строки только с SMTP, поэтому для других протоколов нужно использовать прямые SSL-соединения.
Как запустить SSL-сервер из командной строки?
Подкоманда s_server позволяет запустить сервер с поддержкой SSL прямо из командной строки; сервер предназначен только для проверки и отладки. Для полноценной работы рекомендуется использовать stunnel.
Подкоманда s_server работает намного лучше, если есть сертификат; когда его нет, её возможности сильно сокращаются.
Дайджесты
Создание дайджестов (криптографических контрольных сумм) с помощью подкоманды dgst — одна из наиболее распространённых задач, выполняемых с помощью openssl.
Как создавать дайджесты MD5 или SHA1?
Дайджесты создаются с помощью подкоманды dgst:
Дайджест MD5 эквивалентен дайджесту, создаваемому известной утилитой md5sum, хотя выводится в другом формате:
То же верно и для дайджестов SHA1 и программы sha1sum:
Как подписать дайджест?
Для того, чтобы быть уверенным, что дайджест никто не изменял, его можно подписать с помощью своего закрытого ключа.
Подписать дайджест SHA1 для файла foo-1.23.tar.gz:
Как проверить подписанный дайджест?
Для того чтобы проверить правильность дайджеста, нужен файл, на основе которого был получен дайджест, сам подписанный дайджест и открытый ключ того, кто подписывал дайджест:
Как создать запись типа digest для файла паролей Apache?
У web-сервера Apache есть специальный формат файла с паролями, использующийся для выполнения digest-аутентификации. В комплект с web-сервером входит утилита htdigest, но она умеет записывать данные только в файл, а не на стандартный поток вывода. При работе с удалёнными пользователями может быть целесообразным им сначала сгенерировать хэш, а потом переправить его по почте или другому каналу информации для включения в базу.
Формат базы паролей прост: список нескольких полей, разделённых двоеточиями. Поля:
- имя пользователя (username);
- область авторизации (authorization realm; AuthRealm);
- MD5-суммы для этих полей и пароля.
Скрипт, представленный ниже, повторяет действие htdigest с той разницей, что выводит данные на стандартный поток вывода. Кроме того, он умеет считывать данные со стандартного потока ввода.
Какие ещё есть дайджесты?
Подкоманда list-message-digest-commands даёт список типов дайджестов, доступных в данной инсталляции.
Шифрование/расшифровка
Как закодировать что-то по методу base64?
Использовать опцию -base64.
Закодировать одну строку:
Без перевода строки (важно для паролей):
Опция -d выполняет обратный процесс (то есть, раскодирование):
Как зашифровать файл?
Простое шифрование файлов, вероятно, лучше делать инструментами типа GPG. Тем не менее, иногда может возникнуть необходимость зашифровать файл без развёртывания инфраструктуры ключей и сертификатов, а пользуясь одним только паролем. Второе, что нужно будет запомнить — это шифр, с помощью которого выполнялось шифрование.
Список поддерживаемых шифров есть на странице enc(1). Более просто (и более точно) узнать этот список у самой программы openssl.
Кроме выбора шифра нужно также решить, будут ли данные закодированы в base64. Если будут, то их можно будет, грубо говоря, вставить в почтовое сообщение, прямо в текст. В противном случае это будет простой бинарный файл.
Расшифровка файла на стороне получателя:
Можно не вводить парольную фразу постоянно при шифровании и расшифровке, а передавать её автоматически (подробнее: openssl(1); раздел «PASS PHRASE ARGUMENTS»). Формат аргумента прост:
Ошибки
Как интерпретировать сообщения об ошибках SSL?
В системных журналах обнаружились строки, которые, похоже, имеют отношение к OpenSSL или crypto:
В первом приближении определить, что не так, можно с помощью подкоманды errstr, которая умеет интерпретировать код ошибки. Код ошибки находится между «error:» и «:lib». В данном случае это 0407006A.
Дальше информацию надо искать в документации. В данном случае в man-странице RSA_padding_add_PKCS1_type_1(3) будет написано, что PKCS #1 использует для подписей блочные методы.
Ключи
Как сгенерировать ключ RSA?
Использовать подкоманду genrsa:
Как сгенерировать открытый ключ RSA?
С помощью подкоманды rsa можно создать открытую версию для закрытого ключа RSA:
Как сгенерировать ключ DSA?
Для построения ключей DSA нужен специальный файл параметров (parameter file), кроме того, операции с DSA медленнее чем аналогичные операции с RSA, в связи с этим, DSA используется не так часто, как RSA.
Если нужно сгенерировать только один ключ DSA, то это можно сделать одной командой, с помощью подкоманды dsaparam:
Если же нужно создавать несколько ключей DSA, перед тем как их генерировать, можно сделать общий файл параметров. Файл параметров генерируется сравнительно медленно, а файлы ключей очень быстро.
Как создать ключ, основанный на эллиптических кривых (elliptic curve key)?
Процедуры для работы с эллиптическими кривыми были добавлены в openssl, начиная с версии 0.9.8. Работа с этими процедурами выполняется через подкоманду ecparam.
Как создать открытый EC ключ?
С помощью подкоманды ec можно создать открытую версию для закрытого ключа EC (elliptic curve):
Как удалить парольную фразу у ключа?
Каждый раз, когда запускается демон, использующий ключ, надо будет набирать парольную фразу. Её можно убрать.
Допустим, ключ, зашифрованный парольной фразой, находится в файле key.pem; после выполнения команды расшифрованный ключ будет в newkey.pem:
Если закрытый ключ (private key) и открытый сертификат хранятся в одном файле, нужно будет выполнить две команды:
Хэши для паролей
С помощью подкоманды passwd можно генерировать хэши паролей, которые совместимы со стандартными хэшами из /etc/passwd, /etc/shadow или файла паролей Apache.
Как сгенерировать хэш в стиле crypt?
Сгенерировать хэш очень просто:
Если salt для пароля известен, можно воссоздать хэш.
Как сгенерировать хэш пароля в стиле shadow?
В новых UNIX/Linux-системах вместо старого crypt-хэша используется новый, более стойкий хэш MD5. Его генерирование выполняется с помощью ключа -1:
В этом формате salt состоит из 8 символов; он находится между вторым и третьим знаком $, в данном случае это sXiKzkus.
Простые числа
Поскольку openssl активно использует механизмы для работы с простыми числами, не удивительно, что в нём есть соответствующие процедуры. Начиная с версии 0.9.7e (или где-то так), в openssl появилась подкоманда binary.
Как проверить, является ли число простым?
Передать число как аргумент к подкоманде prime. Результат будет не в десятичном, а в шестнадцатеричном виде.
Можно проверять и шестнадцатеричные числа:
Как сгенерировать набор простых чисел?
Сгенерировать множество чисел и оставить только простые среди них. Для генерирования последовательностей удобно использовать seq.
Случайные данные
Как генерировать случайные данные?
Используйте подкоманду rand.
На UNIX/Linux-системах, в которых есть файл /dev/urandom, похожего эффекта можно добиться иначе, и иногда с лучшим результатом даже:
Между устройствами random и urandom есть разница. Дополнительная информация в random(4) для Linux и BSD или random(7D) для Solaris.
S/MIME
S/MIME — стандарт для получения и отправки безопасных MIME-данных, в особенности, почтовых сообщений. Большинство почтовых клиентов умеет работать с такими сообщениями сами, но для этого же можно использовать и openssl smime.
Много хороших примеров есть в smime(1).
Как проверить подписанное сообщение S/MIME?
Проверить, сохранённое в файле msg.txt подписанное сообщение:
Если сертификат отправителя подписан сервером сертификатов, которому доверяет инсталляция OpenSSL, будут показаны заголовки сообщения, копия сообщения и заключительная строка «Verification successful».
Если сообщение было изменено, в выводе будет содержаться сообщение о том, что подпись или дайджест (контрольная сумма) не соответствуют действительности:
Если сертификат не опознан, возникнет похожая ошибка:
Большинство почтовых клиентов отправляют копию открытого сертификата прикреплёнными к сообщению. Данные сертификата можно посмотреть из командной строки. Используется хитрая комбинация подкоманд smime -pk7out и pkcs7. Немного странно на первый взгляд, но работает!
Если нужно вытащить сертификат автора письма, для того, чтобы использовать его в дальнейшем, то нужна только первая часть команды:
Дальше этот сертификат можно или интегрировать в инфраструктуру OpenSSL, или сохранить его для будущего использования, например, такого:
Как зашифровать сообщение S/MIME?
Допустим, кто-то прислал вам свой сертификат, которым попросил шифровать сообщения ему. Сертификат сохранён в her-cert.pem. Ответ сохранен в файле my-message.txt.
Для того чтобы получить шифрование по умолчанию RC2-40 (оно, правда, слабое), нужно только сказать ‘openssl, где находится сертификат:
Если есть уверенность, что на удалённой стороне есть современная поддержка SSL, можно использовать алгоритм шифрования посильнее чем DES:
По умолчанию, зашифрованные сообщения, включая почтовые заголовки, отправляются на стандартный поток вывода. С помощью опции -out их можно отправить в файл. Если постараться, то передать сообщение можно и сразу программе sendmail.
Как подписать сообщение S/MIME?
Подписать (но не шифровать) сообщение своим собственным сертификатом, так чтобы получатель имел возможность убедиться, кто является истинным автором.
Источник