Использование SSL в IntraWeb.
Николай
Ренжиглов ®
В этой главе мы обсудим технологию создания клиентских и серверных IntraWeb-приложений для обмена данными в WEB по защищенным каналам с использованием слоя SSL, а также работу с сертификатами X.509.
Введение.
Многие программисты, имеющие опыт разработки сложных интерактивных приложений для WEB, в процессе своей работы не выходили за рамки “открытого” канала обмена по протоколу HTTP. Обмен текстом по этому протоколу не предполагает защиты от несанкционированного доступа к пакетам данных, поэтому использование программного обеспечения такого рода не так распространено, как другие аспекты WEB-программирования в Delphi. Как правило, за защиту информации в сети отвечает сетевой администратор проекта, а не программист. Хотя настройка для работы со слоем SSL в проекте IntraWeb Stand Alone сводится к установке пары свойств контроллера сервера, программист должен знать технологию работы с защищенным слоем достаточно подробно, поскольку SSL становится частью программ, разработанных с использованием IntraWeb.
Задачу шифрования информации в общем случае решает отказ от передачи текста и переход на обмен двоичными данными между абонентами сети, желающими обезопасить свою работу. Проекты, основанные на алгоритмах шифрования, канули в лету не только потому, что современные вычислительные мощности, используемые для взлома алгоритма, позволяют осуществить несанкционированный доступ к данным за короткие сроки. Алгоритм, будучи угадан, может использоваться злоумышленниками для работы под видом авторизованного пользователя сколь угодно долго.
В подавляющем большинстве случаев данные шифруются при помощи ключей - наборов данных небольшой длины, информация которых комбинируется с исходной и изменяет ее. При этом правила для восстановления данных из зашифрованного вида не могут быть получены алгоритмически, то есть они не содержатся явно или неявно в самом шифруемом тексте. Адресат применяет точно такой же внешний ключ, таким же или иным способом комбинируя его с данными для расшифровки. Естественно, применяемый в данной схеме ключ является секретным (private) и известным только отправителю и адресату.
Это так называемый симметричный способ шифрования. Скорость его работы достаточно высока, но его недостатки сдерживают его применение на практике. Кроме возможности похищения секретного ключа и работы под видом авторизованного пользователя, симметричный способ не делает различия между отправителем и адресатом, что с правовой точки зрения недопустимо. Если между абонентами нет полного доверия или кто-то из них злоупотребляет им, то в симметричном случае невозможно выяснить, кто несет ответственность за искажение информации.
В 70-х годах прошлого века авторами Диффи и Хельманом была предложена схема шифрования с открытым ключом. Принципиально, что в ней ключи для шифрования и расшифровки различаются. Один ключ становится доступным некоему сообществу отправителей и используется для шифрования, а другой остается private-ключом, которым распоряжается один человек - адресат. Этот секретный ключ применяется для расшифровки сообщений. Возможно и обратное: private-ключ используется для шифрования, а открытый для раскодирования сообщений. На первый взгляд кажется, что "секретность" этого метода снижается ровно наполовину по сравнению с симметричной схемой, ведь второй ключ известен многим людям.
На самом деле приватность секретного ключа решает все. Секретный ключ никуда не передается и не экспонируется ни при каких условиях. Он однозначно описывает владельца ключа, как, например, отпечаток его пальца или подпись. Отсюда и расхожее название секретного ключа как электронной подписи.
Как используются ключи для шифрования? Для того чтоб разобраться в этом, рассмотрим технологии реальной жизни – как в действительности возникает и решается проблема засекречивания информации.
Предположим, что необходимо по сети осуществить оплату за товары с клиентского счета в банке. Клиент дает указание банку перечислить деньги на требуемый счет. Перед началом процедуры сервер банка должен установить личность клиента. Применить систему паролей в этой ситуации небезопасно – сам пароль не защищен от перехвата злоумышленниками. В отличие от парольной системы SSL предполагает наличие у клиента двух ключей: общедоступного (public) и секретного (private). Ключи используются во взаимно противоположных процессах: первый используется для рассекречивания данных, зашифрованных с применением другого и наоборот. Например, цифровую подпись клиент шифрует с помощью своего private-ключа. Читать эту подпись можно из любого места сети – public-ключ для расшифровки подписи доступен везде. Однако подделать подпись без знания private-ключа (т.е. фактически взломать private-ключ) невозможно. Это гарантирует закон не просто больших, а невообразимо больших чисел: как минимум десять в тридцать восьмой степени переборов для алгоритма RC4 128 бит (напомним, что время существования вселенной в секундах намного меньше: 1018 - 1020 ).
В свою очередь сервер банка также имеет private-ключ для шифрования своих сообщений. Public-ключ находится у клиента и используется им, например, для расшифровки идентификационной информации банка. Такой обмен и опознание дают гарантию того, что клиент не отправил информацию о своих банковских реквизитах злоумышленникам. Существовал (да наверное существует и по сей день) такой способ воровства информации, рассчитанный на невнимательность, когда клиент при наборе URL-банка делает ошибку (например, вместо alpha.com указывает alfa.com) и попадает на сайт-двойник с неотличимым от оригинала интерфейсом. Далее схема ясна: персональная информация клиента попадает в третьи руки и используется втайне от него. Взаимная идентификация позволяет исключить такого рода возможности несанкционированного доступа к информации.
В дальнейшем, когда абоненты сеанса связи идентифицировали друг друга, обмен информацией также не обходится без использования ключей. Кроме того, SSL в этом случае обеспечивает защиту от изменения битов пакета в процессе передачи. Вместе с информацией клиента серверу передаются и контрольные суммы пакетов, которые он сравнивает со своими, используя так называемый Hash-метод. Если суммы не совпадают, сервер отказывает в обработке запроса.
Из всего вышесказанного ясно, что для обслуживания процесса применения private и public-ключей необходимы услуги третьей стороны, подтверждающей, что public-ключ, применяемый клиентом, будет соответствовать в нашем примере private-ключу конкретного банка. Такая третья сторона называется сертификационным центром. Основная задача сертификационного центра при выдаче private-ключа – это убедиться, что лицо, запрашиваемое такой ключ, не имеет целью выдать себя за кого-то другого – то есть идентифицировать личность. Работы по этой части хватает (вспомните нотариальные конторы), поэтому один сертификационный центр (Certificate Authority или CA) может выдавать лицензии другому, тот третьему и так далее. При этом принимаются меры к тому, чтоб не возникало дублирование публикуемых ключей и ситуаций, когда субъект этого процесса выдает сертификат сам себе. Одна из самых успешных и известных фирм, работающих в области выдачи сертификатов - VeriSign[1]. Однако Вы сами можете организовать сертификационный центр у себя в Интрасети, где достаточно просто теми или иными способами идентифицировать клиента.
Протокол SSL.
Технически существует несколько распространенных способов организации “закрытого” канала. Наиболее популярным и стандартизованным (хотя и не официально) на сегодняшний день является протокол SSL (Secret Socket Layer), разработанный NetScape[2]. Этот протокол представляет собой некоторую надстройку над протоколом TCP/IP и промежуточный слой, на котором располагается протокол HTTP и уровень приложений:
IMAP LDAP HTTP
Уровень
клиентских или
серверных WEB-приложений
TCP/IP SSL
Уровень
обмена данными по протоколу
TCP/IP
Ясно, что работа с использованием SSL невозможна только на сервере или только в клиентском приложении: оба участника обмена информацией должны использовать безопасный слой. Другое дело, что некоторые WEB-серверы, функционирующие с использованием SSL, позволяют обмениваться данными по открытому каналу (как правило, в пределах домена и при передаче не конфиденциальных данных). Но если сервер настаивает на использовании SSL, причем с высокой степенью секретности, то соединиться с ним и получить информацию для отображения в окне браузера без соответствия этим требованиям бывает невозможно.
В самом SSL не заложено никаких алгоритмов шифрования. Слой только позволяет использовать некоторое их множество:
· Отсутствие шифрования (тоже алгоритм, причем самый быстрый)
· Потоковые методы
o RC4 с 40-битным ключом
o RC4 с 128-битным ключом. Обеспечивает вероятность “угадывания” ключа при случайном переборе 3.4 * 10-38.
· CBC, работающие по принципу цепочки блоков, когда предыдущий зашифрованный блок используется как основа для шифрования последующего.
o RC2 with 40 bit key (более медленный алгоритм шифрования, чем RC4)
o
DES
with 40 bit key
o
DES
with 54 bit key
o Triple-DES with 168 bit key. Наиболее мощный на сегодняшний день. Работает медленнее, чем RC4 c 128-битным ключом, но вероятность взлома исчезающе мала: 3.7 * 10-50.
o
Idea
(128 bit key)
o
Fortezza
(96 bit key)
Содержимое сертификата.
Сертификат содержит идентифицирующую субъекта информацию, открытый ключ и период действия сертификата. Здесь также хранятся данные о сертификационном органе, выпустившем сертификат.
|
Двоичное представление сертификакта
описывается стандартом ASN.1, который определяет правила шифровки. Если передача по сети двоичной
информации невозможна, используется ASCII-формат,
известный как PEM-шифрование (Privacy Enhanced Mail). Пример PEM-кода показан ниже:
-----BEGIN CERTIFICATE-----
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUG
A1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhv
cml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz
bmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzEL
vKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaa
lWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV
2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7
dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
-----END CERTIFICATE-----
Библиотеки SSL.
Для работы с программным обеспечением IntraWeb нам понадобятся библиотеки LIBEAY.DLL и SSLEAY.DLL, работающие со слоем SSL. Библиотеки разработанны Эриком Янгом и Тимом Хадсоном (Eric A. Young и Tim J. Hudson.)[3] . Не входят ни в поставку IntraWeb 5.0 – 5.1, ни в Delphi (Indy-компоненты). Они доступны по адресу [4] для использования без всяких ограничений.
На самом
деле ограничения есть. США и Канада ввели жесткий контроль на экспорт использования технологии SSL.
Разработчики Indy компонентов (как и OpenSSL.org) поставляют библиотеки без исходных текстов.
Речь о поставке лицензий на их использование вообще не идет. Это может явиться
препятствием при попытке подписать свой
сертификат в CA, которые расположены в Северной Америке – такие агентства не
подписывают сертификаты со стойкой криптографией (длина ключа 128 бит и более)
для клиентов из не “ либеральных европейских стран” ( liberal countries in
Europe). Подробнее
об OpenSSL
см. раздел “Проект OpenSSL”.
Установите эти библиотеки на свой серверный компьютер в папку /WINNT/SYSTEM32.
Проект OpenSSL[5].
Проект OpenSSL основан на предоставлении как самих библиотек LIBEAY.DLL и SSLEAY.DLL, так и утилит для работы с ними. Поддерживается и развивается программистами на добровольных началах. На сайте организации представлена полная документация по использованию библиотек, их интерфейсы и примеры на языке Perl и PHP. Программисты OpenSSL разработали утилиту командной строки OpenSSL.exe и снабдили ее отличной документацией. Программа предназанчена для:
· Создания X.509 сертификатов.
· Шифрования с использованием библиотеки Ciphers.
· Тестирования SSL-клиентов и серверов.
· Управления почтовыми отправлениями с использованием SSL.
Программа OpenSSL.exe работает в режиме командной строки и в дальнейшем мы будем ее использовать для работы с ключами и сертификатами.
Получение и подписывание сертификатов.
Существует два пути получения подписанного сертификата.
1. С использованием услуг СА. Следуя по этому пути, вам необходимо получить свой собственный private key. Для этой цели запустите программу OpenSSL с командной строкой:
>OPENSSL genrsa –out
privkey.pem
Далее сгенерируйте csr-сертификат (вернее, запрос Certificate signing request):
>OPENSSL req –new –key
privkey.pem –out cert.csr –config openssl.conf
Оба файла теперь необходимо отправить CA, пользующемуся вашим полным доверием, например, Verisign. CA “ставит печать” в вашей заявке csr (не очень быстро и совсем небезвозмездно: для организации своего СА фирма запросит максимально дорого, а для некоммерческих целей может быть и бесплатно) и отправляет вам обратно текстовые файлы в каком-либо формате для использования всего этого как X.509-сертификата. Это рекомендуемый путь для работы с проектами, которые уже отлажены и переданы в коммерческую эксплуатацию.
2. Без использования услуг СА. Этот путь лучше всего подходит для для создания тестовых проектов IntraWeb. Здесь не надо платить за чьи-либо СА-услуги, ждать подписи, а главное - можно экспериментировать с сертификатами, меняя их параметры и исследуя результаты работы. Этот способ мы рассмотрим более подробно.
Самоподписанный сертификат.
Роль разработчика IntraWeb-проектов в терминах SSL можно определить как пользователь клиентского и серверного ПО. Роль СА как такового мы здесь рассматривать не будем (о том, как действовать в роли СА при выдаче сертификатов описано в [[6]]).
При создании ключей с использованием OpenSSL.exe, необходимо описать конфигурационную среду владельца сертификата. Эта среда хранится в текстовом файле, подключаемом в момент работы программы OpenSSL. Вот текст такого файла с именем openssl.cnf, используемого автором при тестировании примеров книги:
[req]
default_bits=1024
default_keyfile=privkey.pem
distinguished_name=req_distinguished_name
encrypt_rsa_key=no
[req_distinguished_name]
countryName=RU
countryName_default=RU
stateOrProvinceName=Rostov region
localityName=Rostov upon Don
localityName_default=Rostov upon Don
organizationName=IVCZKZD
organizationName_default=IVCSKZD
organizationalUnitName=Payroll accounting
commonName=Renzhiglov Nick
emailAddress=Renzhiglov@ivc.skzd.mps
Поместите этот файл в папку, в которой расположен OpenSSL.exe. Создайте свой private key способом, описанным выше. Ключ privkey.pem будет помещен программой в ту же папку.
Теперь необходимо создать самоподписанный сертификат сроком действия, скажем, три года. В командной строке наберите
>OPENSSL req –new –x509 –key privkey.pem –out cert.pem –days 1095
–config openssl.cnf
В контроллере сервера определите номер SSL-порта, например 500. Строку SSLCertificatePassword оставьте пустой, поскольку наш самоподписанный сертификат не требует пароля для доступа к его содержимому.
Для задания паролей такого рода можно использовать параметр командной строки -passin или -passout для входящего и исходящего паролей соответственно.
Предупреждение о несоответствии сертификата имени сайта (server hostname) возникает при обнаружении того, что CA в конфигурационном файле задан неверно (в нашем случае commonName=Renzhiglov Nick). Укажите в поле commonName имя сайта и создайте новый сертификат - предупреждение исчезнет.
В разделе "Проект IntraWeb SSL " мы акцентировали внимание на том, что в тестовом проекте осуществляется только идентификация сервера с клиентской стороны. Конечно, возможна проверка сертификатов и в обратном направлении. Однако в этом случае на серверном компьютере придется организовать службу ведения сертификатов клиентов с соответствующей доработкой серверного ПО. В частности, нужно рекомендовать всем клиентам создать CA-сертификаты, подписать их и затем добавить их в список "trusted CA list" на сервере. Командная строка для запуска утилиты OpenSSL, используемой для контроля сертификатов клиентов, установленных на сервере, следующая (IntraWeb-приложение должно быть запущено):
>OPENSSL s_client -connect
100.100.100.100:500 -prexit
>openssl command [ command_opts ] [ command_args ]
Перечень стандартных команд, задаваемых в позиции command, представлен ниже.
asn1parse http://www.openssl.org/docs/apps/asn1parse.html |
Разбивает последовательность ASN.1 |
ca http://www.openssl.org/docs/apps/ca.html |
Осуществляет управление сертификационным центром СА. |
ciphers http://www.openssl.org/docs/apps/ciphers.html |
Определяет дескрипторы шифрования. |
crl http://www.openssl.org/docs/apps/crl.html |
Управляет списком недействительных (revocation list) сертификатов. |
crl2pkcs7 http://www.openssl.org/docs/apps/crl2pkcs.html |
Конвертирует CRL в формат PKCS#7. |
dsa http://www.openssl.org/docs/apps/dsa.html |
Управление областью DSA. |
dsaparam http://www.openssl.org/docs/apps/dsparam.html |
Генерирование параметров DSA. |
enc http://www.openssl.org/docs/apps/enc.html |
Шифрует строку |
dhparam http://www.openssl.org/docs/apps/dhparam.html |
Управление параметрами Диффи-Хельмана (Diffie-Hellman). |
gendsa http://www.openssl.org/docs/apps/gendsa.html |
Генерирует DSA-параметры. |
genrsa http://www.openssl.org/docs/apps/genrsa.html |
Генерирует RSA-параметры. |
ocsp http://www.openssl.org/docs/apps/ocsp.html |
Используется для определения on-line состояния сертификата. |
passwd http://www.openssl.org/docs/apps/passwd |
Генерирует хэш-код для пароля, введенного в диалоге. |
pkcs12 http://www.openssl.org/docs/apps/pkcs12 |
Управление областью PKCS#12 |
rand http://www.openssl.org/docs/apps/rand.html |
Генерирует псевдослучайную последовательность байт. |
req http://www.openssl.org/docs/apps/req.html |
Управление запросом на создание X.509-сертификата. |
Rsa http://www.openssl.org/docs/apps/rsa.html |
Управление областью RSA |
Rsautl http://www.openssl.org/docs/apps/rsautl.html |
Управление генерированием, сертифицированием и верификацией RSA-сертификатов. |
s_client http://www.openssl.org/docs/apps/s_client.html |
Тестирует клиентскую часть сервера (например, список сертифицированных клиентов). |
s_server http://www.openssl.org/docs/apps/s_server.html |
Тестирует соединение путем эмуляции WEB-сервера. |
sess_id http://www.openssl.org/docs/apps/sess_id.html |
Управление параметрами SSL-сессии. |
Smime http://www.openssl.org/docs/apps/smime.html |
Работа с почтой по защищенному каналу. |
Speed http://www.openssl.org/docs/apps/speed.html |
Тестирование скорости алгоритмов шифрования. |
Verify http://www.openssl.org/docs/apps/verify.html |
Верификация X.509-сертификатов. |
Version http://www.openssl.org/docs/apps/version.html |
Информация о текущей версии библиотек SSL |
x509 http://www.openssl.org/docs/apps/x509.html |
Управление X.509-сертификатами. |
Приложение 2. Список портов, используемых по умолчанию.
Открытый
порт |
Защищенный
порт |
Назначение |
80 |
443 |
Связь клиента и WEB-сервера по протоколу HTTP, HTTPS |
25 |
465 |
Электронная почта и обмен сообщений между серверами. |
119 |
563 |
Обмен данными конференций usenet (nntp, nntps) |
389 |
636 |
Работа с адресной книгой |
20,21 |
989,990 |
Работа по протоколу FTP, FTPS |
23 |
992 |
Работа с удаленным компьютером по протоколу TELNET, TELNETS |
143 |
993 |
Каталоги почтового ящика, электронная почта. |
|
994 |
Чаты по безопасному каналу J |
110 |
995 |
POP3, POP3S |
[1] www.verisign.com
[2] Подробнее см. http://home.netscape.com/eng/ssl3/draft302.txt
[3] http://www.psy.uq.edu.au/~ftp/Crypto
[4] http://www.projectindy.org/ssl.html. Обновления Indy-компонент, которые имеют дело с протоколом SSL, находятся на сайте Словении www.intelicom.si, что вызвано, по-видимому, стремлением обойти ограничения на экспорт технологии SSL, введенные в Северной Америке.
[5] http://www.openssl.org
[6] http://www.openssl.org/docs/apps/ca.html#