VAPID Keys für Web Push erzeugen

Erzeugen Sie mit nur einem Klick das benötigte VAPID-Schlüsselpaar für moderne Push-Dienste. Erstellen Sie die Schlüssel direkt im Browser und kopieren Sie das fertige Payload-Format nahtlos in Ihre Anwendung.

VAPID Key Generator

Generiere ein sicheres Schlüsselpaar für Web Push Notifications. Die E-Mail-Adresse wird als `mailto:`-Subject für die Push-Dienste hinterlegt.


Deep Dive: VAPID & Web Push Technologie

VAPID steht für Voluntary Application Server Identification (RFC 8292). Es ist der Sicherheitsanker der modernen Web Push API. Er ermöglicht es Ihrem Server, sich gegenüber Browser-Push-Diensten (wie Mozilla Autopush, Apple Push Notification service oder Google FCM) zu authentifizieren, ohne dass eine herstellerspezifische API-Registrierung erforderlich ist.

Spezifikationen

  • Kryptografie: Verwendet Elliptic Curve Digital Signature Algorithm (ECDSA) auf der P-256 Kurve.
  • Kodierung: Alle Schlüssel müssen im Base64-URL-Format vorliegen (ohne Padding, '-' statt '+', '_' statt '/').
  • Token-Struktur: Der Server sendet ein JWT (JSON Web Token), das mit dem Private Key signiert wurde, im `Authorization`-Header der Push-Anfrage.

Der Workflow

  1. Der Browser erhält den Public Key und erstellt ein Push-Abonnement.
  2. Die resultierende endpoint-URL und Keys werden an Ihren Server gesendet.
  3. Ihr Server signiert die Nachricht mit dem Private Key und sendet sie an den Endpoint.

Sicherheit & DSGVO

VAPID ist ein Gewinn für den Datenschutz. Da der Server sich identifiziert, können Push-Dienste Missbrauch (Spam) blockieren, ohne den Inhalt der (verschlüsselten) Nachricht lesen zu müssen. Wichtig: Speichern Sie den Private Key niemals in öffentlichen Repositories (GitHub etc.).

Multi-Language Code-Beispiele

Wählen Sie Ihre bevorzugte Programmiersprache, um zu sehen, wie Sie die generierten Keys integrieren:

  • JavaScript (Frontend)
  • PHP
  • Node.js
  • Python

// Registrierung des Service Workers und Abonnieren mit dem Public Key

const publicKey = 'DEIN_GENERIERTER_PUBLIC_KEY';
async function subscribe() {
  const reg = await navigator.serviceWorker.ready;
  const sub = await reg.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(publicKey)
  });
  // Sende sub-Objekt als JSON an deinen PHP/Python/Node Server
  console.log(JSON.stringify(sub));
}
function urlBase64ToUint8Array(base64) {
  const padding = '='.repeat((4 - base64.length % 4) % 4);
  const b64 = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/');
  return Uint8Array.from(atob(b64), c => c.charCodeAt(0));
}

// Nutzt die Library 'minishlink/web-push' (via Composer)

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
$auth = [
    'VAPID' => [
        'subject' => 'mailto:admin@deinedomain.de',
        'publicKey' => 'DEIN_GENERIERTER_PUBLIC_KEY',
        'privateKey' => 'DEIN_GENERIERTER_PRIVATE_KEY',
    ],
];
$webPush = new WebPush($auth);
$report = $webPush->sendOneNotification(
    Subscription::create($subscriptionDataFromJS),
    '{"title": "Hallo!", "body": "Push-Nachricht via PHP"}'
);

// Nutzt 'web-push' Paket

const webpush = require('web-push');
webpush.setVapidDetails(
  'mailto:admin@deinedomain.de',
  'DEIN_GENERIERTER_PUBLIC_KEY',
  'DEIN_GENERIERTER_PRIVATE_KEY'
);
// Payload senden
webpush.sendNotification(userSubscription, 'Nachrichteninhalt')
  .catch(err => console.error('Error sending push:', err));

// Nutzt die Library 'pywebpush'

from pywebpush import webpush, WebPushException
private_key = "DEIN_GENERIERTER_PRIVATE_KEY"
try:
    webpush(
        subscription_info=sub_info_json,
        data="Hallo aus Python!",
        vapid_private_key=private_key,
        vapid_claims={"sub": "mailto:admin@deinedomain.de"}
    )
except WebPushException as ex:
    print("Fehler: {}", repr(ex))

Gut zu wissen:

VAPID-Keys laufen technisch nicht ab. Ein Austausch ist nur erforderlich, wenn der Private Key bekannt wurde.
Tipp: Nutzen Sie für unterschiedliche Umgebungen (Staging/Produktion) verschiedene Key-Paare, um Fehlleitungen zu vermeiden.