それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

adguard home のAPIを叩いて証明書設定を更新する-curl + jq

adguard home の証明書をAPI経由で書き換えたい。

adguard home のAPIcURL で叩いたら、更新ができる。

cURL で adguard-home のOpenAPIを叩く

Basic認証で、通せばいいので、そんなに難しくなく、簡単にAPIを叩くことができる。

adg_pass=___password___
adg_user=__user__
curl -s -X GET -u $adg_user:$adg_pass http://192.168.1.1/control/status

証明書を更新する。

adguard home に certbot の設定をすべて書くと、HTTPの80番や、DNSチャレンジのDNSサーバーのパスワードをAdguardに渡さなくちゃいけなくて管理が煩雑になる。

certbot で letsencrypt 証明書を更新するためだけのLXCのコンテナを用意しているので、そこでまとめて更新して、証明書だけを同期するようにしたい。 SSHでもって行ってもいいのだけれど、せっかくなのでAPIをたたいて更新することにする。

#!/usr/bin/env bash

adg_pass=xxx_password_xxx
adg_user=admin
adg_domain=adg-home.example.com
adg_local_ip=192.168.1.2

function adg_api(){
  path=$1
  data=$2
  if [[ ! -z $data ]] ; then
    curl -s -X POST -u $adg_user:$adg_pass http://$adg_local_ip/control$path -d "$data"
  else
    curl -s -X GET -u $adg_user:$adg_pass http://$adg_local_ip/control$path
  fi

}
function update_cert_and_key(){
  key=$(base64 -w0 /etc/letsencrypt/live/$adg_domain/privkey.pem )
  cert=$(base64 -w0 /etc/letsencrypt/live/$adg_domain/fullchain.pem )

  data=$(printf '{                   
    "port_https":         443,
    "port_dns_over_tls":  853,
    "port_dns_over_quic": 784,
    "enabled": true,          
    "key_type": "RSA",
    "private_key": "%s",        
    "certificate_chain": "%s"
  }' "$key" "$cert")
  adg_api '/tls/configure'  "$data" > /dev/null
}


adg_api '/status' | jq .version
update_cert_and_key
adg_api '/tls/status' | jq .valid_key

証明書が有効になった。

f:id:takuya_1st:20220323145737p:plain

証明書を入れるとDoH/DoTができて嬉しい。

 curl -v  --doh-url https://adg.example.com/dns-query t.co

DoHサーバーの出来上がりである。DoHサーバーを入手を目的にAdguard Home をインストールするのもアリだと思うんだよなぁ。

DoT / DoH ができるよにしておくと、Chromeで使える

chrome で DoH 設定例

DoHをChromeに設定してしまえば、DNSサーバーが虚偽応答をするネットワーク内部にいてもHTTPSなので、暗号化通信を邪魔されることなくDNSの名前解決が可能になる。

f:id:takuya_1st:20220323150153p:plain

HTTPSルート証明書を端末インストールして内容チェックまでする人は少ないと思うので。自由なインターネットが確保できます。