Як позбутися попереджень HTTPS-сертифіката в LuCI
Вам подобається безпечне з’єднання через LuCI-SSL (або LuCI-SSL-OpenSSL), але дратують попередження браузера про “небезпечне з’єднання”?
Це можна виправити:
- Встановити довірений сертифікат, наприклад від Let's Encrypt, який автоматично розпізнається сучасними браузерами
- Або згенерувати самопідписаний сертифікат і вручну повідомити свої пристрої, щоб вони довіряли йому
Варіант A: Автоматичний безкоштовний сертифікат HTTPS від Let's Encrypt
Цей варіант працює лише якщо ваш роутер доступний з Інтернету. Детальна інструкція: Отримання безкоштовного сертифіката HTTPS з Let's Encrypt для OpenWrt через ACME.sh
Варіант B: Встановлення довіреного сертифіката
Інструкції перевірено для (wildcard) сертифіката Let's Encrypt, але підійдуть і для будь-якого сертифіката, підписаного офіційним CA.
Передумови:
- Ви маєте публічне доменне ім’я (наприклад, `example.com`)
- Ви налаштували DNS або файл `/etc/hosts`, щоб домен (наприклад `openwrt.example.com`) вказував на IP-адресу OpenWrt.
(наприклад: `192.168.0.1 openwrt.example.com`)
- У вас є сертифікат і приватний ключ для домену або піддомену, що вказує на OpenWrt
- Ви маєте доступ по SSH до OpenWrt (наприклад, через `ssh openwrt`)
Процес:
1. Перетворіть сертифікат у формат PEM, сумісний з LuCI/uHTTPd 2. Помістіть його у правильне місце на OpenWrt 3. Перезапустіть `uhttpd`
Розміщення PEM-файлів у правильному місці
Сертифікати мають бути у PEM-форматі. Можна використовувати один “inline” файл або два окремі.
Розмістіть файли за адресами:
- `/etc/uhttpd.key` — приватний ключ
- `/etc/uhttpd.crt` — сертифікат
Рекомендовано спершу створити резервні копії:
cp /etc/uhttpd.key /etc/uhttpd.key.bak cp /etc/uhttpd.crt /etc/uhttpd.crt.bak
Або змініть розташування в налаштуваннях `/etc/config/uhttpd`, вказавши інші шляхи в `option key` і `option cert`.
Файли можна скопіювати через `rsync`:
rsync /tmp/uhttpd.key openwrt:/etc/uhttpd.key rsync /tmp/uhttpd.crt openwrt:/etc/uhttpd.crt
або за допомогою `scp`, або простим `cp`, якщо ви працюєте безпосередньо на OpenWrt.
Активуйте сертифікат
Перезапустіть вебсервер:
ssh openwrt "/etc/init.d/uhttpd restart"
Тепер при переході на `https://openwrt.example.com` з’єднання має бути автоматично довірене.
✅ Ви можете автоматизувати цей процес у вигляді скрипта, який буде оновлювати сертифікат, не заходячи на OpenWrt вручну.
Варіант C: Створення, встановлення і довіра до самопідписаного сертифіката
Якщо ви хочете створити самопідписаний сертифікат, який браузер сприйматиме як довірений — це також можливо.
⚠️ Але є нюанс: починаючи з Chrome 58, браузери перевіряють не лише CN (Common Name), але й SAN (Subject Alternative Name) — тобто DNS-ім’я в сертифікаті.
Якщо у вас був старий сертифікат, який раніше працював, він міг перестати працювати після автоматичного оновлення Chrome.
Щоб позбутися попереджень на кшталт “Це небезпечне з’єднання”, потрібно зробити правильний сертифікат із SAN.
Створення та встановлення сертифіката
- Підключіться до пристрою через SSH.
- Встановіть пакети openssl-util та luci-app-uhttpd. Вони потрібні для створення нового сертифіката та простого налаштування LuCI для його використання: \\
opkg update && opkg install openssl-util luci-app-uhttpd
- Створіть файл
/etc/ssl/myconfig.confз наступним вмістом:
- myconfig.conf
[req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no string_mask = utf8only [req_distinguished_name] C = US ST = VA L = SomeCity O = OpenWrt OU = Home Router CN = luci.openwrt [v3_req] keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names basicConstraints = CA:true [alt_names] DNS.1 = luci.openwrt IP.1 = 192.168.1.1
- Ви можете змінити значення для C (країна), ST (штат/область), L (місто), O (організація), OU (підрозділ) на свої власні.
- Дуже важливо, щоб значення CN і DNS.1 збігалися, а також щоб IP.1 відповідав фактичній локальній IP-адресі вашого пристрою.
- Якщо у вас інша IP-адреса або ви використовуєте ім’я хоста, вкажіть його у полях CN і DNS.1, а IP у IP.1.
- Збережіть файл і перейдіть у каталог
/etc/ssl:cd /etc/ssl
- Виконайте команду для створення сертифіката RSA:
openssl req -x509 -nodes -days 397 -newkey rsa:2048 -keyout mycert.key -out mycert.crt -config myconfig.conf
Або для створення сертифіката ECDSA (швидше встановлюється TLS-з’єднання):
openssl req -x509 -nodes -days 397 -newkey ec:<(openssl ecparam -name prime256v1) -keyout mycert.key -out mycert.crt -config myconfig.conf
Термін дії сертифіката — 397 днів (~13 місяців). Після цього потрібно створити новий. Більшість браузерів не приймають сертифікати з тривалістю більше 13 місяців: https://github.com/cabforum/servercert/blob/90a98dc7c1131eaab01af411968aa7330d315b9b/docs/BR.md?plain=1#L175
- У LuCI перейдіть у Services → uHTTPd:
- У полі HTTPS Certificate вкажіть файл
/etc/ssl/mycert.crtабо натисніть Upload file, щоб завантажити його з комп’ютера. - У полі HTTPS Private Key вкажіть файл
/etc/ssl/mycert.keyабо завантажте його вручну. - Натисніть Save and Apply.
- Перезапустіть вебсервер uHTTPd:
/etc/init.d/uhttpd restart
- Щоб ці два файли включалися у резервну копію системи, в LuCI перейдіть у System → Backup/Flash Firmware, відкрийте вкладку Configuration, і додайте
/etc/ssl/mycert.crtта/etc/ssl/mycert.key- Ці сертифікати буде автоматично збережено і відновлено з резервної копії. Налаштування з LuCI → Services → uHTTPd також буде збережено, оскільки файл /etc/config/uhttpd входить до резервної копії за замовчуванням.
- Завершіть налаштування натисканням Submit або Save and Apply (залежить від теми LuCI).
Ланцюжок довіри (Chain of trust)
- Тепер потрібно змусити ваш комп’ютер довіряти сертифікату. Це забезпечить коректну роботу у всіх браузерах (IE, Edge, Firefox тощо). Вам потрібно витягнути файл сертифіката
/etc/ssl/mycert.crtз роутера. Якщо ви виконували попередні інструкції, найпростіший спосіб — натиснути Generate archive у LuCI → System → Backup / Flash Firmware та витягти сертифікат із архіву. Також можна використати SCP. - Альтернативно, можна використати Google Chrome. Якщо ви ним не користуєтесь — тимчасово встановіть.
- Перезавантажте сторінку LuCI (наприклад, http://192.168.1.1) у Chrome після перезапуску uhttpd. Ігноруйте попередження, відкрийте хоча б екран входу.
- Натисніть F12, перейдіть на вкладку Security, натисніть View certificate, відкрийте вкладку Details, натисніть Copy to file, кілька разів Next, виберіть шлях збереження (назву задайте будь-яку). Після збереження закрийте обидва вікна.
Далі дії залежать від вашої операційної системи:
Windows (для старих версій Chrome)
- У Chrome відкрийте Settings → Advanced → Manage certificates.
- Перейдіть на вкладку Trusted Root Certification Authorities і натисніть Import.
- Знайдіть збережений сертифікат, далі просто натискайте Next. Переконайтесь, що буде використано правильне сховище сертифікатів.
- Закрийте усі вікна, перезапустіть браузери. Після цього доступ до LuCI буде вважатися безпечним.
Windows (скрипт)
- Поверніться до каталогу сертифіката:
cd /etc/ssl
- Експортуйте сертифікат у формат PFX:
openssl pkcs12 -export -out mycert.pfx -inkey mycert.key -in mycert.crt
- Введіть пароль 1234.
- Завантажте файл mycert.pfx на ПК (наприклад, через WinSCP).
- Виконайте наступний PowerShell-скрипт із правами адміністратора в каталозі з файлом:
$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText Import-pfxCertificate -FilePath mycert.pfx -Password $mypwd -CertStoreLocation "Cert:\LocalMachine\Root"
- Це додасть сертифікат до системного сховища.
- IE, Edge та Chrome використовуватимуть його автоматично.
- Для Firefox або додайте вручну до довірених сертифікатів, або в about:config встановіть `security.enterprise_roots.enabled` → true.
GNU/Linux
- Для Firefox достатньо просто додати виняток для сертифіката при відкритті LuCI.
- Для браузерів на базі Chrome потрібно встановити пакет libnss3-tools, якщо у вас немає certutil. Наприклад:
apt-get install libnss3-tools
- Додайте сертифікат до бази NSS для поточного користувача:
certutil -d sql:$HOME/.pki/nssdb -A -t "CT,C,c" -n LuCI -i mycert.crt
- Перезапустіть браузер. Помилки сертифіката при доступі до LuCI повинні зникнути.
- Увага: у Chrome іноді виникає помилка, яку неможливо обійти — [форумна тема](https://forum.openwrt.org/t/https-connection-to-luci-is-discarded/123904/30), [GitHub-issue](https://github.com/openwrt/luci/issues/6701).
Насолоджуйтесь безпечним з’єднанням!
Усі подяки за створення частини C цього посібника йдуть до @StarCMS, який опублікував його в темі @Davidc502 на форумі. Невеликі правки та форматування для wiki — @mariano.silva (mariano.silva@gmail.com).
Варіант D: Дозвольте OpenWrt створити самопідписаний сертифікат
Це було протестовано на OpenWrt 23.05, і не гарантовано працює у старіших версіях. Крім того, якщо створення відбулося до цього pull request: https://github.com/openwrt/openwrt/pull/1536 — сертифікат може не містити коректного subjectAltName.
OpenWrt автоматично створить новий самопідписаний сертифікат при завантаженні, якщо поточний буде видалено. Для цього відкрийте термінал SSH до маршрутизатора та виконайте:
rm -i /etc/uhttpd.*
Підтвердіть видалення файлів uhttpd.crt та uhttpd.key, потім перезапустіть вебсервер:
service uhttpd restart
Ви можете встановити luci-app-uhttpd, щоб отримати більше контролю над параметрами нового сертифіката. Інакше ви не зможете задати правильний subjectAltName, і браузер вимагатиме підтвердження безпеки. Якщо ви його задали — слідуйте інструкціям з Варіанту C, щоб встановити сертифікат на свій ПК.