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:
@@ -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."
|
||||||
|
|
||||||
```
|
```
|
||||||
Reference in New Issue
Block a user