Задача
Как сконфигурировать и получить SSL сертификат для сайта A+ в роутере при помощи Let's Encrypt.
Требования
Необходимо иметь зарегистрированное доменное имя, например, mydomen.pp и открытые порты на роутере 80 и 443.
Установка
Первоначально устанавливаем
opkg install ca-certificates curl nginx openssl-util php7 php7-cli
Далее
cd /opt/etc/nginx и скачиваем < a href="https://curl.haxx.se/docs/caextract.html" target="_blank"> cacert.pem.
Устанавливаем
curl --cacert cacert.pem -O https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrated
При 60 ошибке curl необходимо установить путь к сертификату cacert.pem в файле /opt/etc/php.ini, вида
curl.cainfo = "/opt/etc/nginx/certs/cacert.pem"
Далее
mkdir -p /opt/share/nginx/html/.well-known/acme-challenge
и создаем файл config, который содержит
echo WELLKNOWN="/opt/share/nginx/html/.well-known/acme-challenge" > config
# Размер для приватных ключей
echo KEYSIZE="2048" >> config
# Каталог для расположения ключей
echo CERTDIR="${BASEDIR}/certs" >> config
# Путь к сертификатам cacert.pem
echo CURL_OPTS="--cacert cacert.pem" >> config
# Ваш контактный email
echo CONTACT_EMAIL=123456789@gmail.com >> config
Создаем файл с именами Вашего домена
echo mydomen.pp www.mydomen.pp > domains.txt
Далее
nginx -s reload
chmod +x dehydrated
# регистрация
./dehydrated --register --accept-terms
# генерация ключей
./dehydrated -c
Если все верно, то сертификаты будут находится в каталоге /opt/etc/nginx/certs.
Дальше сгенерируем ключ Diffie-Hellman (это достаточно длительная процедура)
openssl dhparam -out dhparams.pem 2048
И отредактируем файлы nginx.conf и default.
nginx.conf
…
include default;
}
default
# путь с сертификатам
ssl_dhparam /opt/etc/nginx/dhparam.pem;
ssl_certificate /opt/etc/nginx/certs/MYDOMEN.PP/fullchain.pem;
ssl_certificate_key /opt/etc/nginx/certs/MYDOMEN.PP/privkey.pem;
server {
# Ваше имя сервера
server_name MYDOMEN.PP;
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AES128:EECDH+AES256:EECDH+3DES:RSA+AES128:RSA+AES256:RSA+3DES:!MD5;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
resolver 8.8.8.8;
add_header X-Xss-Protection "1";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
root /opt/share/nginx/html;
index index.php;
location / {
try_files $uri $uri/ /index.php$args;
}
…
}
Перегружаем nginx
/opt/etc/init.d/S80nginx restart
Настройка для обновления сертификатов
По умолчанию сертификаты Let's Encrypt действительны 3 месяца. Для автоматического продления сертификатов настроим выполнение запроса через cron для обновления сертификатов, например, раз в месяц.
Создадим файл dehyd с содержимым
#!/bin/sh
cd /opt/etc/nginx
./dehydrated -c
/opt/etc/init.d/S80nginx reload
И запишем задание в cron роутера, например,
0 0 1 * * root /jffs/sr/dehyd
где /jffs/sr/dehydrated — путь нахождения файла.
Проверка настроек
Проверка корректности цепочки сертификатов SSL Server Test .
Полезные ссылки
- Let's encrypt project - Let's Encrypt
- Quality SSL labs - SSL labs