Шифрование открытым ключом


На сайте мебели вы сможете купить мебель николаев цены для вашего комфорта в доме.

Многие функции обеспечения безопасности, реализованные в серверных демонах, опираются на шифрование открытым ключом. Оно обеспечивает конфиденциальность, целостность и достоверность данных. Различные сервисы Интернета также используют такое шифрование. Знание его основ поможет организовать защищенные веб-страницы (https) и защищенную почту РОРЗ (pop3ssl). Если вы уже знакомы с шифрованием открытым ключом, можете просто пропустить этот раздел. Если нет — приготовьтесь к весьма сжатому введению в эту тему.

В системах шифрования ключ применяется для преобразования удобочитаемых сообщений с открытым текстом (cleartext) в версию с зашифрованным текстом (ciphertext), а также для обратного преобразования. Хотя в терминах открытый текст и зашифрованный текст есть слово текст, сообщения не ограничены только текстом. В них могут быть графические, исполняемые файлы и любые другие пересылаемые данные.

У каждой криптографической системы есть три основных назначения: поддерживать целостность и конфиденциальность данных и обеспечивать невозможность отказа от авторства. Целостность означает, что сообщение не будет искажено. Конфиденциальность подразумевает, что сообщение сможет прочесть только предопределенный круг лиц. Невозможность отказа от авторства означает, что автору не удастся впоследствии заявить, будто он не писал того или иного сообщения.

Старые системы шифрования предполагали наличие единого ключа для шифрования и дешифрования сообщений. Для преобразования сообщения требовалось выполнить много операций, как в случае с системой Enigma, применявшейся коалицией союзников во время второй мировой войны. Как бы то ни было, единый ключ сделал шифрование возможным. Типичным примером является любой код, для которого необходим ключ или пароль. Планшеты для создания разовых сообщений, которые стали известны благодаря фильмам про шпионов, служат примером первых систем шифрования одним ключом.

В отличие от систем шифрования одним ключом, в системах шифрования открытым ключом (несимметричное шифрование) применяются два ключа: секретный (private) и открытый (public). Сообщения шифруются одним ключом, а расшифровываются другим. Математическое объяснение довольно сложно, чтобы приводить его здесь, однако такая схема работоспособна. Система основана на свойствах очень больших чисел. Владелец ключа держит секретный ключ в тайне, а открытый ключ раздает направо и налево. Владелец ключа применяет секретный ключ, а все остальные — открытый. Владелец ключа может шифровать сообщения, которые может открыть любой из указанных им субъектов. Однако сообщения, зашифрованные открытым ключом, может прочесть только владелец ключа.

Криптография с открытым ключом прекрасно удовлетворяет наши потребности в целостности, конфиденциальности и невозможности отказа от авторства. Если автор хочет, чтобы его сообщение смог прочесть любой желающий, но никто не смог его исказить, он зашифровывает сообщение своим секретным ключом. Все, у кого есть его открытый ключ, смогут дешифровать и прочесть это сообщение. Искажение зашифрованного сообщения сделает его нечитаемым.

Такое шифрование сообщений гарантирует, что у автора есть секретный ключ. Если автор хочет послать сообщение, которое разрешено прочесть только указанному получателю, он сможет зашифровать текст открытым ключом получателя. И только получатель, у которого есть соответствующий секретный ключ, сможет прочесть это сообщение.

Описанная система работает отлично, пока секретный ключ остается секретным. Если он похищен, потерян или раскрыт, то становится бесполезным. Неосторожный субъект, у которого похитили ключ, может столкнуться, например, с тем, что кто-то другой подписывает документы его именем. Внимательно относитесь к ключам. Иначе кто-нибудь, воспользовавшись вашим сертификатом, сделает срочный заказ на профессиональные графические станции стоимостью в полмиллиона долларов и укажет адрес уединенного дома в центре Детройта!*

Конфигурирование OpenSSL

В операционной системе FreeBSD для шифрования открытым ключом используется пакет OpenSSL. Функциональность OpenSSL используется многими программами, однако системному администратору редко приходится напрямую работать с OpenSSL. Хотя OpenSSL прекрасно справляется со своими обязанностями при настройках по умолчанию, тем не менее я предпочитаю изменять некоторые из них, чтобы упростить себе жизнь. Конфигурация OpenSSL располагается в файле /etc/ssl/openssl.cnf. Большинство параметров настройки имеют вполне приемлемые значения, и вам не стоит изменять их, если, конечно, вы не являетесь специалистом в области криптографии. Те немногие параметры, которые желательно изменить, отвечают за функции создания криптографических сигнатур. Каждое значение по умолчанию отмечено строкой _default. Параметры настройки OpenSSL общего характера, представляющие наибольший интерес, показаны ниже со значениями по умолчанию:

Значение параметра countryName_default (1) — это двухсимвольный код страны. В моем случае — это US. Значение параметра stateOrProvinceName_default (2) — это название административной области, в которой вы проживаете; может иметь произвольную длину. Я присваиваю этому параметру значение Michigan. Значение параметра 0.organizationName_default (3) — это название компании. Если бы я приобрел подписанный сертификат, тогда здесь я поместил бы название компании, указанное в сертификате. Если вы просто проверяете возможность работы программ с SSL, то можно не указывать настоящее название компании. Я мог бы указать здесь название компании, в которой я работаю, или придумать свое название.

Следующие значения отсутствуют в файле openssl.cnf, но если добавить их, в командной строке OpenSSL они будут отображаться как параметры со значениями по умолчанию. Я считаю следующие настройки полезными, даже при том, что изменять их приходится гораздо чаще, чем предыдущие — для меня они играют роль подсказок.

Значение параметра localityName_default (1) — это название города. Значение параметра organizationalUnitName_default (2) — подразделение компании, для которого был выдан данный сертификат. Следующий параметр OpenSSL, commonName_default (3), зачастую становится камнем преткновения для системных администраторов — это имя хоста, как оно отображается при обратном преобразовании имен в DNS (глава 14), для которого был выдан сертификат. Наконец, параметр emailAddress_default (4) — это адрес электронной почты администратора. Все эти значения отображаются в строке приглашения к вводу команды OpenSSL в виде значений по умолчанию, и помогут избавить вас от лишнего раздражения.

Сертификаты

Интересная особенность шифрования открытым ключом заключается в том, что автор и получатели сообщений необязательно должны быть людьми — это могут быть программы. Безопасная командная оболочка (Secure Shell, SSH) и протокол защищенных сокетов (Secure Sockets Layer, SSL) представляют собой две возможности взаимодействия программ между собой, защищая их данные от просмотра злоумышленниками. Криптография с открытым ключом — это важный компонент цифровых сертификатов (digital sertificates), используемых защищенными вебсайтами и почтовыми службами. Покупая что-нибудь с помощью Firefox в режиме онлайн, возможно, вы и не догадываетесь, что броузер неистово зашифровывает и расшифровывает веб-страницы. Вот почему ваш компьютер может пожаловаться на «недействительные сертификаты» (invalid certificates) — когда истек срок действия открытого ключа либо когда используется самозаверяющий сертификат (self-signed).

Многие компании, например VeriSign, предоставляют услуги по заверению открытых ключей. Такие компании называются Certificate Authorities (СAs, центры сертификации). Другие компании, которым необходимо заверить сертификаты, предоставляют доказательства подлинности предоставляемой о себе информации, например корпоративные документы и деловые книги, a Certificate Authority применяет свой сертификат для заверения сертификатов этих компаний. Заверяя сертификат, Certificate Authority говорит: «Я проверил документы этой персоны (организации). Он (или она) является тем, за кого себя выдает». Однако Certificate Authority не гарантирует, что эта персона не применит сертификат для веб-сервера, продающего поддельные или опасные продукты, или для шифрования требования выкупа. Подписанный (заверенный) сертификат гарантирует определенную техническую безопасность, а не персональную честность или одностороннюю техническую безопасность. Сертификаты не являются волшебной таблеткой, обеспечивающей безопасность вашей системы.

В веб-броузерах и других программах, применяющих сертификаты, есть сертификаты основных СAs. Получая сертификат, подписанный Certificate Authority, броузер принимает его. По сути, он говорит: «Я доверяю Certificate Authority, a Certificate Authority доверяет этой компании; следовательно, я буду доверять этой компании». Пока вы доверяете источнику сертификатов, схема работает.

Большинство СAs, предоставляющих услуги по выдаче заверенных сертификатов, являются крупными компаниями. Особняком в этом ряду стоит некоммерческая организация CACert, которая бесплатно предоставляет сертификаты SSL всем, кто может подтвердить свою идентификационную информацию. Популярность CACert растет с каждым годом, и, хотя корневой сертификат CACert отсутствует в Internet Explorer, в ближайшем будущем я надеюсь увидеть его в Mozilla Firefox.

Для нужд тестирования вполне подойдет сертификат, не заверенный Certificate Authority. Кроме того, незаверенные сертификаты могут использоваться для внутренних нужд компании, где можно установить сертификат в веб-броузер или сообщить пользователям, что данному сертификату можно доверять. Далее мы рассмотрим оба способа.

В обоих случаях использования сертификата необходимо сгенерировать ключ хоста.

Ключ хоста SSL

Как для заверенных, так и для самозаверенных сертификатов необходимо создать секретный ключ хоста. Ключ хоста — это всего лишь тщательно сгенерированное случайное число. Следующая команда создаст 1024-битовый ключ хоста и поместит его в файл host.key:

# openssl genrsa 1024 > host.key

После этого вы увидите сообщение от OpenSSL о том, что создается ключ хоста, и точки, бегущие по экрану, отражающие процесс генерирования ключа. Всего через несколько секунд вы получите файл, содержащий ключ. Это обычный текстовый файл, начинающийся со слов BEGIN RSA PRIVATE KEY, вслед за которыми следует блок случайных символов.

Храните в секрете свой ключ хоста! Назначьте суперпользователя root владельцем этого файла и сделайте его доступным для чтения только для root. После того как вы начнете использовать свой сертификат, любой, кто завладеет этим ключом, сможет использовать его для расшифровывания секретных сообщений.

# chown root host.key
# chmod 400 host.key

Поместите этот ключ в каталог с теми же правами доступа, какие были определены для самого файла.

Создание запроса на получение сертификата

Для получения любого сертификата, как заверенного, так и незаверенного, необходимо создать запрос. Мы не будем углубляться в подробности работы OpenSSL, поэтому мы не будем анализировать работу команды. Перейдите в каталог, где находится ключ хоста, и введите такую команду:

# openssl req -new -key host.key -out csr.pem

В ответ на экране появятся инструкции и будет задан ряд вопросов. По нажатии клавиши Enter будут вводиться ответы по умолчанию. Если предварительно вы произвели конфигурирование OpenSSL, ответы по умолчанию должны быть верными.

Двухбуквенные коды стран (1) определены в стандарте ISO 3166, поэтому вы быстро сможете найти код своей страны в Интернете. Если вы не знаете название области (края, республики) (2) и города (3) — спросите у кого-нибудь, кто хотя бы изредка покидает машинный зал. Название организации (4) — это, скорее всего, название вашей компании, затем следует указать название подразделения или отдела (5). Если вы не работаете, тогда введите свои имя и фамилию или какую-нибудь другую информацию, идентифицирующую вас уникальным образом, а для самозаверенного сертификата здесь вообще можно написать все, что угодно. Различные центры сертификации предъявляют разные требования к заполнению этого поля частными лицами, поэтому обязательно ознакомьтесь с инструкциями центра сертификации.

Принятое имя (6) оказывается камнем преткновения для большинства системных администраторов. Это не «ВАШЕ» имя, это имя сервера, которое возвращается службой DNS при обратном разрешении имен. Если не указать здесь имя сервера, запрос будет бесполезен.

В качестве адреса электронной почты (7) я рекомендую использовать общий корпоративный адрес. В этом случае я являюсь Absolute FreeBSD, независимо от того, что бы это могло значить. Не следует указывать адрес электронной почты конкретного сотрудника, который может покинуть компанию по каким-либо причинам.

Запрашиваемый пароль (1) также называют идентификационной фразой (passphrase). Повторюсь: он должен храниться в тайне, поскольку тот, кому станет известна ваша идентификационная фраза, сможет использовать ваш сертификат! Использование запрашиваемого пароля является необязательным. Но если вы используете его, вам придется вводить его на каждом запуске сервера, то есть в случае краха веб-сервера веб-сайт не будет работать, пока кто-нибудь не введет идентификационную фразу. Я рекомендую использовать идентификационную фразу, но в некоторых случаях это может оказаться неприемлемым. Нажмите клавишу Enter, чтобы использовать пустую идентификационную фразу.

Так как вы уже вводили несколько названий компании, вводить название в третий раз (2) нет смысла.

После того как вы вернетесь в командную строку, в текущем каталоге появится файл csr.pem. Он выглядит почти так же, как файл с ключом хоста, за исключением того, что в первой строке вместо слов BEGIN RSA PRIVATE KEY находится фраза BEGIN CERTIFICATE REQUEST.

Получение заверенного сертификата

Отправьте файл csr.pem в выбранный центр сертификации, и обратно вы получите файл, который будет очень похож на предыдущие файлы. Сохраните этот файл под именем signature.pem и запустите следующие команды:

# ср csr.pem cert.pem
# cat signature.pem >> cert.pem

В результате будет создана копия ключа хоста с присоединенной сигнатурой. Полученный файл и будет являться полным сертификатом. Данный сертификат можно использовать для любых служб, защищенных SSL, включая веб-страницы, pop3ssl и любых других демонов, обладающих поддержкой SSL.

Получение самозаверенного сертификата

Самозаверенный сертификат технически ничем не отличается от сертификата, заверенного центром сертификации, но он не передается на подпись Certificate Authority. Вместо этого вы создаете свою собственную сигнатуру. Большинство клиентов отказываются принимать самозаверенные сертификаты от рабочих служб, но для нужд тестирования такие сертификаты вполне пригодны. Чтобы подписать сертификат своей собственной подписью, выполните следующие команды:

Вот и все! Теперь у вас есть самозаверенный сертификат, который будет действовать 365 дней (1), в файле selfsigned.crt (2). Этот ключ можно использовать точно так же, как и заверенный сертификат, столько времени, сколько вы будете готовы терпеть предупреждения приложений.

Если вы подписываете собственные сертификаты, клиентские программы будут выдавать предупреждения о том, что «сторона, подписавшая сертификат, неизвестна» (certificate signer is unknown). Ничего удивительного, в конце концов, люди за стенами моего офиса понятия не имеют, кто такой Майкл Лукас и почему он подписывает сертификаты веб-сайта! Компании VeriSign и другие центры сертификации пользуются доверием. Мне доверяют люди, которые меня знают*, но нельзя ожидать, что мне будет доверять весь мир. По этой причине не следует применять самозаверенные сертификаты в системах, где пользователи его увидят, поскольку выдаваемые предупреждения смутят их, раздосадуют или даже отпугнут. Потратьте сотню долларов или около того и получите настоящую СА-подпись своих рабочих сертификатов.

Комментарии запрещены.