Schützen von APIs mithilfe von Zertifikaten

Abgeschlossen

Zertifikate eignen sich zur gegenseitigen TLS-Authentifizierung (Transport Layer Security) zwischen Client und API-Gateway. Das API Management-Gateway kann so konfiguriert werden, dass nur Anforderungen mit Zertifikaten zugelassen werden, die einen bestimmten Fingerabdruck enthalten. Auf der Gatewayebene erfolgt die Autorisierung über eingehende Richtlinien.

Transport Layer Security-Clientauthentifizierung

Mithilfe der TLS-Clientauthentifizierung kann das API Management-Gateway ein Zertifikat in der Clientanforderung nach den folgenden Eigenschaften überprüfen:

Eigenschaft BESCHREIBUNG
Zertifizierungsstelle Es werden nur Zertifikate einer bestimmten Zertifizierungsstelle zugelassen.
Fingerabdruck Zertifikate mit einem angegebenen Fingerabdruck werden zugelassen.
Betreff Es werden nur Zertifikate mit einem angegebenen Betreff zugelassen.
Ablaufdatum Abgelaufene Zertifikate nicht zulassen

Diese Eigenschaften schließen sich nicht gegenseitig aus und können miteinander kombinieren werden, um eigene Richtlinienanforderungen zu erstellen. Sie können z. B. angeben, dass das in der Anforderung übergebene Zertifikat signiert und noch gültig sein muss.

Clientzertifikate werden signiert, um sie vor Manipulation zu schützen. Wenn Sie ein Zertifikat von einem Partner erhalten, überprüfen Sie, dass es tatsächlich von ihm und nicht von einem Betrüger gesendet wurde. Zur Überprüfung eines Zertifikats gibt es zwei gängige Möglichkeiten:

  • Überprüfen Sie, von wem das Zertifikat ausgestellt wurde. Handelt es sich dabei um eine vertrauenswürdige Zertifizierungsstelle, können Sie das Zertifikat verwenden. Im Azure-Portal können Sie vertrauenswürdige Zertifizierungsstellen konfigurieren, um diesen Vorgang zu automatisieren.
  • Wurde das Zertifikat von einem Partner ausgestellt, überprüfen Sie, dass es auch wirklich von ihm stammt. Wurde das Zertifikat beispielweise persönlich bereitgestellt, können Sie sicher sein, dass es echt ist. Ein solches Zertifikat wird als selbstsigniertes Zertifikat bezeichnet.

Akzeptieren von Clientzertifikaten im Verbrauchstarif

Der Verbrauchstarif in API Management wurde für serverlose Designprinzipale konzipiert. Dieser Tarif eignet sich für das Erstellen von APIs auf Grundlage von serverlosen Technologien, wie z. B. Azure Functions. Die Verwendung von Clientzertifikaten muss im Verbrauchstarif explizit aktiviert werden (über die Seite Benutzerdefinierte Domänen). Dieser Schritt ist in anderen Tarifen nicht erforderlich.

Konfigurieren des Gateways zum Anfordern von Zertifikaten

Autorisierungsrichtlinien für Zertifikate

Erstellen Sie im API Management-Gateway in der Richtliniendatei für die Verarbeitung von eingehendem Datenverkehr die folgenden Richtlinien:

Schaltfläche für die Richtlinie zur Verarbeitung von eingehendem Datenverkehr

Überprüfen des Fingerabdrucks eines Clientzertifikats

Jedes Clientzertifikat enthält einen Fingerabdruck. Dabei handelt es sich um einen Hash, der aus anderen Zertifikateigenschaften berechnet wird. Durch den Fingerabdruck wird sichergestellt, dass die Werte innerhalb des Zertifikats seit der Ausstellung durch die Zertifizierungsstelle nicht mehr geändert wurden. Sie können den Fingerabdruck in der Richtlinie überprüfen. Im folgenden Beispiel wird der Fingerabdruck des Zertifikats überprüft, das in der Anforderung übergeben wurde:

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

Überprüfen des Fingerabdrucks anhand von in API Management hochgeladenen Zertifikaten

Da im vorherigen Beispiel nur ein Fingerabdruck funktioniert, wurde auch nur ein Zertifikat überprüft. In der Regel übergibt jedoch jeder Kunde oder jedes Partnerunternehmen ein unterschiedliches Zertifikat mit einem unterschiedlichen Fingerabdruck. Rufen Sie für dieses Szenario die Zertifikate Ihrer Partner ab, und laden Sie sie im Azure-Portal auf der Seite Clientzertifikate in die API Management-Ressource hoch. Fügen Sie anschließend Ihrer Richtlinie den folgenden Code hinzu:

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Request.Certificate.Verify()  || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

Überprüfen von Aussteller und Betreff eines Clientzertifikats

Im folgenden Beispiel werden Aussteller und Betreff des Zertifikats überprüft, das in der Anforderung übergeben wurde:

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Issuer != "trusted-issuer" || context.Request.Certificate.SubjectName.Name != "expected-subject-name")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>