АНДРЕЙ БЕШКОВ
Защита сетевых сервисов с помощью 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. Инсталляция достаточно тривиальна: большую часть времени можно просто нажимать кнопку «Далее». Затем нужно убедиться, что был выбран следующий набор компонентов.
Разрешаем стартовать серверу VNC автоматически как системному сервису. После этого получаем предупреждение об отсутствии пароля и на следующем экране вводим его.
По умолчанию VNC ждет соединений на порту 5800 для стандартных клиентов и 5900 для тех, кто использует в качестве клиента браузер. Нажав кнопку «Advanced», получаем следующий диалог, с помощью которого разрешаем входящие соединения только с интерфейса локальной петли.
Таким образом, получается, что на внешнем интерфейсе входящие соединения на порты 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 с помощью сертификатов исчерпанной. А значит, подошла к концу и эта серия статей.