четверг, 5 февраля 2009 г.

Linux // Настройка GoAhead Web Server для работы c OpenSSL

На самом деле прошу не смеяться - может кому-то данный опыт тоже пригодиться.
И сохранит 4 часа непрерывного ковыряния в Гуле и коде (да, он опенсоурсный, но почитайте лицензию прежде чем использовать).

"Да нах он нужен! Ведь есть восхитительнейшие Apache или еще что-нибудь" - скажете вы и, по своему, будете правы. Однако, спешу напомнить, что жизнь непростая штука и вы не всегда играете по своим правилам. Короче, в сторону лирику...

Задача примерна такая - есть маломощное вычислительное устройство и на нем уже крутиться данный сервер. Надо криптануть трафик от и до с помощью SSL.

Все опции по криптовальным пакетам есть в
<место куда вы распаковали исходники>/LINUX/Makefile

И надо сказать даже у апача столько нет ;-)
- бесплатная OpenSSL
- платная BSAFE от RSA
- платная NanoSSL от Mocana

Понятно, что одним из рассматриваемых вариантов становиться OpenSSL (нет еще не победитель, но как бы уже доступен на попробовать).

Что собственно делаем для сборки GoAhead Web server (далее GAWS).

Кросскомпилером собираем OpenSSL (отдельная история - если кто захочет могу рассказать отдельно). Есть правда надежда что он у вас уже собранный. Я делаю допущение что он у вас уже есть :-) C каким-нибудь тулкитом для встроенного линукса.

Редактируем вышеуказанный Makefile следующим образом (согласно английским комментариям в файле)

SSLPATCHFILE = ../websSSL.o

# Here I put top location of openssl
# it could be anywhere for example point to location of target platform
OPENSSL_ROOT=/opt/eldk//usr

SSLINC = $(OPENSSL_ROOT)/include/openssl
# here could be either
# static libs in following form
# $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypto.a
# or
# dynamic in following form
# -L$(OPENSSL_ROOT)/lib -lssl -lcrypto
# or both forms for example I'we was forced to add 1 satatic from krb5 set ;-)
SSLLIB = -L$(OPENSSL_ROOT)/lib -lssl -lcrypto
SSLSW = -DWEBS_SSL_SUPPORT -I$(SSLINC) -DOPENSSL


Вот собственно и все.
Пробуем собрать и играемся сими опциями до удачного завершения билда и линковки.
Обычно нужно какую нибудь библиотечку добавить, которой не хватает :-)

Все собралось. Получили исполнимый файл. Нужны сертификаты.

Процедура такова - реальный сертификат нам на тестировании не нужен.
Посему делаем самодельные.

Сервер будет их искать в (там где у него жестко прописано - см. исходный код в файле websSSL.c - можете, кстати, и поменять)

1) там где он стартанул - должен быть файл server.pem
2) там где он стартанул - должна быть директория certs с двумя файлами в ней cacert.pem & cakey.pem

делаем их так

1) Генерим ключ и x509 сертификат
$openssl req -x509 -newkey rsa:2048 -days 1024 \
-keyout server-key.pem -out server-cert.pem
Вас опросит по английски заполнить поля вашего сертификата
Не забудте на вопрос
Common Name (eg, YOUR name) []:localhost
указать имя вашего хоста - в моем примере - localhost

2) Снимаем пароль с ключа, который вы введете на первом шаге на один из вопросов
$openssl rsa -in server-key.pem -out server-key-nopassword.pem
3) Склеиваем два файла в один (он будет лежать откуда стартует исполнимый файл)
$cat server-key-nopassword.pem server-cert.pem > server.pem
4) Ну и собственно перемещаем или копируем их каждого на свое место
server.pem      -> /server.pem
server-cert.pem -> /certs/cacert.pem
server-key.pem -> /certs/cakey.pem

Проверяем работоспособность.

Если вдруг не заработает - берите дебаггер и вперед.

Удачи.

Отправить комментарий