now with dnsec

This commit is contained in:
rnsrk 2026-01-19 13:10:13 +01:00
parent b006c8f809
commit fb22e9cab4
118 changed files with 8306 additions and 2337 deletions

95
scripts/update-tlsa.sh Executable file
View file

@ -0,0 +1,95 @@
#!/bin/bash
# Script to automatically update TLSA records when certificates are renewed.
# This should be triggered by certdumper or Traefik certificate renewal.
set -e
# Configuration.
mailcowHostname="${MAILCOW_HOSTNAME:-mail.nasarek.dev}"
domain="${DOMAIN:-nasarek.dev}"
dnsApiKey="${DNS_API_KEY:-}"
dnsApiPassword="${DNS_API_PASSWORD:-}"
dnsCustomerNumber="${DNS_CUSTOMER_NUMBER:-}"
# Paths.
certFile="/var/deploy/mailcow/data/assets/ssl/cert.pem"
logFile="/var/deploy/scripts/tlsa-update.log"
# Logging function.
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$logFile"
}
# Check if certificate file exists.
if [ ! -f "$certFile" ]; then
log "ERROR: Certificate file not found: $certFile"
exit 1
fi
# Generate TLSA hash from certificate.
generateTlsaHash() {
local certPath="$1"
if [ ! -f "$certPath" ]; then
log "ERROR: Certificate file not found: $certPath"
return 1
fi
openssl x509 -in "$certPath" -noout -pubkey | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 | \
awk '{print $2}'
}
# Update TLSA record via DNS provider API.
updateTlsaRecord() {
local port="$1"
local hash="$2"
local recordName="_${port}._tcp.${mailcowHostname}"
log "Updating TLSA record: ${recordName}"
# Check if DNS provider API credentials are configured.
if [ -z "$dnsApiKey" ] || [ -z "$dnsApiPassword" ] || [ -z "$dnsCustomerNumber" ]; then
log "WARNING: DNS provider API credentials not configured. TLSA record needs manual update:"
log " ${recordName} TLSA 3 1 1 ${hash}"
return 1
fi
# DNS provider API call would go here.
# For now, we'll log the required values.
log "INFO: Use DNS provider API to update:"
log " Record: ${recordName}"
log " Type: TLSA"
log " Value: 3 1 1 ${hash}"
# TODO: Implement DNS provider API call.
# Example for Netcup:
# curl -X POST https://ccp.netcup.net/run/webservice/servers/endpoint.php \
# -d "apikey=${dnsApiKey}&apipassword=${dnsApiPassword}&customernumber=${dnsCustomerNumber}&domainname=${domain}&dnsrecordset=..."
}
# Main execution.
main() {
log "Starting TLSA record update check..."
# Generate hash from current certificate.
local tlsaHash
tlsaHash=$(generateTlsaHash "$certFile")
if [ -z "$tlsaHash" ]; then
log "ERROR: Failed to generate TLSA hash"
exit 1
fi
log "Generated TLSA hash: ${tlsaHash}"
# Update TLSA records for all mail ports.
updateTlsaRecord "25" "$tlsaHash"
updateTlsaRecord "465" "$tlsaHash"
updateTlsaRecord "587" "$tlsaHash"
log "TLSA update check completed"
}
main "$@"