#!/bin/bash
# /etc/freeradius/3.0/certs/refresh.sh
# obnova server certifikátu — CA se NIKDY neregeneruje
set -e
cd /etc/freeradius/3.0/certs/

# sanity check — ověř, že CA existuje a je platná
openssl x509 -in ca.pem -noout -fingerprint -sha1 || {
    echo "CHYBA: ca.pem chybí nebo je poškozená. Abort." >&2
    exit 1
}

# záloha stávajícího certifikátu
cp -f server.pem "server.pem.bak-$(date +%Y%m%d-%H%M%S)" 2>/dev/null || true

# smaž POUZE serverové soubory — ca.key a ca.pem se NEDOTÝKÁME
rm -f server.key server.csr server.crt server.pem server.p12
rm -f index.txt index.txt.attr index.txt.old serial serial.old [0-9]*.pem
echo "01" > serial
touch index.txt
echo "unique_subject = yes" > index.txt.attr

# 1) nový klíč + CSR (SAN pochází ze server.cnf [alt_names])
openssl req -new \
    -out server.csr \
    -keyout server.key \
    -config ./server.cnf \
    -passin  pass:heslo_ca_klice \
    -passout pass:heslo_server_klice
chmod 640 server.key

# 2) podpis CA (copy_extensions=copy zajistí přenos SAN z CSR)
openssl ca -batch \
    -keyfile ca.key \
    -cert    ca.pem \
    -in      server.csr \
    -key     heslo_ca_klice \
    -out     server.crt \
    -extensions xpserver_ext \
    -extfile    xpextensions \
    -config     ./server.cnf

# ověření SAN v podepsaném certifikátu
echo "=== SAN v novém certifikátu ==="
openssl x509 -in server.crt -noout -text | grep -A3 "Subject Alt" || true
openssl x509 -in server.crt -noout -fingerprint -sha256

# 3) konverze na PEM (formát, který FreeRADIUS čte)
openssl pkcs12 -export \
    -in server.crt -inkey server.key -out server.p12 \
    -passin pass:heslo_server_klice -passout pass:heslo_server_klice
openssl pkcs12 -in server.p12 -out server.pem \
    -passin pass:heslo_server_klice -passout pass:heslo_server_klice
chmod 640 server.pem server.p12

# ověření řetězce
openssl verify -CAfile ca.pem server.pem

# 4) deploy
cp server.key /etc/ssl/radius/server.key
cp server.pem /etc/ssl/radius/server.pem
chown -R root:freerad /etc/ssl/radius/

# 5) smaž TLS session cache (starý session reuse by nabídl certifikát před renewalem)
rm -rf /var/log/freeradius/tlscache/*

systemctl restart freeradius
systemctl is-active freeradius && echo "=== FreeRADIUS OK ==="