Приветствую коллеги.

Во-первых, громадное спасибо Олегу за его прошивку и всем людям, участвующим в развитии этого форума. Почитав его, настолько вдохновился, что решил подкинуть свои 5 копеек
Дело в том, что установив rtorrent с веб-мордой, vnstat, ados, rrdtool, решил выпустить всё это добро наружу с соответствующим уровнем безопасности. И вот что из этого вышло.

Внимание, данный HOWTO не претендует на полноту, абсолютную правильность и вселенскую истину. Я не гуру в Линуксе, просто чтение и попытки понять мануалы и хелпы. Как обычно as is. У меня всё замечательно работает. С удовольствием принимаются замечания, корректировки и комментарии.

Источники:
http://wl500g.info/showpost.php?p=90459&postcount=343
http://www.unixdoc.ru/print.php?print_id=155

Задача - получить доступ по ssl к lighttpd снаружи c авторизацией исключительно с помощью клиентских сертификатов. Как результат, получаем зашифрованное соединение, отсутствие передачи по сети каких-либо паролей, которые можно попытаться снять кейлоггером либо брутфорсом, доступ только с компьютера, в браузер которого импортирован сооответствующий клиентский сертификат.

Предполагается, что уже имеем настроенный и корректно работающий lighttpd. Уже сконфигуренные замечательные приблуды типа ados, морды rtorrent, rrdtool, vnstat и т.д. ("ку" 3 раза их создателям и людям, написавшим мануалы по их установке) процессу не мешают и впоследствии совершенно замечательно работают под новой конфигурацией.

1. Устанавливаем openssl
Code:
ipkg install openssl
2. Создаем каталог, где будет храниться всё, имеющее отношение к ssl.
Code:
mkdir /opt/etc/lighttpd/ssl
3. Копируем текущий конфигурационный файл lighttpd.
Code:
cp /opt/etc/lighttpd/lighttpd.conf /opt/etc/lighttpd/lighttpd_ssl.conf
4. Редактируем новый файл lighttpd_ssl.conf
- в разделе server.modules раскомментируем записи о mod_access, mod_cgi и mod_accesslog;
- в разделе server.port меняем порт на 443;
- раскомментируем раздел cgi.assign. У меня уже был установлен perl, посему просто прописал корректные пути к бинарнику
Code:
cgi.assign                 = ( ".pl"  => "/opt/bin/perl",
                               ".cgi" => "/opt/bin/perl" )
Коллеги рекомендуют вместо /opt/bin/perl прописать /bin/sh. Наверное, чтобы не ставить perl, но у меня он уже был установлен, так что оставил как есть.
- раскомментируем всю секцию SSL engine. В качестве путей вписываем пути до файлов сертификатов сервера, которые нам еще предстоит создать ниже, в пунктах 7 и 8.

Code:
#### SSL engine
ssl.engine                 = "enable"
ssl.pemfile                = "/opt/etc/lighttpd/ssl/lighttpd.pem"
ssl.ca-file                = "/opt/etc/lighttpd/ssl/lighttpd.crt"
ssl.verifyclient.activate  = "enable"
ssl.verifyclient.enforce   = "enable"
ssl.verifyclient.depth     = 1
5. Идем в каталог ssl и начинаем шаманить.

Code:
cd /opt/etc/lighttpd/ssl
touch index.txt
echo '01' > serial
touch ca.cfg
6. Редактируем файл ca.cfg до подобного содержания

Code:
[ ca ]
default_ca = CA_CLIENT
[ CA_CLIENT ]
dir                            =   /opt/etc/lighttpd/ssl
certs                          =   $dir
new_certs_dir                  =   $dir
database                       =   $dir/index.txt
serial                         =   $dir/serial
certificate                    =   $dir/lighttpd.crt
private_key                    =   $dir/lighttpd.key
default_days                   =   3650
default_crl_days               =   3
default_md                     =   md5
policy                         =   policy_anything
[ policy_anything ]
countryName                    = optional
stateOrProvinceName            = optional
localityName             =   optional
organizationName         =   optional
organizationalUnitName   =   optional
commonName               =   supplied
emailAddress             =   optional
7. Cоздаем сертификат для сервера. В процессе спросит свойства ключа, заполнять по желанию. Единственное замечание - в поле common name желательно прописать FQDN рутера, например ваш dyndns-аккаунт, если конечно вы это используете.

Code:
openssl req -newkey rsa:2048 -nodes -keyout lighttpd.key -x509 -days 3650 -out lighttpd.crt

Generating a 2048 bit RSA private key
.................+++
.+++
writing new private key to 'lighttpd.key'
-----
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]:Russia
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:user.dyndns.org
Email Address []:
[user@/opt/etc/lighttpd/ssl ]$
8. Создаем pem-файл для сервера.

Code:
cat lighttpd.key lighttpd.crt > lighttpd.pem
9. Создаем клиентский сертификат. В процессе аналогично интересуются про страну, имя и т.д. как в пункте 8. На вопросы

Code:
A challenge password []:
An optional company name []:
просто нажимаем Enter.

Code:
openssl req -new -newkey rsa:2048 -nodes -keyout user.key -out user.csr
10. Подписываем и конвертируем клиентский сертификат. Вместо 12345 в нижеследующем коде пишем пароль для защиты сертификата, который у вас запросят при импортировании сертификата в браузер.

Code:
openssl ca -config ca.cfg -in user.csr -out user.crt -batch
openssl pkcs12 -export -in user.crt -inkey user.key -certfile lighttpd.crt -out user.p12 -passout pass:12345
11. Через Самбу, ftp или флешку, у кого чего, копируем файл /opt/etc/lighttpd/ssl/user.p12 с роутера на клиентскую машину и импортируем в броузер.

12. Останавливаем lighttpd

Code:
/opt/etc/init.d/S80lighttpd stop
13. Редактируем скрипт запуска lighttpd для старта с новым конфигурационным файлом. Изменяем следующую строчку в файле /opt/etc/init.d/S80lighttpd. Если чего-то пойдет не так, всегда можно вернутся к предыдущему конфигу.

Code:
DAEMON_OPTS="-f ${prefix}/etc/lighttpd/lighttpd_ssl.conf"
14. Разрешаем на файрволе доступ по https. Для этого редактируем файл /usr/local/sbin/post-firewall и заносим туда строчку

Code:
iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT
15. Как всегда на всякий пожарный

Code:
flashfs save && flashfs commit && flashfs enable
reboot
16. Заходим на роутер уже через https. При входе, в зависимости от браузера, будет ругаться на неизвестный самоподписанный сертификат, тем не менее все работает замечательно. Можно, правда, вытащить сертификат сервера и импортировать его как доверенный, тогда и ругаться не будет. Может попозже допишу такой вариант.