View a markdown version of this page

Schreiben Sie den CloudFront Verbindungsfunktionscode für die gegenseitige TLS-Validierung (Viewer) - Amazon CloudFront

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Schreiben Sie den CloudFront Verbindungsfunktionscode für die gegenseitige TLS-Validierung (Viewer)

CloudFront Mit den Verbindungsfunktionen können Sie einfache JavaScript Funktionen für die mTLS-Zertifikatsvalidierung und benutzerdefinierte Authentifizierungslogik schreiben. Ihr Verbindungsfunktionscode kann Client-Zertifikate validieren, gerätespezifische Authentifizierungsregeln implementieren, Zertifikatssperrszenarien bewältigen und allow/deny Entscheidungen für TLS-Verbindungen an CloudFront Edge-Standorten weltweit treffen.

Verbindungsfunktionen bieten eine leistungsstarke Möglichkeit, die integrierte Zertifikatsvalidierung um Ihre eigene Geschäftslogik zu erweitern CloudFront. Im Gegensatz zu Viewer-Request- und Viewer-Response-Funktionen, die HTTP-Daten verarbeiten, arbeiten Verbindungsfunktionen auf der TLS-Ebene und haben Zugriff auf Zertifikatsinformationen, Client-IP-Adressen und TLS-Verbindungsdetails. Dadurch eignen sie sich ideal für die Implementierung von Zero-Trust-Sicherheitsmodellen, Geräteauthentifizierungssystemen und benutzerdefinierten Richtlinien zur Zertifikatsvalidierung, die über die standardmäßige PKI-Validierung hinausgehen.

Ihr Verbindungsfunktionscode wird in einer sicheren, isolierten Umgebung mit Startzeiten von unter einer Millisekunde ausgeführt und kann so skaliert werden, dass er Millionen von Verbindungen pro Sekunde verarbeitet. Die Runtime ist für Workloads zur Zertifikatsvalidierung optimiert und bietet eine integrierte Integration CloudFront KeyValueStore für Datenabfragen in Echtzeit. Dadurch sind ausgefeilte Authentifizierungsszenarien wie die Überprüfung von Zertifikatssperrlisten und die Validierung von Zulassungslisten für Geräte möglich.

Informationen zum Schreiben eines effektiven Verbindungsfunktionscodes finden Sie in den folgenden Themen. Vollständige Codebeispiele und schrittweise Anleitungen finden Sie in den Tutorial-Abschnitten dieses Handbuchs. Erkunden Sie auch die Beispiele für Verbindungsfunktionen, die in der CloudFront Konsole verfügbar sind.

CloudFront Anwendungsfälle und Zwecke der Verbindungsfunktion

Bevor Sie Ihre CloudFront Verbindungsfunktion schreiben, sollten Sie sorgfältig festlegen, welche Art von Zertifikatsvalidierungs- oder Authentifizierungslogik Sie implementieren müssen. Die Verbindungsfunktionen sind für bestimmte Anwendungsfälle konzipiert, die eine benutzerdefinierte Validierung erfordern, die über die standardmäßige PKI-Zertifikatsprüfung hinausgeht. Wenn Sie Ihren Anwendungsfall verstehen, können Sie effizienten Code entwerfen, der Ihre Sicherheitsanforderungen erfüllt und gleichzeitig eine optimale Leistung gewährleistet.

Zu den häufigsten Anwendungsfällen der Verbindungsfunktion gehören:

  • Umgang mit Zertifikatssperrungen — Implementieren Sie benutzerdefinierte Richtlinien für den Umgang mit gesperrten Zertifikaten, einschließlich Übergangsfristen für die Zertifikatsrotation, Ausnahmen für vertrauenswürdige Netzwerke für interne Geräte oder Notfallzugriffsszenarien, in denen widerrufene Zertifikate möglicherweise vorübergehend abgerufen werden müssen.

  • Optionale mTLS-Unterstützung — Behandeln Sie sowohl mTLS- als auch Nicht-MTLS-Verbindungen mit unterschiedlichen Authentifizierungsrichtlinien. So können Sie Clients, die Zertifikate unterstützen, mehr Sicherheit bieten und gleichzeitig die Kompatibilität mit älteren Clients aufrechterhalten.

  • IP-based Authentifizierung — Kombinieren Sie die Zertifikatsvalidierung mit der Überprüfung der Client-IP-Adressen, um die Sicherheit zu erhöhen, z. B. indem Sie den Zugriff von bestimmten geografischen Regionen, Unternehmensnetzwerken oder bekannten bösartigen IP-Bereichen aus einschränken.

  • Multi-tenant Zertifikatsvalidierung — Implementieren Sie mandantenspezifische Validierungsregeln, für die je nach den Attributen des Ausstellers oder des Antragstellers des Client-Zertifikats unterschiedliche Zertifizierungsstellen oder Validierungskriterien gelten.

  • Time-based Zugriffskontrolle — Setzen Sie zeitabhängige Einschränkungen durch, sodass Zertifikate nur zu bestimmten Zeiten, Wartungsfenstern oder Geschäftsperioden gültig sind, auch wenn das Zertifikat selbst noch nicht abgelaufen ist.

Die Verbindungsfunktionen werden nach der CloudFront Standardüberprüfung des Zertifikats (Überprüfung der Vertrauenskette, Ablaufprüfungen und Signaturvalidierung) ausgeführt, jedoch bevor die TLS-Verbindung hergestellt wird. Dieses Timing gibt Ihnen die Flexibilität, benutzerdefinierte Validierungskriterien hinzuzufügen und gleichzeitig von CloudFront der integrierten Zertifikatsvalidierung zu profitieren. Ihre Funktion erhält die Ergebnisse der Standardvalidierung und kann anhand von Standard- und benutzerdefinierten Kriterien fundierte Entscheidungen darüber treffen, ob die Verbindung zugelassen oder verweigert werden soll.

Berücksichtigen Sie beim Entwerfen Ihrer Verbindungsfunktion die Auswirkungen Ihrer Validierungslogik auf die Leistung. Funktionen haben ein Ausführungslimit von 5 Millisekunden, daher sollten komplexe Operationen hinsichtlich ihrer Geschwindigkeit optimiert werden. Verwenden Sie diese KeyValueStore Option eher für schnelle Datenabfragen als für komplexe Berechnungen und strukturieren Sie Ihre Validierungslogik so, dass sie bei ungültigen Zertifikaten schnell fehlschlägt.

CloudFront Verbindungsfunktion, Ereignisstruktur und Antwortformat

CloudFront Verbindungsfunktionen erhalten eine andere Ereignisstruktur als Viewer-Anforderungs- und Viewer-Antwortfunktionen. Anstelle von request/response HTTP-Daten erhalten Verbindungsfunktionen Zertifikat- und Verbindungsinformationen, anhand derer Sie Authentifizierungsentscheidungen treffen können.

Ereignisstruktur für Verbindungsfunktionen

Verbindungsfunktionen erhalten ein Ereignisobjekt, das Zertifikat und Verbindungsinformationen enthält. Die Eventstruktur der Funktion ist unten dargestellt:

{ "clientCertificate": { "certificates": { "leaf": { "serialNumber": "string", "issuer": "string", "subject": "string", "validity": { "notBefore": "string", "notAfter": "string" }, "sha256Fingerprint": "string", "ocspEndpoint": "string", "san": "string", "spki": "string", "sanHex": "string" }, "intermediates": [ { "serialNumber": "string", "issuer": "string", "subject": "string", "validity": { "notBefore": "string", "notAfter": "string" }, "sha256Fingerprint": "string", "ocspEndpoint": "string", "san": "string", "spki": "string", "sanHex": "string" } ] } }, "clientIp": "string", "endpoint": "string", "distributionId": "string", "connectionId": "string" }

Unten finden Sie ein Beispiel für die Event-Objektstruktur:

{ "clientCertificate": { "certificates": { "leaf": { "serialNumber": "00:9e:2a:af:16:56:e5:47:25:7d:2e:38:c3:f9:9d:57:fa", "issuer": "C=US, O=Ram, OU=Edge, ST=WA, CN=mTLS-CA, L=Snoqualmie", "subject": "C=US, O=Ram, OU=Edge, ST=WA, CN=mTLS-CA, L=Snoqualmie", "validity": { "notBefore": "2025-09-10T23:43:10Z", "notAfter": "2055-09-11T00:43:02Z" }, "sha256Fingerprint": "_w6bJ7aOAlGOj7NUhJxTfsfee-ONg_xop3_PTgTJpqs=", "ocspEndpoint": "http://ocsp.example.com", "san": "DNS:api.example.com,DNS:www.example.com,URI:urn:example:client:123,IP Address:192.168.1.100,email:alejandro_rosalez@example.com", "spki": "30820122300d06092a864886f70d01010105000382010f003082010a0282010100b8efe87db798500320936...", "sanHex": "3058820f6170692e6578616d706c652e636f6d820f7777772e6578616d706c652e636f6d8619..." }, "intermediates": [ { "serialNumber": "00:d4:04:a5:fd:cb:20:37:54", "issuer": "C=US, O=Example Corp, CN=Example Root CA", "subject": "C=US, O=Example Corp, CN=Example Intermediate CA", "validity": { "notBefore": "2024-01-01T00:00:00Z", "notAfter": "2034-01-01T23:59:59Z" }, "sha256Fingerprint": "3a8c6b...", "ocspEndpoint": "http://ocsp.example.com/intermediate", "san": "DNS:ca.example.com,URI:urn:ca:intermediate:001", "spki": "30820122300d06092a864886f70d01010105000382010f003082010a0282010100b389dd513b0f1f14cac1...", "sanHex": "302b820e63612e6578616d706c652e636f6d..." } ] } }, "clientIp": "192.0.2.1", "endpoint": "d3lch071jze0cb.cloudfront.net", "distributionId": "E1NXS4MQZH501R", "connectionId": "NpvTe1925xfj24a67sPQr7ae42BIq03FGhJJKfrQYWZcWZFp96SIIg==" }

Antwortformat für Verbindungsfunktionen

Ihre Verbindungsfunktion muss ein Antwortobjekt zurückgeben, das angibt, ob die Verbindung zugelassen oder verweigert werden soll. Verwenden Sie die Hilfsmethoden, um Verbindungsentscheidungen zu treffen:

function connectionHandler(connection) { // Helper methods to allow or deny connections if (/* some logic to determine if function should allow connection */) { connection.allow(); } else { connection.deny(); } }

Im Gegensatz zu den Funktionen für Zuschaueranfragen und Zuschauerantworten können Verbindungsfunktionen keine HTTP-Anfragen oder -Antworten ändern. Sie können die TLS-Verbindung nur zulassen oder verweigern.

CloudFront Verbindungsfunktionen, JavaScript Laufzeitfunktionen

CloudFront Connection Functions verwenden die CloudFront Functions JavaScript Runtime 2.0, die eine sichere und leistungsstarke Umgebung bietet, die speziell für Workloads zur Zertifikatsvalidierung optimiert ist. Die Laufzeit ist so konzipiert, dass sie in weniger als einer Millisekunde startet und Millionen von gleichzeitigen Ausführungen im globalen Edge-Netzwerk verarbeitet. CloudFront

Die Laufzeitumgebung beinhaltet umfassende Sprachunterstützung: JavaScript

  • Unterstützung für ECMAScript 2020 (ES11) — Moderne JavaScript Funktionen, einschließlich optionaler Verkettung (?.) und Nullkoaleszenz (??)

  • Built-in Objekte — JavaScript Standardobjekte wie Object, Array, JSON, Math und Date

  • Konsolenprotokollierung — Verwenden Sie console.log () zum Debuggen und Überwachen von Entscheidungen zur Zertifikatsvalidierung. Protokolle sind während des Testens in Echtzeit verfügbar und können bei der Fehlerbehebung bei der Validierungslogik in der Entwicklung helfen

  • KeyValueStore Integration — Nativer Zugriff auf CloudFront KeyValueStore für ultraschnelle Datenabfragen, der die Überprüfung von Zertifikatssperrungen in Echtzeit, die Validierung von Zulassungslisten für Geräte und den Abruf mandantenspezifischer Konfigurationen ermöglicht

Die Verbindungsfunktionen sind für eine hohe Leistung bei der Zertifikatsvalidierung optimiert. Die Runtime kümmert sich automatisch um die Speicherverwaltung, die Speicherbereinigung und die Bereinigung von Ressourcen, um eine konsistente Leistung über Millionen gleichzeitiger Verbindungen hinweg sicherzustellen. Alle Operationen sind so konzipiert, dass sie deterministisch und schnell sind, wobei KeyValueStore Suchvorgänge in der Regel in Mikrosekunden abgeschlossen werden.

Die Laufzeitumgebung ist zwischen den Funktionsausführungen vollständig isoliert, wodurch sichergestellt wird, dass keine Daten zwischen verschiedenen Client-Verbindungen verloren gehen. Jede Funktionsausführung beginnt mit einem sauberen Zustand und hat keinen Zugriff auf frühere Ausführungsergebnisse oder Client-Daten von anderen Verbindungen.

CloudFront Hilfsmethoden und APIs für Verbindungsfunktionen

CloudFront Verbindungsfunktionen bieten spezielle Hilfsmethoden, die dazu dienen, Entscheidungen zur Zertifikatsvalidierung zu vereinfachen und die Beobachtbarkeit zu verbessern. Diese Methoden sind für den Arbeitsablauf bei der Verbindungsvalidierung optimiert und lassen sich nahtlos CloudFront in die Verbindungsprotokollierungs- und Überwachungssysteme integrieren.

  • connection.allow () — Erlaubt die Fortsetzung der TLS-Verbindung. Diese Methode signalisiert CloudFront , den TLS-Handshake abzuschließen und dem Client zu ermöglichen, die Verbindung herzustellen. Verwenden Sie diese Methode, wenn die Zertifikatsvalidierung erfolgreich ist und die benutzerdefinierte Authentifizierungslogik erfüllt ist

  • connection.deny () — Lehnen Sie die TLS-Verbindung ab und beenden Sie den Handshake. Diese Methode schließt sofort die Verbindung und verhindert, dass HTTP-Verkehr fließt. Der Client erhält einen TLS-Verbindungsfehler. Verwenden Sie dies bei ungültigen Zertifikaten, fehlgeschlagener Authentifizierung oder Richtlinienverstößen

  • connection.log CustomData () — Fügen Sie benutzerdefinierte Daten zu Verbindungsprotokollen hinzu (bis zu 800 Byte UTF-8 Text). Mit dieser Methode können Sie Überprüfungsergebnisse, Zertifikatsdetails oder Entscheidungsgründe zur Sicherheitsüberwachung, Konformitätsprüfung und Problembehandlung in CloudFront Verbindungsprotokolle aufnehmen

Diese Methoden bieten eine übersichtliche, deklarative Oberfläche, über die Verbindungsentscheidungen getroffen und relevante Informationen für die Überwachung und das Debuggen protokolliert werden können. Das allow/deny Muster stellt sicher, dass die Absicht Ihrer Funktion klar ist und dass das Verbindungsmanagement auf der Grundlage Ihrer Entscheidung optimiert werden CloudFront kann. Benutzerdefinierte Protokollierungsdaten sind sofort in CloudFront Verbindungsprotokollen verfügbar und können zusammen mit Protokollanalysetools zur Sicherheitsüberwachung und für betriebliche Einblicke verwendet werden.

Rufen Sie immer entweder connection.allow () oder connection.deny () auf, bevor Ihre Funktion abgeschlossen ist. Wenn keine der Methoden aufgerufen wird, CloudFront wird die Verbindung aus Sicherheitsgründen standardmäßig verweigert.

CloudFront Verbindung, Funktion KeyValueStore , Integration

CloudFront Verbindungsfunktionen können verwendet werden CloudFront KeyValueStore , um ultraschnelle Datenabfragen für Zertifikatsvalidierungsszenarien durchzuführen. KeyValueStore ist besonders leistungsstark für Connection Functions, da es globalen, letztlich konsistenten Datenzugriff mit Suchzeiten im Mikrosekundenbereich an allen Edge-Standorten ermöglicht. CloudFront Dadurch eignet es sich ideal für die Verwaltung von Zertifikatssperrlisten, Gerätezulassungslisten, Mandantenkonfigurationen und anderen Validierungsdaten, auf die bei TLS-Handshakes zugegriffen werden muss.

KeyValueStore Die Integration wurde speziell für leistungsstarke Workflows zur Verbindungsvalidierung entwickelt:

  • kvs Handle.exists (key) — Prüft, ob ein Schlüssel in der existiert, KeyValueStore ohne den Wert abzurufen. Dies ist die effizienteste Methode für binäre Validierungsszenarien wie die Überprüfung von Zertifikatssperrungen, bei denen Sie nur wissen müssen, ob die Seriennummer eines Zertifikats in einer Sperrliste enthalten ist

  • kvs Handle.get (key) — Ruft einen Wert aus dem KeyValueStore für komplexere Validierungsszenarien ab. Verwenden Sie diese Option, wenn Sie auf Konfigurationsdaten, Validierungsregeln oder Metadaten zugreifen müssen, die einem Zertifikat oder einer Gerätekennzeichnung zugeordnet sind

KeyValueStore Operationen sind asynchron und müssen mit async/await Syntax verwendet werden. Der KeyValueStore hat eine Gesamtgrößenbeschränkung von 10 MB und unterstützt bis zu 10 Millionen Schlüssel-Wert-Paare. KeyValueStore Die Daten sind letztendlich an allen Edge-Standorten konsistent, wobei Aktualisierungen in der Regel innerhalb von Sekunden übertragen werden.

Für eine optimale Leistung sollten Sie Ihre KeyValueStore Schlüssel so strukturieren, dass Suchvorgänge minimiert werden. Verwenden Sie die Seriennummern von Zertifikaten als Schlüssel für die einfache Sperrüberprüfung, oder erstellen Sie zusammengesetzte Schlüssel, die den Aussteller-Hash und die Seriennummer für Umgebungen mit mehreren Zertifizierungsstellen kombinieren. Berücksichtigen Sie beim Entwurf Ihrer Datenstruktur die Kompromisse zwischen Schlüsselkomplexität und KeyValueStore Kapazität.

Verwenden Sie async und await

Verbindungsfunktionen unterstützen asynchrone Operationen mithilfe der async/await Syntax, was bei der Arbeit mit KeyValueStore Vorgängen oder anderen asynchronen Aufgaben unerlässlich ist. Das async/await Muster stellt sicher, dass Ihre Funktion darauf wartet, dass KeyValueStore Suchvorgänge abgeschlossen sind, bevor Verbindungsentscheidungen getroffen werden, während gleichzeitig die für die TLS-Handshake-Verarbeitung erforderlichen Leistungsmerkmale beibehalten werden.

Die richtige async/await Verwendung ist für Verbindungsfunktionen von entscheidender Bedeutung, da der KeyValueStore Betrieb zwar sehr schnell ist, aber dennoch Netzwerkvorgänge sind, die eine Koordination zwischen CloudFront der verteilten Infrastruktur erfordern. Die Laufzeitumgebung übernimmt automatisch die Erfüllung von Versprechen und stellt sicher, dass Ihre Funktion innerhalb der Ausführungsgrenze von 5 Millisekunden abgeschlossen wird.

Beispiel: Asynchrone Verbindungsfunktion mit KeyValueStore
import cf from 'cloudfront'; async function connectionHandler(connection) { const kvsHandle = cf.kvs(); // Async operation to check KeyValueStore for certificate revocation const isRevoked = await kvsHandle.exists(connection.clientCertificate.certificates.leaf.serialNumber); if (isRevoked) { // Log the revocation decision with certificate details connection.logCustomData(`REVOKED_CERT:${connection.clientCertificate.certificates.leaf.serialNumber}:${connection.clientCertificate.certificates.leaf.issuer}`); console.log(`Denying connection for revoked certificate: ${connection.clientCertificate.certificates.leaf.serialNumber}`); return connection.deny(); } // Log successful validation for monitoring connection.logCustomData(`VALID_CERT:${connection.clientCertificate.certificates.leaf.serialNumber}`); console.log(`Allowing connection for valid certificate: ${connection.clientCertificate.certificates.leaf.serialNumber}`); return connection.allow(); }

Wird immer verwendet async/await , wenn KeyValueStore Methoden oder andere asynchrone Operationen aufgerufen werden. Die Laufzeitumgebung der Verbindungsfunktion verarbeitet die Zusagen automatisch und gewährleistet einen ordnungsgemäßen Ausführungsablauf innerhalb der strengen Zeitbeschränkungen der TLS-Handshake-Verarbeitung. Vermeiden Sie die Verwendung von.then () oder Callback-Mustern, da dies async/await für eine sauberere Fehlerbehandlung und eine bessere Leistung in der Verbindungsfunktionsumgebung sorgt.

Strukturieren Sie Ihren Code beim Entwerfen asynchroner Verbindungsfunktionen so, dass die Anzahl der KeyValueStore Operationen minimiert wird, und führen Sie sie so früh wie möglich in Ihrer Validierungslogik aus. Dies gewährleistet maximale Leistung und reduziert das Risiko von Timeout-Problemen in Zeiten mit hohem Datenaufkommen. Erwägen Sie, Validierungsprüfungen zu stapeln und die effizienteste KeyValueStore Methode (exists () oder get ()) für Ihren Anwendungsfall zu verwenden.

Beispiele für Codes für Verbindungsfunktionen

Die folgenden Beispiele veranschaulichen gängige Verbindungsfunktionsmuster für verschiedene Überprüfungsszenarien. Verwenden Sie diese Beispiele als Ausgangspunkt für Ihre eigenen Implementierungen von Verbindungsfunktionen.

Beispiel: Validierung des Gerätezertifikats

In diesem Beispiel werden Geräteseriennummern und Betrefffelder für Zertifikate für IoT-Geräte, Spielekonsolen und andere Client-Authentifizierungsszenarien validiert:

async function connectionHandler(connection) { // Custom validation: check device serial number format const serialNumber = connection.clientCertificate.certificates.leaf.serialNumber; if (!serialNumber.startsWith("DEV")) { connection.logCustomData(`INVALID_SERIAL:${serialNumber}`); return connection.deny(); } // Validate certificate subject contains required organizational unit const subject = connection.clientCertificate.certificates.leaf.subject; if (!subject.includes("OU=AuthorizedDevices")) { connection.logCustomData(`INVALID_OU:${subject}`); return connection.deny(); } // Allow connection for valid devices connection.logCustomData(`VALID_DEVICE:${serialNumber}`); return connection.allow(); }

Diese Funktion führt über die standardmäßige Zertifikatsvalidierung hinaus mehrere Validierungsprüfungen durch, einschließlich der Überprüfung des Formats der Geräteseriennummer und der Überprüfung der Organisationseinheit.

Beispiel: Optionale mTLs mit gemischter Authentifizierung

In diesem Beispiel werden sowohl mTLS- als auch Nicht-MTLS-Verbindungen mit unterschiedlichen Authentifizierungsrichtlinien behandelt:

async function connectionHandler(connection) { if (connection.clientCertificate) { // mTLS connection - enhanced validation for certificate holders const subject = connection.clientCertificate.certificates.leaf.subject; connection.logCustomData(`MTLS_SUCCESS:${subject}:${connection.clientIp}`); console.log(`mTLS connection from: ${subject}`); return connection.allow(); } else { // Non-mTLS connection - apply IP-based restrictions const clientIp = connection.clientIp; // Only allow non-mTLS from specific IP ranges if (clientIp.startsWith("203.0.113.") || clientIp.startsWith("198.51.100.")) { connection.logCustomData(`NON_MTLS_ALLOWED:${clientIp}`); console.log(`Non-mTLS connection allowed from: ${clientIp}`); return connection.allow(); } connection.logCustomData(`NON_MTLS_DENIED:${clientIp}`); return connection.deny(); } }

Diese Funktion bietet erhöhte Sicherheit für Clients mit Zertifikaten und gewährleistet gleichzeitig die Kompatibilität mit älteren Clients aus vertrauenswürdigen IP-Bereichen.