XigmaNASのサーバ証明書を入れ替えたところ管理画面に接続できなくなったので原因を調べてみました.サーバ証明書としてLet’s Encryptの証明書をつかっているのですが,どうもfullchainをつかうと駄目のようです.
そのときおこなったリカバリの手順は以下のとおりです.
- sshで接続する.
- サーバ証明書と秘密鍵を正しいものにいれかえる.(/var/etc/webguicert.pem,/var/etc/webguipriv.pem)
- lighttpd -f /var/etc/lighttpd.confでhttpサーバを起動(ここで/etc/rc.d/lighthttpを利用すると証明書が書き換わるので注意)
- ブラウザでログインして,GUIで証明書の更新を行う.
- 再起動して再度ログインできればOK
証明書の格納場所
lighttpdの定義体は/var/etc/lighttpd.confにありその中に証明書関連の定義がされています.
ssl.pemfile = "/var/etc/webguicert.pem"
ssl.privkey = "/var/etc/webguipriv.pem"
XigmaNASの動作中の証明書の置き場所は上記のとおりなのですが,このファイルを書き換えても再起動すると元に戻ってしまいます./etc/rc.d/lighttpdの中に,
_certificate=$( configxml_get //system/webgui/certificate )
_privatekey=$( configxml_get //system/webgui/privatekey )
という行がありました.ここで取得(このあと再設定)しているようです.このconfigxml_getはこのファイルの中には定義されていませんので最初の
. /etc/rc.subr
. /etc/util.subr
. /etc/configxml.subr
あたりのファイルを見ると/etc/configxml.subrの中に関数が定義されていました.
# configxml_get xpath
# Get xpath from /conf/config.xml.
# Return 0 if successful, nonzero otherwise. Return result from query is echoed.
# $1 - XPATH expression
configxml_get()
{
local _queryresult _result
debug "configxml_get: xpath=<$1>"
# Get requested xpath
_queryresult=`/usr/local/bin/xml sel -t -v "$1" ${configxml_file} | /usr/local/bin/xml unesc`
_result=$?
# Output query for later processing.
echo ${_queryresult}
debug "configxml_get: results: query=<${_queryresult}> cmd=<${_result}>"
return ${_result}
}
これを見ると大元のサーバ証明書の定義ファイルは/conf/config.xmlのようです./etc/rc.d/lighttpdをまねてプライベートキーを取り出してみます.
#!/bin/sh
#
. /etc/rc.subr
. /etc/util.subr
. /etc/configxml.subr
# create priv.pem file from webgui configuration
_privatekey=$( configxml_get //system/webgui/privatekey )
if [ -n "${_privatekey}" ]; then
echo "${_privatekey}" | /usr/bin/uudecode -m -r | /usr/bin/tr -d '\r'
fi
上記のシェルを実行するとこのようにプライベートキーを取り出すことができました.
-----BEGIN PRIVATE KEY-----
(途中略)
-----END PRIVATE KEY-----
自動更新
ここまでの仕組みからサーバ証明書の自動更新ができそうです.ひまがあったら挑戦してみます.
コメント