понедельник, 12 марта 2018 г.

OpenWrt ❤ LetsEncrypt

Будем получать валидные https сертификаты по мотивам репозитария, вики и бага.

Зачем это вам

Cказ о том, как я мучился несколько часов и финальный рецепт как это все завести. Без обезболивающего прям не обойтись было.
Не повторяйте моих ошибок и сразу же ставьте новый snapshot если видите в консоли `Error loading shared library libmbedcrypto.so.1: No such file or directory (needed by /usr/bin/curl)`

prerequisites

берем и ставим ;`opkg update ; opkg install ca-certificates uhttpd-mod-tls openssl-util socat`

иногда работает

Вообще раньше было необходимо делать так
mkdir /www/le_root/
curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh > acme.sh
chmod a+x acme.sh
./acme.sh --install --accountemail  "andmin@box.now.im"
DOMAIN=box.now.io
cd /root/.acme.sh
./acme.sh --issue  -d $DOMAIN -w /www --debug
и тогда в браузере должен возвращаться токен Letsencrypt по адресу `echo $DOMAIN/.well-known/acme-challenge/` и можно подкладывать новые сертификаты для веб-сервера
проблема в том, что когда делаем
uci set uhttpd.main.key="$(pwd)/$DOMAIN/$DOMAIN.key"
uci set uhttpd.main.cert="$(pwd)/$DOMAIN/$DOMAIN.cert"
uci commit uhttpd
cat /etc/config/uhttpd
/etc/init.d/uhttpd restart
то uhttpd вызывается модуль px5g котрый заново перегенерит сертификаты. Ну то есть что выпускали мы их, что не выпускали - один хер, самоподписанные будут стоять.

стабильный workaround

ставим приложку и обновляем ее
opkg install acme luci-app-acme
curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh > /usr/lib/acme/acme.sh
потом идем в веб-интерфейс http://nethead.lan/cgi-bin/luci/admin/services/acme правим раздел `Certificate config`

key value
Webroot directory /www
Domain names box.now.io

на файлухе это будет иметь отражение в `/etc/config/acme` в следующем виде
config acme
    option state_dir '/etc/acme'
    option account_email 'andmin@box.now.im'
    option debug '1'

config cert 'example'
    option keylength '2048'
    option update_uhttpd '1'
    option enabled '1'
    option webroot '/www'
    list domains 'box.now.io'
    option use_staging '0'

а на вкладке http://nethead.lan/cgi-bin/luci/admin/services/uhttpd `General Settings`
key value
HTTPS Certificate (DER Encoded) /etc/acme/box.now.io/box.now.io.cer
HTTPS Private Key (DER Encoded) /etc/acme/box.now.io/box.now.io.key

вообще вот мой полный листинг `/etc/config/`
config uhttpd 'main'
    list listen_http '0.0.0.0:80'
    list listen_http '[::]:88'
    list listen_https '0.0.0.0:443'
    list listen_https '[::]:443'
    option home '/www'
    option rfc1918_filter '0'
    option max_requests '3'
    option max_connections '100'
    option cgi_prefix '/cgi-bin'
    option script_timeout '60'
    option network_timeout '30'
    option http_keepalive '20'
    option tcp_keepalive '1'
    option ubus_prefix '/ubus'
    option redirect_https '0'
    option key '/etc/acme/box.now.io/box.now.io.key'
    option cert '/etc/acme/box.now.io/box.now.io.cer'

что бы халва не закончилась

занесем задачу в крон на обновление `5 18 * */2 4 /bin/sh /etc/init.d/acme start`