Защита сетевых сервисов с помощью stunnel. Часть 3::Журнал СА 3.2005
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9896
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8108
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8210
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5196
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5877
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Защита сетевых сервисов с помощью stunnel. Часть 3

Архив номеров / 2005 / Выпуск №3 (28) / Защита сетевых сервисов с помощью stunnel. Часть 3

Рубрика: Безопасность /  Сетевая безопасность

АНДРЕЙ БЕШКОВ

Защита сетевых сервисов с помощью stunnel

Часть 3

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

Представим, что у нас есть сервер, на котором работает Windows 2000 Advanced Server. Хотелось бы уметь удаленно управлять сервером с двух UNIX-машин. В качестве таковых выступают рабочая станция на основе FreeBSD 5.3 и ноутбук c ALT Linux Master 2.4. Соответственно, машины имеют имена win2000.unreal.net, altlinux.unreal.net, freebsd53. unreal.net и адреса 10.10.21.46, 10.10.21.29, 10.10.21.30.

Для решения поставленной задачи можно использовать несколько программ. К примеру, Citrix ICA Client, Radmin, Rdesktop, VNC. Устанавливать и настраивать на сервере Citrix или Terminal Server ради одного человека смысла нет. Radmin для UNIX в природе не существует, значит, опять пришлось бы возиться с каким-либо эмулятором. Решив не плодить сущностей без надобности, я воспользовался последним вариантом в виде VNC, так как бесплатен и существует для всех указанных платформ. Реализаций протокола VNC на свете довольно много. Наиболее известны из них RealVNC, TightVNC, t-VNC и еще несколько клонов. Некоторые, как TightVNC и t-VNC, направлены на минимизацию сетевого трафика, другие же, такие как RealVNC, – на использование шифрования. К сожалению, под Windows RealVNC не бесплатна, поэтому пришлось использовать стандартную свободную реализацию TightVNC без шифрования. Для защиты передаваемых данных, как вы уже, наверно, догадались, будет использоваться stunnel.

Займемся установкой нужных пакетов на Windows-сервер. Скачиваем с сайта TightVNC: http://tightvnc.com свежий релиз программы. На момент написания статьи была актуальна версия 1.2.9. Инсталляция достаточно тривиальна: большую часть времени можно просто нажимать кнопку «Далее». Затем нужно убедиться, что был выбран следующий набор компонентов.

Рисунок 1

Рисунок 2

Разрешаем стартовать серверу VNC автоматически как системному сервису. После этого получаем предупреждение об отсутствии пароля и на следующем экране вводим его.

Рисунок 3

Рисунок 4

По умолчанию VNC ждет соединений на порту 5800 для стандартных клиентов и 5900 для тех, кто использует в качестве клиента браузер. Нажав кнопку «Advanced», получаем следующий диалог, с помощью которого разрешаем входящие соединения только с интерфейса локальной петли.

Рисунок 5

Таким образом, получается, что на внешнем интерфейсе входящие соединения на порты 5800 и 5900 будет получать stunnel и после расшифровки передавать их на соответствующий порт локальной петли.

Теперь уже можно проверить работу VNC c помощью клиента, установленного на локальной машине. Не забываем, что присоединяться надо по адресу 127.0.0.1. Если все работает, переходим к установке stunnel. Сделать это можно двумя путями: либо компилировать пакет из исходных текстов, либо взять уже готовый по адресу: http://stunnel.org/download/binaries.html. Там же не забываем взять реализацию OpenSSL для Windows. Полный пакет OpenSSL нам не нужен, необходимы лишь библиотеки libeay32.dll и libssl32.dll, скачать их можно на той же странице. Нормальным инсталлятором stunnel так до сих пор и не обзавелся, поэтому приходится делать все вручную. Кладем stunnel-4.05.exe в C:Stunnel и добавляем туда же весь OpenSSL или скачанные dll. Затем создаем директорию C:Stunnelcerts. На этом процедуру установки для Windows можно считать законченной. Осталось лишь настроить stunnel, но об этом позже.

Установку stunnel и OpenSSL для FreeBSD и Linux мы обсуждали в предыдущих частях этой статьи, поэтому останавливаться на данном вопросе не будем. Теперь нужно поставить VNC. Для FreeBSD устанавливаем tightVNC стандартным способом из портов. К сожалению, в репозитарии пакетов ALT Linux пакет tightVNC отсутствует, поэтому ставим стандартный VNC, они все равно совместимы между собой.

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

Для остальных обсуждаемых в этой статье систем процедура практически одинакова, все отличия обычно состоят в именах директорий, используемых во время работы. FreeBSD хранит исполняемый файл openssl в /usr/local/bin/openssl, а ALT Linux – в /usr/bin/openssl. Плюс к этому вспомогательный скрипт CA.pl, представляющий для нас особую важность, в первом случае лежит в директории /usr/local/openssl/misc, а во втором – внутри /var/lib/ssl/misc. Впрочем, не стоит переживать: я обязательно подробно опишу всю процедуру генерации сертификатов для обеих систем.

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

Для начала исправляем файл openssl.cnf, дабы не набирать нижеприведенные данные каждый раз заново при создании сертификата.

countryName_default            = RU

stateOrProvinceName_default    = Rostov region

localityName                   = Rostov-on-Don

0.organizationName_default     = Tigrisha Home

emailAddress                   = tigrisha@unreal.net

Во FreeBSD openssl.cnf находится в /usr/local/openssl/, а под ALT Linux соответственно в /var/lib/ssl/.

Начнем с FreeBSD. Переходим в любую удобную директорию и выполняем команды:

# openssl req -nodes -new -days 365 -newkey rsa:1024 -x509 -keyout win2000key.pem -out win2000cert.pem

# openssl req -nodes -new -days 365 -newkey rsa:1024 -x509 -keyout altlinuxkey.pem -out altlinuxcert.pem

# openssl req -nodes -new -days 365 -newkey rsa:1024 -x509 -keyout freebsdkey.pem -out freebsdcert.pem

Большинство полей в сертификате совпадают с нашими значениями по умолчанию, во время генерации сертификатов нам просто нужно нажимать «Enter». Единственное, что нужно менять, – это поле CN (Common name). Заполнять его нужно в соответствии с полным доменным именем компьютера, для которого предназначается сертификат.

Таким образом, мы создали пару сертификат-ключ для всех наших машин. Теперь ключ лежит в файле с суффиксом key, а сертификат соответственно в файле с суффиксом cert. В ALT Linux все вышеприведенные команды будут иметь тот же эффект. Хотя для этой системы есть и другой способ. Чтобы изучить его, переходим в /var/lib/ssl/certs/ и выполняем команды:

# make win2000.pem

# make altlinux.pem

# make freebsd.pem

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

Для того чтобы системы, соединенные с помощью stunnel, могли провести аутентификацию, они должны доверять публичным сертификатам друг друга. Соответственно клиенты должны доверять сертификату сервера и наоборот. Давайте изготовим файл с доверенными сертификатами для машины win2000. Для этого объединяем сертификаты altlinuxcert.pem и freebsdcert.pem в файл trusted.pem.

# cat altlinuxcert.pem freebsdcert.pem > trusted.pem

Переносим файлы win2000key.pem, win2000cert.pem и trusted.pem на Windows-машину и кладем в директорию C:Stunnelcerts.

Таким же образом на FreeBSD копируем файлы freebsd-key.pem и freebsdcert.pem, а на Linux, соответственно, altlinuxkey.pem altlinuxcert.pem. Для клиентов в качестве файла с сертификатом доверия выступает win2000cert.pem, поэтому обязательно отправляем его на обе машины и для единообразия переименовываем в trusted.pem. Также не забываем на клиентских машинах положить файлы ключа и сертификатов в /usr/local/etc/stunnel/certs/.

Стоит обратить внимание на то, что vnc может работать либо самостоятельно, либо как подключаемый модуль веб-браузера. В первом случае нужно проводить аутентификацию и шифровать трафик, а во втором случае будет доступно только шифрование, потому что непонятно, как клиентский браузер сможет предъявить свой сертификат серверу. Отсюда делаем вывод, что на машине с Windows должно работать два независимых демона stunnel. Один с авторизацией, другой – без.

Теперь пришло время создать конфигурационные файлы. Для Windows содержимое vnc_server.cnf выглядит так:

cert = C:\stunnel\certs\win2000cert.pem

key = C:\stunnel\certs\win2000key.pem

CAFile = C:\stunnel\certs\trusted.pem

CRLfile = C:\stunnel\certs\crl.pem

debug = 7

output = C:\stunnel\stunnel.log

verify = 3

[vnc]

accept  = 10.10.21.46:5800

connect = 127.0.0.1:5800

Конфигурация второго экземпляра stunnel, хранящаяся в vnc_server1.cnf, соответственно такова:

[vnc-https]

cert = C:\stunnel\certs\win2000cert.pem

key = C:\stunnel\certs\win2000key.pem

debug = 7

output = C:\stunnel\stunnel.log

accept  = 10.10.21.46:5900

connect = 127.0.0.1:5900

Теперь посмотрим, на что похожа конфигурация для FreeBSD.

cert = /usr/local/etc/stunnel/certs/freebsdcert.pem

key = /usr/local/etc/stunnel/certs/freebsdkey.pem

CAFile = /usr/local/etc/stunnel/certs/trusted.pem

CRLfile = /usr/local/etc/stunnel/certs/crl.pem

chroot = /var/tmp/stunnel/

pid = /stunnel.pid

setuid = stunnel

setgid = stunnel

debug = 7

output = /var/log/stunnel.log

client = yes

verify = 3

[vnc]

accept  = 127.0.0.1:5800

connect = 10.10.21.46:5800

Конфигурационный файл для ALT Linux выглядит так:

cert = /usr/local/etc/stunnel/certs/altlinuxcert.pem

key = /usr/local/etc/stunnel/certs/altlinuxkey.pem

CAFile = /usr/local/etc/stunnel/certs/trusted.pem

CRLfile = /usr/local/etc/stunnel/certs/crl.pem

chroot = /var/tmp/stunnel/

pid = /stunnel.pid

setuid = stunnel

setgid = stunnel

debug = 7

output = /var/log/stunnel.log

client = yes

verify = 3

[vnc]

accept  = 127.0.0.1:5800

connect = 10.10.21.46:5800

На этом можно остановиться. Перед запуском стоит обсудить особенности конфигурационных файлов, с которыми мы еще не сталкивались. CAFile – указывает, в каком файле хранятся доверенные сертификаты. CRLfile – описывает имя файла, где должны находиться отозванные сертификаты. Такая возможность полезна, к примеру, если сертификат клиента каким-либо образом попал к злоумышленнику, и теперь нам нужно заблокировать его. И, наконец, самая важная опция – verify. Она определяет, каким образом при начале соединения будут проверяться сертификаты клиента и сервера. Значением переменной должно быть число от 0 до 3. Давайте посмотрим, что значит каждое из них.

  • 0 – наличие и подлинность сертификатов не проверяется. Это значение по умолчанию, оно также эквивалентно слову «no».
  • 1 – подлинность сертификата проверяется только при наличии такового. В случае если сертификат не проходит проверку, то соединение будет разорвано. В то же время при отсутствии сертификата соединение будет разрешено.
  • 2 – проверяется наличие и подлинность сертификата. Если сертификат отсутствует или в результате проверки считается фальшивым, соединение разрывается.
  • 3 – для создания соединения требуется обязательное наличие сертификата и его присутствие в списке доверенных.

Итак, разобравшись с опциями, запускаем stunnel на всех машинах и смотрим, что появляется в файлах stunnel.log под Windows.

2005.02.28 19:10:33 LOG5[776:724]: stunnel 4.05 on x86-pc-mingw32-gnu WIN32 with OpenSSL 0.9.7e 25 Oct 2004

2005.02.28 19:10:33 LOG7[776:1108]: RAND_status claims sufficient entropy for the PRNG

2005.02.28 19:10:33 LOG6[776:1108]: PRNG seeded successfully

2005.02.28 19:10:33 LOG7[776:1108]: Certificate: C:stunnelcertswin2000cert.pem

2005.02.28 19:10:33 LOG7[776:1108]: Key file: C:stunnelcertswin2000key.pem

2005.02.28 19:10:33 LOG7[776:1108]: Loaded verify certificates from C:stunnelcerts rusted.pem

2005.02.28 19:10:33 LOG5[776:1108]: WIN32 platform: 30000 clients allowed

2005.02.28 19:10:33 LOG7[776:1108]: FD 156 in non-blocking mode

2005.02.28 19:10:33 LOG7[776:1108]: SO_REUSEADDR option set on accept socket

2005.02.28 19:10:33 LOG7[776:1108]: vnc bound to 10.10.21.46:5800

2005.02.28 19:10:33 LOG7[776:1108]: vnc-https bound to 10.10.21.46:5900

2005.02.28 19:10:33 LOG7[776:1108]: FD 189 in non-blocking mode

2005.02.28 19:10:33 LOG7[776:1108]: SO_REUSEADDR option set on accept socket

2005.02.28 19:10:33 LOG7[776:1108]: vnc-https bound to 10.10.21.46:5900

Ну а для Linux записи в файле протокола должны выглядеть примерно так:

2005.02.28 10:26:08 LOG5[10323:16384]: stunnel 4.05 on i686-pc-linux-gnu PTHREAD with OpenSSL 0.9.7d 17 Mar 2004

2005.02.28 10:26:08 LOG7[10323:16384]: Snagged 64 random bytes from /root/.rnd

2005.02.28 10:26:08 LOG7[10323:16384]: Wrote 1024 new random bytes to /root/.rnd

2005.02.28 10:26:08 LOG7[10323:16384]: RAND_status claims sufficient entropy for the PRNG

2005.02.28 10:26:08 LOG6[10323:16384]: PRNG seeded successfully

2005.02.28 10:26:08 LOG7[10323:16384]: Certificate: /usr/local/etc/stunnel/certs/altlinuxcert.pem

2005.02.28 10:26:08 LOG7[10323:16384]: Key file: /usr/local/etc/stunnel/certs/altlinuxkey.pem

2005.02.28 10:26:08 LOG7[10323:16384]: Loaded verify certificates from /usr/local/etc/stunnel/certs/trusted.pem

2005.02.28 10:26:08 LOG5[10323:16384]: FD_SETSIZE=1024, file ulimit=1024 -> 500 clients allowed

2005.02.28 10:26:08 LOG7[10323:16384]: FD 6 in non-blocking mode

2005.02.28 10:26:08 LOG7[10323:16384]: SO_REUSEADDR option set on accept socket

2005.02.28 10:26:08 LOG7[10323:16384]: vnc bound to 10.10.21.75:3307

Думаю, всем понятно, что в протоколах системы FreeBSD будет написано примерно то же, что хранится в протоколах системы Linux. Особое внимание стоит обратить на сообщения о считывании файлов сертификатов.

Теперь нужно попробовать присоединиться к серверу Windows с любой из клиентских машин с помощью программы vncviewer.

Все должно пройти как по маслу. А в файлах протоколов соответственно появится что-то вроде:

2005.02.26 21:48:00 LOG7[7492:16384]: vnc accepted FD=11 from 10.10.21.29:51902

2005.02.26 21:48:00 LOG7[7492:16384]: FD 11 in non-blocking mode

2005.02.26 21:48:00 LOG7[8003:32770]: vnc started

2005.02.26 21:48:00 LOG5[8003:32770]: vnc connected from 10.10.21.29:51902

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): before/accept initialization

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: FD=11, DIR=read

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: ok

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 read client hello A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 write server hello A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 write certificate A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 write certificate request A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 flush data

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: FD=11, DIR=read

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: ok

2005.02.26 21:48:00 LOG5[8003:32770]: VERIFY OK: depth=0, /C=RU/ST=Rostov region/O=Tigrisha Home/OU=Test Lab/CN=win2000.unreal.net

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 read client certificate A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 read client key exchange A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 read certificate verify A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 read finished A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 write change cipher spec A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 write finished A

2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept): SSLv3 flush data

2005.02.26 21:48:00 LOG7[8003:32770]:    2 items in the session cache

2005.02.26 21:48:00 LOG7[8003:32770]:    0 client connects (SSL_connect())

2005.02.26 21:48:00 LOG7[8003:32770]:    0 client connects that finished

2005.02.26 21:48:00 LOG7[8003:32770]:    0 client renegotiatations requested

2005.02.26 21:48:00 LOG7[8003:32770]:    2 server connects (SSL_accept())

2005.02.26 21:48:00 LOG7[8003:32770]:    2 server connects that finished

2005.02.26 21:48:00 LOG7[8003:32770]:    0 server renegotiatiations requested

2005.02.26 21:48:00 LOG7[8003:32770]:    0 session cache hits

2005.02.26 21:48:00 LOG7[8003:32770]:    0 session cache misses

2005.02.26 21:48:00 LOG7[8003:32770]:    0 session cache timeouts

2005.02.26 21:48:00 LOG6[8003:32770]: Negotiated ciphers: AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1

2005.02.26 21:48:00 LOG7[8003:32770]: FD 14 in non-blocking mode

2005.02.26 21:48:00 LOG7[8003:32770]: vnc connecting 127.0.0.1:5800

2005.02.26 21:48:00 LOG7[8003:32770]: remote connect #1: EINPROGRESS: retrying

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: FD=14, DIR=write

2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: ok

2005.02.26 21:48:00 LOG7[8003:32770]: Remote FD=14 initialized

2005.02.26 21:49:09 LOG7[8003:32770]: Socket closed on read

2005.02.26 21:49:09 LOG7[8003:32770]: SSL write shutdown (output buffer empty)

2005.02.26 21:49:09 LOG7[8003:32770]: SSL alert (write): warning: close notify

2005.02.26 21:49:09 LOG7[8003:32770]: SSL_shutdown retrying

2005.02.26 21:49:09 LOG7[8003:32770]: SSL alert (read): warning: close notify

2005.02.26 21:49:09 LOG7[8003:32770]: SSL closed on SSL_read

2005.02.26 21:49:09 LOG7[8003:32770]: Socket write shutdown (output buffer empty)

2005.02.26 21:49:09 LOG5[8003:32770]: Connection closed: 229164 bytes sent to SSL, 188234 bytes sent to socket

2005.02.26 21:49:09 LOG7[8003:32770]: vnc finished (0 left)

Особое внимание стоит обратить на строчку со следующими символами:

VERIFY OK: depth=0, /C=RU/ST=Rostov region/O=Tigrisha Home/OU=Test Lab/CN=win2000.unreal.net

Четко видно, как сертификат сервера был опознан клиентом. Соответственно, в протоколах сервера можно увидеть:

VERIFY OK: depth=0, /C=RU/ST=Rostov region/O=Tigrisha Home/OU=Test Lab/CN=freebsd53.unreal.ne

Стоит отметить, что в случае, если файл crl.pem не будет содержать сертификатов, stunnel не запустится. Все, что мы получим, – это вот такое сообщение об ошибке:

2005.03.12 10:52:12 LOG3[5934:16384]: Error loading CRLs from /usr/local/etc/stunnel/certs/crl.pem

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

Разобравшись с авторизацией, давайте посмотрим на еще один способ создания сертификатов клиента и сервера. В составе пакета OpenSSL версий выше 0.9.6 поставляется утилита CA.pl, с помощью которой генерирование сертификатов превращается из нелегкого труда по запоминанию длинных команд в забаву. На этот раз мы поступим в соответствии со всеми правилами. Сначала создадим корневой сертификат для unreal.net, а потом с помощью него заверим все клиентские сертификаты.

# /var/lib/ssl/misc/CA.pl –newca

CA certificate filename (or enter to create)

 

Making CA certificate ...

Generating a 1024 bit RSA private key

.....++++++

.......................................++++++

writing new private key to "./demoCA/private/cakey.pem"

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ".", the field will be left blank.

-----

Country Name (2 letter code) [AU]:RU

State or Province Name (full name) [Some-State]:Rostov region

Locality Name (eg, city) []:Rostov-on-Don

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tigrisha home

Organizational Unit Name (eg, section) []:Test Lab

Common Name (eg, your name or your server"s hostname) []:unreal.net

Email Address []:tigrisha@unreal.net

В результате этих действий в файле cakey.pem появится секретный ключ, а в cacert.pem наш корневой сертификат. Затем создаем запрос на новый клиентский сертификат для машины altlinux.unreal.net.

# /var/lib/ssl/misc/CA.pl –newreq

Generating a 1024 bit RSA private key

.......................................................................++++++

........................................++++++

writing new private key to "newreq.pem"

 

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ".", the field will be left blank.

-----

Country Name (2 letter code) [AU]:RU

State or Province Name (full name) [Some-State]:Rostov region

Locality Name (eg, city) []:Rostov-on-Don

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tigrisha home

Organizational Unit Name (eg, section) []:Test Lab

Common Name (eg, your name or your server"s hostname) []:altlinux.unreal.net

Email Address []:tigrisha@unreal.net

После этого во вновь созданном файле newreq.pem будет находиться секретный ключ клиента и запрос на создание сертификата. Осталось только заверить его с помощью корневого сертификата, сгенерировав таким образом новый клиентский сертификат.

# /var/lib/ssl/misc/CA.pl –sign

Using configuration from /var/lib/ssl/openssl.cnf

18596:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject

Enter pass phrase for ./demoCA/private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: Feb  8 18:39:33 2005 GMT

            Not After : Feb  8 18:39:33 2006 GMT

        Subject:

            countryName               = RU

            stateOrProvinceName       = Rostov region

            localityName              = Rostov-on-Don

            organizationName          = Tigrisha home

            organizationalUnitName    = Test Lab

            commonName                = altlinux.unreal.net

            emailAddress              = tigrisha@unreal.net

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                BF:01:B4:1C:AA:2C:46:8E:0B:B6:9D:70:BA:AA:D3:86:DC:8F:8A:09

            X509v3 Authority Key Identifier:

                keyid:F8:66:F7:4E:F9:3F:7A:C7:83:BC:0C:84:40:AD:2F:3F:FC:5A:9C:AC

                DirName:/C=RU/ST=Rostov region/L=Rostov-on-Don/O=Tigrisha home/OU=Test Lab/CN=unreal.net/emailAddress=tigrisha@unreal.net

                serial:00

 

Certificate is to be certified until Feb  8 18:39:33 2006 GMT (365 days)

Sign the certificate? [y/n]:y

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

Signed certificate is in newcert.pem

После всех этих мытарств сертификат клиента находится в файле newcert.pem. Повторяем эти шаги для остальных клиентов. При этом не стоит забывать, что в файлы newcert.pem и newreq.pem перезаписываются при каждом запуске CA.pl c ключами -sign и -newreq, отсюда следует, что после завершения цикла генерации ключа и сертификата лучше переименовывать эти файлы так, чтобы своим именем они отражали принадлежность тому или иному клиенту. К примеру, для клиента altlinux.unreal.net файлы должны называться altlinuxcert.pem и altlinuxkey.pem.

Еще одно обстоятельство, о котором стоит помнить, – из файла newreq.pem после заверения сертификата лучше всего удалять запрос на сертификацию. Он начинается строкой -------BEGIN CERTIFICATE REQUEST--------- и заканчивается, соответственно ----END CERTIFICATE REQUEST----- Если этого не сделать, то некоторые версии stunnel завершаются с ошибкой при попытке работы с таким файлом.

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

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

Поэтому давайте рассмотрим другой способ управления сертификатами. В этом случае мы будем помещать каждый сертификат в отдельный файл. Затем доверенные сертификаты кладем в директорию trusted, а отозванные – в папку crl. На клиентах и сервере создаем обе папки внутри директории certs. Затем вносим следующие изменения в конфигурационные файлы. Вместо строк CAFile и CRLfile вписываем следующее:

Для ALT Linux:

CRLpath = /usr/local/etc/stunnel/certs/trusted/

CApath = /usr/local/etc/stunnel/certs/crl/

Для FreeBSD вносим те же изменения, что и для ALT Linux.

Для Windows:

CRLpath = C:stunnelcertscrl

CApath = C:stunnelcerts rusted

Если опираться в своих действиях на официальную документацию к stunnel, то, сложив все доверенные сертификаты в папку trusted, можно было бы попытаться запустить демонов на сервере и клиентах и радоваться полученному результату. Но не тут то было – запуск пройдет гладко, а вот аутентификация функционировать не будет. По крайней мере, у меня таким способом вообще ничего не заработало. Все дело в том, что для совместимости со специфическими особенностями stunnel имена файлов доверенных сертификатов должны быть в особом формате. А точнее имя файла должно соответствовать хэшу, вычисленному по содержимому сертификата. Чтобы узнать хэш того или иного файла под ALT Linux, нужно выполнить следующую команду:

# /var/lib/ssl/misc/c_hash /  /usr/local/etc/stunnel/certs/trusted/*.pem

b71698b3.0 => /usr/local/etc/stunnel/certs/trusted/win2000cert.pem

Таким образом, становится понятно, что файл сертификата win2000cert.pem нужно переименовать в b71698b3.0. После того как вы проведете подобные действия на остальных машинах, можно запускать stunnel. Стоит отметить, что во FreeBSD утилита c_hash будет находиться в директории /usr/local/openssl/misc. Также необходимо обратить внимание на тот факт, что для Windows в стандартной поставке openssl программа c_hash отсутствует. Поэтому хэши ключей нужно будет вычислять на Linux или FreeBSD. Единственное различие будет в том, что в файл протокола при старте записываются следующие сообщения, касающиеся доверенных сертификатов.

2005.03.14 11:19:03 LOG7[7068:16384]: Verify directory set to /usr/local/etc/stunnel/certs/trusted/

2005.03.14 11:19:03 LOG5[7068:16384]: Peer certificate location /usr/local/etc/stunnel/certs/trusted/

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


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru