Schützen von APIs mithilfe von Zertifikaten
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.
Autorisierungsrichtlinien für Zertifikate
Erstellen Sie im API Management-Gateway in der Richtliniendatei für die Verarbeitung von eingehendem Datenverkehr die folgenden Richtlinien:
Ü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>