Создание ключей и сертификатов в OpenSSL.

Автор: Пользователь скрыл имя, 16 Января 2012 в 13:38, реферат

Краткое описание

Создает секретный ключ в формате PEM. bits - длина ключа. шифрует его одним из алгоритмов: des (56 бит), des3 (3-й des 168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для сектетного ключа сервера).

Файлы: 1 файл

Создание ключей и сертификатов в OpenSSL.docx

— 45.64 Кб (Скачать)

Создание  ключей и сертификатов в OpenSSL.

Генерация ключа:

openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits]

Создает секретный ключ в формате PEM. bits - длина ключа. шифрует его одним из алгоритмов: des (56 бит), des3 (3-й des 168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для сектетного ключа сервера). Опция -out говорит программе, что вывод нужно осуществлять не в stdout, а в файл file (опция -out присутствует во множестве других компонентов openssl и используется аналогичным образом для указания выходного файла). Опция -rand указывает на файл[ы] (разделенные «:»), из которых будут считываться данные для установки seed (зерна) генератора случайных чисел. 

Создание  публичного ключа  на основе секретного:

openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout]

Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного ключа, будучи вызвана с параметром -in и -out. Если применить параметр -pubout, то в указанный файл -out будет записан публичный ключ, вычисленный на основе -in секретного.

Пример:

openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/pubkey.pem -pubout 

Создание self-signed сертификата:

openssl req -new -x509 -key CAkey.pem -out CAcert.pem -days 365 
 
 
 

Основы  работы с OpenSSL.

OpenSSL — это система защиты и сертификации данных, название SSL переводится, как система безопасных сокетов (secure socket layer). OpenSSL используется практически всеми сетевыми серверами для защиты передаваемой информацией.  

OpenSSL — это система защиты и сертификации данных, название SSL переводится, как система безопасных сокетов (secure socket layer). OpenSSL используется практически всеми сетевыми серверами для защиты передаваемой информацией. Существует программное API SSL (SSLEAY), позволяющее создавать безопасные сокеты с шифрацией передаваемых данных в собственных разработках. Но в данной статье я бы хотел рассказать о самой системе OpenSSL, вызываемой через командную строку. 

Т.к. OpenSSL поддерживает очень много различных стандартов сертификации, шифрования, хеширования, то использование данной команды достаточно сложно. Внутри OpenSSL существуют отдельные компоненты, отвечающие за то или иное действие, для получения списка доступных компонентов можно вызвать openssl с параметрами list-standart-commands. Можно также получить список доступных алгоритмов хеширования (list-message-digest-commands) и алгоритмов шифрования (list-cipher-commands). 

OpenSSL может использоваться во множестве случаев и умеет выполнять следующие задачи:

  • создавать и управлять ключами RSA и DSA — команды rsa, dsa, dsaparam;
  • создавать сертификаты формата x509, запросы на сертификацию, восстановление — команды x509, req, verify, ca, crl, pks12, pks7;
  • зашифровывать данные с помощью симметрического или асимметрического шифрования — команды enc, rsautl;
  • высчитывать хеши различных типов — команда dgst;
  • работать с S/MIME — команда s/mime;
  • проверять работу серверов и клиентов ssl — команды s_client, s_server.
 

Cуществует также несколько вспомогательных утилит ssl:

  • openssl speed [список_алгоритмов_хеширования_или шифрования]: тестирование скорости различных алгоритмов, если запускать без параметров, то тестируются все алгоритмы; алгоритмы внутри списка разделяются пробелом, например: openssl speed md5 rsa idea blowfish des 3des sha1. В конце работы выводится общая скорость работы различных алгоритмов (в 1000-х байт в секунду), для обработки различной длины блоков. Вот результат работы тестов скорости на моем домашнем компьютере (Celeron 366), на других машинах значения будут другими:

Алгоритм           8 байт       64 байта     256 байт     1024 байта   8192 байт

md2                291.38k      817.15k     1109.67k     1218.56k     1256.11k

mdc2               868.57k      911.02k      914.01k      915.11k      917.50k

md4               4417.91k    24808.28k    51404.97k    70189.40k    78168.06k

md5               3905.61k    21142.91k    41515.69k    55489.54k    59091.63k

hmac(md5)         1536.42k    10381.81k    27585.13k    46119.35k    57671.68k

sha1              2458.59k    11965.97k    21560.58k    26889.22k    29143.66k

rmd160            2032.99k     9523.48k    16568.15k    20547.81k    22220.11k

rc4              28775.08k    39239.02k    41210.52k    41862.98k    41454.25k

des cbc           7586.90k     8411.44k     8580.28k     8627.29k     8612.52k

des ede3          2866.13k     3031.96k     3050.92k     3074.74k     3058.35k

idea cbc          4948.09k     5743.19k     5760.09k     5744.67k     5723.48k

rc2 cbc           2982.04k     3220.39k     3256.32k     3263.49k     3268.61k

rc5-32/12 cbc    19108.39k    24151.19k    24906.75k    25154.90k    25212.25k

blowfish cbc     11018.91k    12881.27k    12925.01k    12972.37k    13047.13k

cast cbc         10943.48k    12674.30k    12877.74k    12994.56k    13011.63k 

Проверка алгоритмов асимметрического шифрования:

           Подписывание Проверка    За секунду подп. За секунду пров.

rsa  512 bits   0.0036s   0.0003s    281.4           3221.7

rsa 1024 bits   0.0184s   0.0009s     54.3           1072.9

rsa 2048 bits   0.1105s   0.0032s      9.0            315.6

rsa 4096 bits   0.7414s   0.0112s      1.3             89.4 

dsa  512 bits   0.0032s   0.0038s    311.3           261.3

dsa 1024 bits   0.0093s   0.0116s    107.5            86.4

dsa 2048 bits   0.0309s   0.0377s     32.4            26.5

  • openssl rand [-out file] [-rand file] num: генерация num рандомных байт, можно использовать для проверки рандомизационной последовательности rand:

# openssl rand -rand .rnd 5

Wеб~

# 

  • openssl ciphers [-ssl2] [-ssl3] [-tls1] NAME: вывод доступных алгоритмов для обеспечения уровня безопасности NAME, где NAME — это символическое название группы алгоритмов. Обычно используются значения:

  LOW — алгоритмы  низкого уровня безопасности (<128 бит);

  MEDIUM — алгоритмы  среднего уровня стойкости (128 бит);

  HIGH — алгоритмы  высокой стойкости (>128 бит);

  ALL — все  алгоритмы;

  NULL — алгоритмы  без шифрования. 

Обычно в настоящее  время используются алгоритмы групп MEDIUM и HIGH, которые еще долго не смогут быть взломаны прямым перебором. Можно также вывести список алгоритмов из нескольких групп, разделив их «:» (например, MEDIUM:HIGH). 

Теперь я бы хотел рассказать об основных утилитах openssl. Для начала о методах генерации ключей, затем о командах шифрования, и, наконец, о сертификатах, s/mime. Итак, пару слов о генерации ключей. Для создания rsa-ключей используется команда genrsa:

openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits] 

Команда genrsa создает секретный ключ длиной bits в формате PEM, шифрует его одним из алгоритмов: des (56 бит), des3 (3-й des 168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для сектетного ключа сервера). Опция -out говорит программе, что вывод нужно осуществлять не в stdout, а в файл file (опция -out присутствует во множестве других компонентов openssl и используется аналогичным образом для указания выходного файла). Опция -rand указывает на файл[ы] (разделенные «:»), из которых будут считываться данные для установки seed (зерна) генератора случайных чисел. В качестве таких файлов сразу же приходит на ум использовать что-то вроде /dev/random или /dev/urandom, но у меня с этим возникли проблемы: все вешалось наглухо, поэтому я рекомендую в этом случае использовать какие-нибудь сложно угадываемые файлы, вроде /var/log/messages или /boot/vmlinuz, думаю, что угадать содержимое этих файлов не намного проще, чем содержимое /dev/random, но работает этот фокус в любом *nix (опция -rand также присутствует во всех компонентах генерации и управления ключами и сертификатами). Использовать /dev/random и /dev/urandom, конечно, можно, но я для этого скопировал из /dev/random 32768 байт в файл .rnd таким образом:

dd if=/dev/[u]random of=.rnd count=64 

Кроме этого, можно  указывать в качестве -rand-файла  EGD-сокет, который обеспечивает генерацию определенного количества случайных байт, EGD доступен на узле http://www.lothar.com/tech/crypto/. Установка генератора случайных чисел производится на основании хеша -rand файла, поэтому можно указывать файлы различной длины, т.к. хеш все равно имеет фиксированное число бит. Пример генерации 4096 битового секретного ключа RSA:

# openssl genrsa -out /etc/openssl/key.pem -des3 -rand /var/log/messages 4096

Generating RSA private key

.....++*...++++++++*

Enter PEM passphrase:

Verify PEM passphrase:  

После этого  секретный ключ зашифровывается  и записывается в файл (в текстовом  виде). В начале ключа указывается  алгоритм шифрования. Для создания публичного ключа rsa на основе секретного используется команда openssl rsa. Даная команда имеет следующий формат:

openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout] 

Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного ключа, будучи вызвана с параметром -in и -out. Если применить параметр -pubout, то в указанный файл -out будет записан публичный ключ, вычисленный на основе -in секретного. Например, создание публичного ключа на основании секретного:

openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/pubkey.pem -pubout 

Изменение пароля и алгоритма шифрования секретного ключа с des3 на idea:

openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/key1.pem -idea

Для создания ключей DSA используется утилита openssl gendsa, аналогичная genrsa, но есть два отличия: во-первых, для ключей DSA нельзя прямо указывать длину в битах и, во-вторых, ключи DSA могут генерироваться согласно некоторым параметрам, записанным в файл paramfile утилитой openssl dsaparam. dsaparam имеет следующий формат:

openssl dsaparam [-rand file{s}] [-C] [-genkey] [-out file]  numbits 

где numbits — длина желаемого ключа, -С заставляет dsaparam вывести на stdout код на СИ для программной генерации DSA на основе необходимых параметров, а опция -genkey говорит, что в выходной файл, наряду с параметрами, дополнительно записывается созданный секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо числа бит указывается файл параметров, созданный dsaparam:

# openssl gendsa -out /etc/openssl/dsakey.pem -rand /boot/vmlinuz -idea paramfile

Enter PEM passphrase:

Verify PEM passphrase:

Для управления ключами dsa используется программа openssl dsa, которая абсолютно аналогична (в параметрах) утилите openssl rsa. Поэтому я просто приведу пример генерации публичного ключа DSA:

# openssl dsa -in /etc/openssl/dsakey.pem -out /etc/openssl/pubdsakey.pem -pubout 

Теперь настало  время рассказать о компонентах  openssl, выполняющих шифрование и хеширование данных. Для выполнения симметрического шифрования используется утилита openssl enc -cipher или ее сокращенная запись openssl cipher, где cipher — это одно из символических имен симметрических шифров. Наиболее популярными являются следующие: base-64 (преобразование в текстовый вид), bf (blowfish — 128 бит), des (56 бит), des3 (168 бит), rc4 (128 бит), rc5 (128 бит), rc2 и idea (128 бит). Для указания входного и выходного файлов используется опции -in и -out соответственно. Пароль для шифрования вводится с клавиатуры (можно указать в командной строке параметром -k, но это очень плохо по соображениям безопасности, т.к. большинство шеллов умеют сохранять историю командной строки, IMHO намного лучше ввести пароль непосредственно перед шифрованием, хотя эта опция полезна для скриптов, так что забывать о ней нельзя :). Учтите, что пароль не спрашивается при обработке файла base64, т.к. шифрования не происходит. Для расшифровки зашифрованных данных примените openssl cipher с опцией -d (алгоритм шифрования и дешифрования должен совпадать!), а для одновременной обработки данных base64 можно воспользоваться опцией -a. Шифрование по умолчанию происходит с подмешиванием, т.е. для выбора алгоритма подмешивания используется случайная соль (salt), в этом случае, если вы шифруете один и тот же файл в разное время одним и тем же алгоритмом и паролем, то результаты скорее всего будут разными (это затрудняет атаку по словарю). Также по умолчанию используется cbc-режим алгоритмов, когда ключ меняется в течение всего сеанса работы согласно передаваемым данным, этот прием очень сильно затрудняет брутфорс, т.к. атакующему сложно поймать нужный момент времени. Приведу несколько примеров:

Зашифруем файл, используя алгоритм des3:

# openssl des3 -in file -out file.des3

Расшифруем полученный файл:

# openssl des3 -d -in file.des3 -out file

Зашифруем файл, используя алгоритм blowfish(bf), и закодируем base64:

# openssl bf -a -in file -out file.bf64

Расшифруем его  и обработаем сразу же base64:

# openssl bf -a -d -in file.bf64 -out file 

Для вычисления хешей (их еще называют отпечатками или контрольными суммами) используется команда openssl dgst -hashalg или краткая форма openssl hashalg (первая команда может также выполнять манипуляции с ЭЦП, но об этом далее). Обычное использование данной команды таково:

Информация о работе Создание ключей и сертификатов в OpenSSL.