Update netcup/update_tlsa_record.md

Prüfung hinzugefügt, dass ein bestehender 3 1 1 Eintrag ersetzt wird wenn er nciht den gleichen Wert hat. Vorher wurde ein weiterer angelegt.

`jq` muss auf dem Server installiert sein.
This commit is contained in:
2024-11-20 20:14:38 +00:00
parent d2bc47319c
commit ef88adf548

View File

@@ -9,12 +9,13 @@ CUSTOMER_NUMBER=DEINE_KUNDENNUMMER
API_KEY=DEIN_API_KEY API_KEY=DEIN_API_KEY
API_PASSWORD=DEIN_API_PASSWORT API_PASSWORD=DEIN_API_PASSWORT
DOMAIN=deine-domain.de DOMAIN=deine-domain.de
MAIL_SERVICE=deine-mx-domain.de
CERTIFICATE_PATH=PFAD_ZUR_fullchain.pem CERTIFICATE_PATH=PFAD_ZUR_fullchain.pem
``` ```
```python ```python
#!/bin/bash #!/bin/bash
# .env Datei laden # .env Datei laden
if [ -f netcup.env ]; then if [ -f netcup.env ]; then
export $(grep -v '^#' netcup.env | xargs) export $(grep -v '^#' netcup.env | xargs)
@@ -22,30 +23,41 @@ else
echo "Fehler: .env Datei nicht gefunden!" echo "Fehler: .env Datei nicht gefunden!"
exit 1 exit 1
fi fi
# URL der Netcup API # URL der Netcup API
API_URL="https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON" API_URL="https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON"
# Prüfen, ob das Zertifikat existiert # Prüfen, ob das Zertifikat existiert
if [[ ! -f "$CERTIFICATE_PATH" ]]; then if [[ ! -f "$CERTIFICATE_PATH" ]]; then
echo "Fehler: Zertifikat unter $CERTIFICATE_PATH nicht gefunden!" echo "Fehler: Zertifikat unter $CERTIFICATE_PATH nicht gefunden!"
exit 1 exit 1
fi fi
echo "Zertifikat gefunden: $CERTIFICATE_PATH" echo "Zertifikat gefunden: $CERTIFICATE_PATH"
# TLSA-Hash generieren # TLSA-Hash generieren mit Fallback-Mechanismus
TLSA_HASH=$(openssl x509 -in "$CERTIFICATE_PATH" -pubkey -noout | \ TLSA_HASH=""
openssl pkey -pubin -outform DER | \ RETRY_COUNT=0
openssl dgst -sha256 -binary | hexdump -ve '1/1 "%.2x"') MAX_RETRIES=3
while [[ -z "$TLSA_HASH" && $RETRY_COUNT -lt $MAX_RETRIES ]]; do
TLSA_HASH=$(openssl x509 -in "$CERTIFICATE_PATH" -pubkey -noout | \
openssl pkey -pubin -outform DER | \
openssl dgst -sha256 -binary | hexdump -ve '1/1 "%.2x"')
if [[ -z "$TLSA_HASH" ]]; then
((RETRY_COUNT++))
echo "Fehler beim Generieren des TLSA-Hashes! Versuche erneut ($RETRY_COUNT/$MAX_RETRIES)"
sleep 1
fi
done
if [[ -z "$TLSA_HASH" ]]; then if [[ -z "$TLSA_HASH" ]]; then
echo "Fehler beim Generieren des TLSA-Hashes!" echo "Fehler beim Generieren des TLSA-Hashes nach $MAX_RETRIES Versuchen!"
exit 1 exit 1
fi fi
echo "TLSA-Record-Hash generiert: $TLSA_HASH" echo "TLSA-Record-Hash generiert: $TLSA_HASH"
# Login zur Netcup API # Login zur Netcup API
LOGIN_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \ LOGIN_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
-d '{ -d '{
@@ -56,17 +68,17 @@ LOGIN_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
"apipassword": "'"$API_PASSWORD"'" "apipassword": "'"$API_PASSWORD"'"
} }
}' "$API_URL") }' "$API_URL")
SESSION_ID=$(echo "$LOGIN_RESPONSE" | jq -r '.responsedata.apisessionid') SESSION_ID=$(echo "$LOGIN_RESPONSE" | jq -r '.responsedata.apisessionid')
if [[ -z "$SESSION_ID" || "$SESSION_ID" == "null" ]]; then if [[ -z "$SESSION_ID" || "$SESSION_ID" == "null" ]]; then
echo "Fehler beim Login!" echo "Fehler beim Login!"
echo "$LOGIN_RESPONSE" echo "$LOGIN_RESPONSE"
exit 1 exit 1
fi fi
echo "Erfolgreich eingeloggt. Session-ID: $SESSION_ID" echo "Erfolgreich eingeloggt. Session-ID: $SESSION_ID"
# DNS Records abrufen # DNS Records abrufen
DNS_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \ DNS_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
-d '{ -d '{
@@ -78,17 +90,21 @@ DNS_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
"domainname": "'"$DOMAIN"'" "domainname": "'"$DOMAIN"'"
} }
}' "$API_URL") }' "$API_URL")
# JSON komprimieren für grep-Verarbeitung
COMPACT_JSON=$(echo "$DNS_RESPONSE" | tr -d '\n' | tr -d '[:space:]')
# TLSA-Record prüfen # TLSA-Record prüfen
RECORDS=$(echo "$DNS_RESPONSE" | jq -r '.responsedata.dnsrecords') EXISTING_TLSA_RECORD=$(echo "$COMPACT_JSON" | grep -o '{"id":[^}]*"hostname":"_25._tcp.'"$MAIL_SERVICE"'"[^}]*"destination":"3[^}]*}')
EXISTING_TLSA_RECORD=$(echo "$RECORDS" | jq -r ".[] | select(.hostname == \"_25._tcp.mail\" and .type == \"TLSA\")")
if [[ -n "$EXISTING_TLSA_RECORD" ]]; then if [[ -n "$EXISTING_TLSA_RECORD" ]]; then
EXISTING_DESTINATION=$(echo "$EXISTING_TLSA_RECORD" | jq -r '.destination') RECORD_ID=$(echo "$EXISTING_TLSA_RECORD" | grep -o '"id":"[^"]*"' | cut -d '"' -f 4)
RECORD_ID=$(echo "$EXISTING_TLSA_RECORD" | jq -r '.id') EXISTING_DESTINATION=$(echo "$EXISTING_TLSA_RECORD" | grep -o '"destination":"[^"]*"' | cut -d '"' -f 4 | tr -d ' ')
echo "Bestehender TLSA-Record gefunden: ID $RECORD_ID mit Wert $EXISTING_DESTINATION"
# Entferne Leerzeichen aus TLSA_HASH für den Vergleich
if [[ "$EXISTING_DESTINATION" == "3 1 1 $TLSA_HASH" ]]; then TLSA_HASH_COMPACT=$(echo "3 1 1 $TLSA_HASH" | tr -d ' ')
if [[ "$EXISTING_DESTINATION" == "$TLSA_HASH_COMPACT" ]]; then
echo "Der bestehende TLSA-Record hat bereits den korrekten Wert. Keine Änderungen erforderlich." echo "Der bestehende TLSA-Record hat bereits den korrekten Wert. Keine Änderungen erforderlich."
# Logout # Logout
curl -s -X POST -H "Content-Type: application/json" \ curl -s -X POST -H "Content-Type: application/json" \
@@ -100,50 +116,54 @@ if [[ -n "$EXISTING_TLSA_RECORD" ]]; then
"apisessionid": "'"$SESSION_ID"'" "apisessionid": "'"$SESSION_ID"'"
} }
}' "$API_URL" > /dev/null }' "$API_URL" > /dev/null
echo "Logout abgeschlossen." echo "Logout abgeschlossen."
exit 0 exit 0
else
echo "Der bestehende TLSA-Record unterscheidet sich vom neuen Wert. Aktualisierung wird durchgeführt."
fi fi
else else
echo "Kein bestehender TLSA-Record gefunden. Ein neuer wird erstellt." echo "Kein bestehender TLSA-Record mit Typ '3 1 1' gefunden. Ein neuer wird erstellt."
RECORD_ID="" RECORD_ID=""
fi fi
# Neuer oder aktualisierter TLSA-Record erstellen # Neuer oder aktualisierter TLSA-Record erstellen
DNS_UPDATE_PAYLOAD='{ if [[ -z "$EXISTING_TLSA_RECORD" || "$EXISTING_DESTINATION" != "$TLSA_HASH_COMPACT" ]]; then
"action": "updateDnsRecords", DNS_UPDATE_PAYLOAD='{
"param": { "action": "updateDnsRecords",
"customernumber": "'"$CUSTOMER_NUMBER"'", "param": {
"apikey": "'"$API_KEY"'", "customernumber": "'"$CUSTOMER_NUMBER"'",
"apisessionid": "'"$SESSION_ID"'", "apikey": "'"$API_KEY"'",
"domainname": "'"$DOMAIN"'", "apisessionid": "'"$SESSION_ID"'",
"dnsrecordset": { "domainname": "'"$DOMAIN"'",
"dnsrecords": [ "dnsrecordset": {
{ "dnsrecords": [
"id": "'"$RECORD_ID"'", {
"hostname": "_25._tcp.mail", "id": "'"$RECORD_ID"'",
"type": "TLSA", "hostname": "_25._tcp.'"$MAIL_SERVICE"'",
"destination": "3 1 1 '"$TLSA_HASH"'", "type": "TLSA",
"state": "yes" "destination": "3 1 1 '"$TLSA_HASH"'",
} "state": "yes"
] }
]
}
} }
} }'
}'
# DNS-Record aktualisieren
# DNS-Record aktualisieren UPDATE_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \
UPDATE_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" \ -d "$DNS_UPDATE_PAYLOAD" "$API_URL")
-d "$DNS_UPDATE_PAYLOAD" "$API_URL")
UPDATE_STATUS=$(echo "$UPDATE_RESPONSE" | jq -r '.status')
UPDATE_STATUS=$(echo "$UPDATE_RESPONSE" | jq -r '.status')
if [[ "$UPDATE_STATUS" == "success" ]]; then
if [[ "$UPDATE_STATUS" == "success" ]]; then echo "TLSA-Record erfolgreich aktualisiert."
echo "TLSA-Record erfolgreich aktualisiert." else
else echo "Fehler beim Aktualisieren des TLSA-Records!"
echo "Fehler beim Aktualisieren des TLSA-Records!" echo "$UPDATE_RESPONSE"
echo "$UPDATE_RESPONSE" fi
fi fi
# Logout # Logout
curl -s -X POST -H "Content-Type: application/json" \ curl -s -X POST -H "Content-Type: application/json" \
-d '{ -d '{
@@ -154,7 +174,6 @@ curl -s -X POST -H "Content-Type: application/json" \
"apisessionid": "'"$SESSION_ID"'" "apisessionid": "'"$SESSION_ID"'"
} }
}' "$API_URL" > /dev/null }' "$API_URL" > /dev/null
echo "Logout abgeschlossen." echo "Logout abgeschlossen."
``` ```