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.
- Stellen Sie sicher, dass Sie der Quelle von selbstsignierten Zertifikaten vertrauen.
Akzeptieren von Clientzertifikaten im Verbrauchstarif
Die Nutzungsebene in der API-Verwaltung ist so konzipiert, dass sie den Prinzipien des serverlosen Designs entspricht. 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>