GDV Schnittstelle — Technische Dokumentation
Admin-Bereich · Gutachten NOW
Die GDV Dienstleistungs-GmbH (Gesamtverband der Deutschen Versicherer) betreibt eine zentrale Datenbank aller Kfz-Haftpflichtversicherungen in Deutschland. Über diese Schnittstelle kann anhand eines Kfz-Kennzeichens + Unfalldatumsdie zuständige Versicherungsgesellschaft des Unfallgegners automatisch abgefragt werden.
Bei der Erstellung eines Haftpflicht-Gutachtens wird das Kennzeichen des Unfallgegners eingegeben. Die App fragt automatisch die Versicherungsdaten ab und füllt Name, Adresse, Telefon und Schadennummer der gegnerischen Versicherung automatisch aus — spart 5–10 Minuten pro Gutachten.
Verbindungsweg
App (Browser)
Backend-Funktion
(Cloud / Deno)
91.98.23.140
(TCP Relay)
Tunnel
(Verschlüsselt)
185.22.150.228
(Port 443)
Gutachter gibt Kennzeichen + Unfalldatum ein. App sendet Anfrage automatisch an Backend.
Funktion fetchGdvData baut XML-Anfrage auf und sendet per TCP an Hetzner-Server.
socat-Relay auf Port 8080 leitet TCP-Verbindung durch den IPSec VPN-Tunnel zum GDV weiter. GDV erreichbar unter 185.22.150.228:4030 (Socket-Schnittstelle, kein HTTP).
Unsere Angaben
| Tunnelendpunkt | 91.98.23.140 |
| Host Testumgebung | 185.22.150.228:443 |
| Host Produktion | 185.22.150.229:443 |
GDV Angaben
| Tunnelendpunkt GDV | 185.22.148.52 |
| Test-Server | 185.22.150.228:443 |
| Prod-Server | 185.22.150.229:443 |
Verschlüsselungsparameter (von GDV vorgegeben)
| Parameter | Phase 1 (IKEv2) | Phase 2 (IPSec) |
|---|---|---|
| Verschlüsselung | AES-256 | AES-256 |
| Hash | SHA-512 | ESP / SHA-512 |
| DH Gruppe | Group 21 | Group 21 (PFS) |
| Laufzeit | 28800 Sek. | 3600 Sek. |
| Authentifizierung | Pre-shared Key | — |
StrongSwan installieren (IPSec VPN Software)
apt-get install strongswan -yVPN-Konfiguration /etc/ipsec.conf
conn gdv-vpn
keyexchange=ikev2
authby=secret
left=91.98.23.140
leftid=91.98.23.140
right=185.22.148.52
ike=aes256-sha512-ecp521!
esp=aes256-sha512-ecp521!
ikelifetime=28800s
lifetime=3600s
auto=startPre-shared Key eintragen /etc/ipsec.secrets
91.98.23.140 185.22.148.52 : PSK "HIER_KEY_VOM_GDV"TCP-Relay (socat) als Systemdienst einrichten
apt-get install socat -y # Datei: /etc/systemd/system/gdv-relay.service [Unit] Description=GDV TCP Relay After=network.target [Service] ExecStart=/usr/bin/socat TCP-LISTEN:8888,fork TCP:185.22.150.228:443 Restart=always [Install] WantedBy=multi-user.target systemctl enable gdv-relay && systemctl start gdv-relay
Firewall-Port öffnen
ufw allow 8888/tcp && ufw reloadAnfrage (Request) →
<?xml version="1.0" encoding="UTF-8"?> <Request> <RequestId>REQ-1234567890</RequestId> <Requestor>GDV_USERNAME</Requestor> <Password>GDV_PASSWORD</Password> <RequestType>1</RequestType> <DateOfLoss>15.01.2024</DateOfLoss> <LicenceNumber>D ON 230</LicenceNumber> <Country>D</Country> </Request>
← Antwort (Response)
<?xml version="1.0" encoding="UTF-8"?> <Response> <ResponseCode>0</ResponseCode> <InsurancePOName>Allianz AG</InsurancePOName> <InsurancePOStreet>Königinstr. 28</InsurancePOStreet> <InsurancePOZipCity>80802</InsurancePOZipCity> <InsurancePOCity>München</InsurancePOCity> <InsurancePOTelephoneNo>089 3800-0</InsurancePOTelephoneNo> <InsurancePolicyNumber>AZ-123456</InsurancePolicyNumber> </Response>
Response-Codes
| Code | Bedeutung |
|---|---|
| 0 | ✅ Erfolgreich — Versicherungsdaten gefunden |
| 1 | Daten nicht in DB, Zulassungsstelle angefragt (kommt später) |
| 2 | Daten nicht in DB, keine Zulassungsstellenanfrage |
| 3 | Versicherung hat keine Freigabe erteilt |
| -1 | ⚠️ Temporärer Fehler, später erneut versuchen |
| -2 | ❌ Falscher Login oder dauerhafter Fehler |
Gespeicherte Secrets (Base44 Dashboard)
| Variable | Wert |
|---|---|
| GDV_USERNAME | •••••••• |
| GDV_PASSWORD | •••••••• |
| GDV_HOST | 91.98.23.140 |
| GDV_PORT | 8888 |
Ablauf in der App
Backend-Funktion: fetchGdvData
Datei: functions/fetchGdvData.js — Baut XML-Anfrage auf, öffnet TCP-Verbindung zu GDV_HOST:GDV_PORT, sendet XML, parst XML-Antwort, gibt strukturierte Versicherungsdaten zurück.
StrongSwan installieren
apt-get update apt-get install strongswan strongswan-pki libcharon-extra-plugins -y
VPN-Konfiguration erstellen: /etc/ipsec.conf
nano /etc/ipsec.conf
Inhalt der Datei (komplett ersetzen):
config setup
charondebug="ike 2, knl 2, cfg 2"
conn gdv-vpn
keyexchange=ikev2
authby=secret
type=tunnel
# Unser Hetzner Server
left=91.98.23.140
leftid=91.98.23.140
leftsubnet=91.98.23.140/32
# GDV Tunnelendpunkt
right=185.22.148.52
rightid=185.22.148.52
rightsubnet=185.22.150.0/24
# Verschlüsselung (von GDV vorgegeben)
ike=aes256-sha512-ecp521!
esp=aes256-sha512-ecp521!
ikelifetime=28800s
lifetime=3600s
dpddelay=30s
dpdtimeout=120s
dpdaction=restart
auto=startPre-shared Key eintragen: /etc/ipsec.secrets
nano /etc/ipsec.secrets
Inhalt (PSK aus Base44-Secret GDV_PSK):
91.98.23.140 185.22.148.52 : PSK "HIER_GDV_PSK_EINTRAGEN"
GDV_PSKIP Forwarding aktivieren (Kernel)
# Dauerhaft aktivieren echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
Firewall-Ports für IPSec öffnen
ufw allow 500/udp # IKEv2 ufw allow 4500/udp # IPSec NAT-T ufw reload
StrongSwan starten & aktivieren
systemctl enable strongswan-starter systemctl restart strongswan-starter
VPN-Status prüfen
ipsec status ipsec statusall # Logs ansehen: journalctl -u strongswan-starter -f
gdv-vpn{}: ESTABLISHEDno proposal chosen → Verschlüsselung prüfenauthentication failed → PSK prüfensocat Relay auf GDV-Server umleiten (nach VPN-Aufbau)
Sobald der VPN-Tunnel steht, muss socat auf den GDV-Server im Tunnel zeigen:
# /etc/systemd/system/gdv-proxy.service anpassen:
ExecStart=/usr/bin/socat TCP-LISTEN:8080,fork,reuseaddr TCP:185.22.150.228:4030
# Dienst neu starten:
systemctl daemon-reload
systemctl restart gdv-proxy
# Verbindung testen:
curl -v telnet://185.22.150.228:4030server.jsDie neue Bridge empfängt XML per HTTP POST und leitet es per TCP an den GDV-Server weiter (mit 4-Byte Längenpräfix gemäß GDV-Protokoll).
GDV_HOST muss auf die interne GDV-IP (hinter VPN) zeigen. In der systemd-Datei GDV_HOST anpassen!// GDV Bridge Server - server.js
// Empfängt POST-Anfragen mit XML-Body und leitet sie per TCP an den GDV-Server weiter
// Installation: node server.js (Port 8080)
const http = require('http');
const net = require('net');
const PORT = process.env.PORT || 8080;
const GDV_HOST = process.env.GDV_HOST || '10.0.0.1'; // GDV-Server IP (hinter VPN)
const GDV_PORT = parseInt(process.env.GDV_PORT || '7302'); // GDV TCP-Port
const server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/health') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok', gdvTarget: GDV_HOST + ':' + GDV_PORT }));
return;
}
if (req.method !== 'POST' || req.url !== '/check') {
res.writeHead(405, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Nur POST /check erlaubt' }));
return;
}
let body = '';
req.on('data', chunk => { body += chunk.toString(); });
req.on('end', () => {
console.log('[Bridge] Anfrage empfangen, Länge:', body.length, 'bytes');
console.log('[Bridge] Leite weiter an GDV:', GDV_HOST + ':' + GDV_PORT);
const socket = new net.Socket();
let responseData = '';
let responded = false;
const timeout = setTimeout(() => {
if (!responded) {
responded = true;
socket.destroy();
res.writeHead(504, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'GDV-Server Timeout nach 15s' }));
}
}, 15000);
socket.connect(GDV_PORT, GDV_HOST, () => {
console.log('[Bridge] TCP-Verbindung zu GDV hergestellt');
// XML mit Längenpräfix senden (GDV-Protokoll)
const xmlBytes = Buffer.from(body, 'utf8');
const lengthBuf = Buffer.alloc(4);
lengthBuf.writeUInt32BE(xmlBytes.length, 0);
socket.write(Buffer.concat([lengthBuf, xmlBytes]));
});
socket.on('data', data => {
responseData += data.toString();
// Prüfen ob vollständige XML-Antwort empfangen (enthält </Response> oder </ResponsibleInsuranceResponse>)
if (responseData.includes('</Response>') || responseData.includes('</ResponsibleInsuranceResponse>')) {
if (!responded) {
responded = true;
clearTimeout(timeout);
socket.destroy();
console.log('[Bridge] Antwort von GDV erhalten, sende zurück');
res.writeHead(200, { 'Content-Type': 'application/xml; charset=UTF-8' });
// Ersten 4 Bytes (Längenpräfix) überspringen falls vorhanden
const cleanResponse = responseData.replace(/^[\x00-\x1F]{4}/, '');
res.end(cleanResponse);
}
}
});
socket.on('error', err => {
if (!responded) {
responded = true;
clearTimeout(timeout);
console.error('[Bridge] TCP-Fehler:', err.message);
res.writeHead(502, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'GDV-TCP-Fehler: ' + err.message }));
}
});
socket.on('close', () => {
if (!responded && responseData) {
responded = true;
clearTimeout(timeout);
res.writeHead(200, { 'Content-Type': 'application/xml; charset=UTF-8' });
const cleanResponse = responseData.replace(/^[\x00-\x1F]{4}/, '');
res.end(cleanResponse);
}
});
});
});
server.listen(PORT, () => {
console.log('[Bridge] GDV-Bridge läuft auf Port', PORT);
console.log('[Bridge] Ziel-GDV-Server:', GDV_HOST + ':' + GDV_PORT);
});# /etc/systemd/system/gdv-bridge.service [Unit] Description=GDV Bridge Server After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/gdv-bridge Environment=PORT=8080 Environment=GDV_HOST=10.0.0.1 Environment=GDV_PORT=7302 ExecStart=/usr/bin/node server.js Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
# Auf dem Hetzner-Server ausführen: mkdir -p /opt/gdv-bridge cd /opt/gdv-bridge # server.js erstellen (Inhalt aus dem Code-Block oben kopieren) nano server.js # systemd-Service einrichten nano /etc/systemd/system/gdv-bridge.service # (Inhalt aus dem Service-Block oben, GDV_HOST anpassen!) # Service aktivieren & starten systemctl daemon-reload systemctl enable gdv-bridge systemctl restart gdv-bridge # Status prüfen systemctl status gdv-bridge # Verbindungstest (vom Server aus): curl -X GET http://localhost:8080/health
Protokoll-Details:
• Das GDV-Protokoll verwendet einen 4-Byte Big-Endian Längenpräfix vor dem XML
• Die Bridge parst die HTTP POST-Anfrage, verpackt das XML korrekt und sendet es per TCP
• Die Antwort vom GDV wird direkt als XML zurückgegeben (Präfix wird entfernt)
GDV Anfrage-Analyse
Anfragen insgesamt
Erfolgsquote (Code 0)
Fehlertypen
Letzte Anfrage
2026-04-21 06:15:32 UTC
- Erfolg (0)
- Fehler
Read timeout
2026-04-21 05:58:20
ResponseCode: -2
2026-04-21 03:54:00
Connection refused
2026-04-21 02:30:00
Kennzeichen
NE AA 244
Response Code
Dauer
10543ms
Zeitpunkt
2026-04-21 06:15:32 UTC
💡 Mock-Mode: Testet die Abfrage ohne VPN. Verfügbar: D ON 230, B BK 456
server.js auf dem Hetzner-Server einsetzen (empfängt XML per POST, leitet an GDV weiter).🧪 Live-Test Ergebnisse — 21.04.2026
✅ Mock-Mode (D ON 230): 200 OK in 342ms — Allianz-Daten
✅ Mock-Mode (NE-AA 244): 200 OK in 356ms — HUK-COBURG-Daten
✅ VPN-Tunnel + GDV-Server: Echte XML-Antwort empfangen in 670ms
✅ GDV ResponseCode 3: "Versicherung hat keine Freigabe erteilt" — Testkennzeichen nicht freigeschaltet, aber Verbindung vollständig funktionsfähig
→ Nächster Schritt: GDV nach freigeschaltetem Testkennzeichen fragen
16 von 17 Schritten ✅ funktionsfähig
✅ Fertig & live getestet
⏳ Letzter offener Punkt
→ GDV kontaktieren: Kundenbetreuung@gdv-dl.de / Lars Westedt +49 (40) 33449-1461 — Testkennzeichen anfragen für ResponseCode 0
→ Erst nach erfolgreichem Test mit ResponseCode 0 — dann socat auf Prod-IP umstellen
✅ VPN-Tunnel aktiv — GDV-Verbindung funktioniert!
Echte XML-Antwort vom GDV-Server empfangen (185.22.150.228:4030). GDV hat Phase 1 & Phase 2 bestätigt.
Nächster Schritt — Testkennzeichen anfragen:
📧 Kundenbetreuung@gdv-dl.de
📞 Lars Westedt: +49 (40) 33449-1461
Anfrage: "Bitte ein freigeschaltetes Testkennzeichen bereitstellen, damit wir ResponseCode 0 testen können. VPN-Tunnel ist aktiv und XML-Kommunikation funktioniert (ResponseCode 3 erhalten)."
Danach: Produktiv-Umstellung
# socat auf Produktions-IP umstellen: ExecStart=/usr/bin/socat TCP-LISTEN:8080,fork,reuseaddr TCP:185.22.150.229:4030 systemctl daemon-reload && systemctl restart gdv-proxy
GDV Dienstleistungs-GmbH
Zentralruf der Autoversicherer
📞 0800 2502600
Kundenbetreuung
📞 +49 (40) 33449-1461
📠 +49 (40) 33449-1407
✉️ Kundenbetreuung@gdv-dl.de
Ansprechpartner: Lars Westedt
Für Pre-shared Key und technischen Support
Technischer Ansprechpartner Ali Gökhan Akkaya
Can — Technischer Ansprechpartner
📞 017688070444
✉️ it@gutachtenjetzt.de