Веб-сервер с SSL защитой A+ класса

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Александр Рыжов
Сообщения: 330
Зарегистрирован: 12 авг 2015, 13:14
Откуда: Смоленск

Сообщение Александр Рыжов » 22 фев 2016, 23:06

Инструкция ниже позволяет сконфигурировать веб-сервер nginx и установить SSL-сертификат Let's Encrypt прямо на роутере.
Изображение
До начала работы необходимо:

  • Доменное имя, которое разрешается в белый IP-адрес вашего роутера с Entware, в примере ниже используется my.domain.ru.
  • Разрешить на роутере входящие соединения TCP80 и TCP443.

1. Установите необходимые пакеты:

Код: Выделить всё

bash ca-certificates coreutils-mktemp curl grep nginx openssl-util

2. Скачайте bash-скрипт для автоматического получения сертификата Let's Encrypt:

Код: Выделить всё

cd /opt/etc/nginx
curl -O https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh

3. Отредактируйте в файле /opt/etc/nginx/nginx.conf следующие строчки:
  • в секции server:

    Код: Выделить всё

    server_name  "my.domain.ru";
  • в секции location:

    Код: Выделить всё

    root   /opt/share/nginx/html;
4. Запустите веб-сервер, после чего убедитесь, что он доступен из интернета по адресу http://my.domain.ru.

Код: Выделить всё

/opt/etc/init.d/S80nginx start

5. Подготовьте папку, с помощью которой сервис Let's Encrypt проверит то, что веб-сервер принадлежит вам:

Код: Выделить всё

echo WELLKNOWN="/opt/share/nginx/html/.well-known/acme-challenge" > config.sh
mkdir -p /opt/share/nginx/html/.well-known/acme-challenge

6. Запустите скрипт получения SSL-сертификата:

Код: Выделить всё

bash ./letsencrypt.sh --domain my.domain.ru --cron
Если всё прошло как надо, то скрипт сообщит вам примерно следующее

Код: Выделить всё

/opt/etc/nginx # bash ./letsencrypt.sh --domain my.domain.ru --cron
# INFO: Using main config file /opt/etc/nginx/config.sh
Processing my.domain.ru
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for my.domain.ru...
 + Responding to challenge for my.domain.ru...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
Свернуть

7. Для получения оценки A+ от SSL Labs необходимо выполнить процедуру, которая занимает от пяти минут (на относительно мощном Asus RT-N66U) до часа и больше (на относительно дохлом ZyXEL Keenetic Omni II). Если есть под рукой Linux ПК, то эту команду можно выполнить на ПК и перенести готовый файл dhparams.pem на роутер:

Код: Выделить всё

openssl dhparam -out dhparams.pem 2048

8. Отредактируйте /opt/etc/nginx/nginx.conf для того, чтобы сервер стал принимать HTTPS-соединения, в секцию server добавьте строки:

Код: Выделить всё

listen 443 ssl;
include ssl.conf;

а в /opt/etc/nginx/ssl.conf поместите следующее содержимое:
ssl.conf

Код: Выделить всё

ssl_certificate /opt/etc/nginx/certs/my.domain.ru/fullchain.pem;
ssl_certificate_key /opt/etc/nginx/certs/my.domain.ru/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /opt/etc/nginx/dhparams.pem;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
#ssl_stapling on;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
Свернуть
Финальный вид nginx.conf

Код: Выделить всё

user  nobody;
worker_processes  1;

#error_log  /opt/var/log/nginx/error.log;
#error_log  /opt/var/log/nginx/error.log  notice;
#error_log  /opt/var/log/nginx/error.log  info;

events {
    worker_connections  64;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /opt/var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        listen 443 ssl;
        server_name  my.domain.ru;
        include ssl.conf;
        #charset koi8-r;

        #access_log  /opt/var/log/nginx/host.access.log;

        location / {
            root   /opt/share/nginx/html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
Свернуть

9. Перезапустите веб-сервер, чтобы настройки вступили в силу и проверьте доступность https://my.domain.ru из интернета:

Код: Выделить всё

/opt/etc/init.d/S80nginx restart

Всё!

Аватара пользователя
Александр Рыжов
Сообщения: 330
Зарегистрирован: 12 авг 2015, 13:14
Откуда: Смоленск

Сообщение Александр Рыжов » 22 фев 2016, 23:07

Сертификат Let's Encrypt имеет срок действия три месяца, поэтому для его своевременного обновления проще пользоваться cron'ом:

Код: Выделить всё

opkg install cron

Создайте файл /opt/etc/cron.monthly/renew_certs.sh и поместите в него следующее содержимое:

Код: Выделить всё

#!/bin/sh
cd /opt/etc/nginx
bash ./letsencrypt.sh --domain my.domain.ru --cron
nginx -s reload

Сделайте файл исполняемым:

Код: Выделить всё

chmod +x /opt/etc/cron.monthly/renew_certs.sh

И не забудьте cron запустить:

Код: Выделить всё

/opt/etc/init.d/S10cron

Yrzorg
Сообщения: 68
Зарегистрирован: 05 окт 2015, 12:23

Сообщение Yrzorg » 02 мар 2016, 10:41

А как можно добавить сертификат от StartSSL?
они выдают его для nginx в виде "1_mydomen.net_bundle.crt"
Keenetic Ultra II+Entware
padavan 3.4.3.9-099

Аватара пользователя
Александр Рыжов
Сообщения: 330
Зарегистрирован: 12 авг 2015, 13:14
Откуда: Смоленск

Сообщение Александр Рыжов » 02 мар 2016, 10:59

Yrzorg, ответ есть прямо на сайте StartSSL. Гуглится по словам "StartSSL nginx", первая ссылка. Почему ленитесь?

Drusja
Сообщения: 1
Зарегистрирован: 11 июн 2016, 13:51

Сообщение Drusja » 13 июл 2016, 00:11

Немножко дополню по проблеме с которой сам столкнулся на Keenetic Giga III:

В зависимости от версии BusyBox маршрутизатора, есть проблема с командой tr, которую в новых версиях исправили. Связана с буквой 'u' в нижнем регистре и ее неправильной заменой буквой "L", и заглавной буквой 'U' которая игнорируется при выполнении uppercase->lowercase replacements.

В качестве временного решения, если у вас есть домен с буквой U/u , вы можете изменить следующую строку в letsencrypt.sh - а затем обязательно использовать все строчные буквы в домене.

Измените строку 627 (номер может отличатся) в letsencrypt.sh

С существующей:

Код: Выделить всё

   for line in $(<"${DOMAINS_TXT}" tr -d '\r' | tr '[:upper:]' '[:lower:]' | _sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*$//g' -e 's/[[:space:]]+/ /g' | (grep -vE '^(#|$)' || true)); do


на:

Код: Выделить всё

  for line in $(<"${DOMAINS_TXT}" tr -d '\r' | _sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*$//g' -e 's/[[:space:]]+/ /g' | (grep -vE '^(#|$)' || true)); do


Источник https://translate.googleusercontent.com/translate_c?anno=2&depth=1&hl=ru&rurl=translate.google.com&sl=en&tl=ru&u=https://github.com/Entware-ng/Entware-ng/wiki/Using-Let%27s-Encrypt&usg=ALkJrhie2-FPVUV3cmgougzKWtJ5K1nk8Q

Khaninea
Сообщения: 1
Зарегистрирован: 04 июл 2016, 13:26

Сообщение Khaninea » 18 июл 2016, 17:41

В этой теме не полное описание процедур получения сертификата. Дополнительно могу рекомендовать ознакомится с постом habrahabr.ru/post/304174/

SuperPuperSteve
Сообщения: 2
Зарегистрирован: 24 янв 2017, 22:07

Сообщение SuperPuperSteve » 25 янв 2017, 16:20


404: Not Found

Аватара пользователя
Александр Рыжов
Сообщения: 330
Зарегистрирован: 12 авг 2015, 13:14
Откуда: Смоленск

Сообщение Александр Рыжов » 25 янв 2017, 17:09

SuperPuperSteve, что поделать. Инструкции актуальны на момент их публикации.

SuperPuperSteve
Сообщения: 2
Зарегистрирован: 24 янв 2017, 22:07

Сообщение SuperPuperSteve » 25 янв 2017, 23:06

Александр Рыжов писал(а):Источник цитаты SuperPuperSteve, что поделать. Инструкции актуальны на момент их публикации.

ну и щито теперь делать?

Аватара пользователя
Александр Рыжов
Сообщения: 330
Зарегистрирован: 12 авг 2015, 13:14
Откуда: Смоленск

Сообщение Александр Рыжов » 26 янв 2017, 08:36

SuperPuperSteve, смотреть что изменилось и будет ли это работать на роутере без правок.


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 2 посетителя :: 0 зарегистрированных, 0 скрытых и 2 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя