OpenVPN の Access Server のAPIを使って設定を書き換えようと思ったが、APIを探し出したり、管理コマンドをSSH経由で実行するのもめんどくさい。
curl でwebUIを叩いてみることにした。
WEB画面のSSL証明書を更新する例。
DOMAIN=ovpn.example.tld CERT_PATH=/tmp/${DOMAIN}.crt.pem PKEY_PATH=/tmp/${DOMAIN}.privkey.pem OVPN_AS_SITE=192.168.2.147:943 OVPN_AS_USER=takuya OVPN_AS_PASS=takuya COOKIE=/tmp/ovpn-as.cookie function cleanup() { echo -n 'clean up ..' [ -e ${COOKIE} ] && rm ${COOKIE}; echo 'done.' } function update_cert_ovpn_as(){ [ ! -e $CERT_PATH ] && exit 1 [ ! -e $PKEY_PATH ] && exit 1 ## ログインして echo -n 'login to openvpn as ..' curl -ksL -c ${COOKIE} -b ${COOKIE} https://${OVPN_AS_SITE}/admin/ > /dev/null curl -ksL -c ${COOKIE} -b ${COOKIE} \ -d username=${OVPN_AS_USER} -d password=${OVPN_AS_PASS} \ https://${OVPN_AS_SITE}/admin/__login__ > /dev/null echo 'done' ## フォームIDを取り出して echo -n 'get form key ..' POST_ID=$(curl -ksL -c ${COOKIE} -b ${COOKIE} \ https://${OVPN_AS_SITE}/admin/web_server | \ grep -oP '(?<=name="post_id" type="hidden" value=").+(?=" />)' ) echo 'done' echo POST_ID=$POST_ID ## 証明書を更新して echo -n 'post cert pkey ..' curl -kvL -c ${COOKIE} -b ${COOKIE} \ -F cert_option=user_provided \ -F domain='' \ -F email='' \ -F cs.ca_bundle='' \ -F cs.cert=@${CERT_PATH}\ -F cs.priv_key=@${PKEY_PATH} \ -F button='Save Settings' \ -F post_id="${POST_ID}" \ https://${OVPN_AS_SITE}/admin/web_server > /dev/null echo 'done' ## 再起動 echo -n 'request restart ..' curl -ksL -c ${COOKIE} -b ${COOKIE} \ -F button='Update Running Server' \ -F cert_option=user_provided \ -F domain='' \ -F email='' \ -F cs.ca_bundle='' \ -F cs.cert='' \ -F cs.priv_key='' \ -F post_id="${POST_ID}" \ https://${OVPN_AS_SITE}/admin/web_server > /dev/null echo 'done' } update_cert_ovpn_as; cleanup;
WEB画面があれば、APIが分からなくても、curl でサクッとスクレイピングできて便利ですね。
cookieとリダイレクトを扱う。
コツとしては、次の箇所。
curl -ksL -c ${COOKIE} -b ${COOKIE} $URL
発行されるCookieを保存しつつ、リクエストにつかう。これでリクエストのセッションが維持できる
CSRF キーを取り出す
POST_ID=$(curl -ksL -c ${COOKIE} -b ${COOKIE} \ https://${OVPN_AS_SITE}/admin/web_server | \ grep -oP '(?<=name="post_id" type="hidden" value=").+(?=" />)' )
WEBフォームにはCSRFトークンがついているので、CSRFトークンを取り出してリクエストに使う。
上記のコツを覚えておく
上記のコツを覚えておけば、あとはChromeの開発ツールでリクエストパラメタを見ていればWEB管理画面程度であればリクエストを発行して更新できて便利。