it-swarm.com.de

Was ist die richtige HTTP-Antwort zum Senden von Anforderungen, die SSL/TLS erfordern?

Ich entwerfe eine RESTful-API, bei der einige Aufrufe über HTTP öffentlich sind und andere einen API-Schlüssel und eine Verschlüsselung über HTTPS erfordern. Ich überlege, welcher Antwortcode gesendet werden soll, wenn eine HTTP-Anfrage an eine der privaten Ressourcen gesendet wird. Bisher ist die einzige, die mir auf die Nerven springt 412 - Vorbedingung fehlgeschlagen , aber der Standard gibt an, dass die Vorbedingung vom Anforderer und nicht vom Server auferlegt wird.

Gibt es einen geeigneten Antwortcode für diese Bedingung oder muss ich nur nachgeben und 400 tun?

44
gtd

Die sicherste Möglichkeit, den HTTP-Client zur Verwendung von HTTPS zu zwingen, ist HTTP Strict Transport Security .

Früher war es üblich, die Verbindung zu trennen, aber diese Praxis wurde zugunsten von HSTS (OWASP-Website) entfernt.

6
Brian Clozel

Ich kann nicht sagen, ob dies von HTTP-Clients allgemein akzeptiert wird, aber wenn ich nur RFC spreche, sollte der Server antworten mit:

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

Quelle:
http://tools.ietf.org/html/rfc2817#section-4.2

27
MicE

Der entsprechende Fehlercode für die Rückgabe wäre ähnlich wie 403.4 - SSL erforderlich .

Obwohl dies im RFC für HTTP 1.1 nicht explizit dokumentiert ist, entspricht dieses Verhalten den dort aufgeführten Anforderungen:

Der Server hat die Anfrage verstanden, lehnt sie jedoch ab. Die Autorisierung hilft nicht und die Anfrage SOLLTE NICHT wiederholt werden. Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte, warum die Anforderung nicht erfüllt wurde, SOLLTE er den Grund für die Ablehnung in der Entität beschreiben. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Not Found) verwendet werden.

Das Hinzufügen eines eigenen Subcodes (wie im SSL-Beispiel) kann in einigen Fällen hilfreich sein. Da dieser Subcode für Dritte jedoch keine Bedeutung hat, würde ich davon abraten.

Ihre letzte Fehlermeldung wäre also "403 - Private Resource". Beachten Sie, dass auch im Fall eines fehlenden API-Schlüssels "401 - Unauthorized" nicht verwendet werden sollte, es sei denn, Ihr API-Schlüssel kann tatsächlich in einem WWW-Authenticate-Headerfeld übertragen werden.

6
mdb

Die Rückgabe von 403 mit dem Begründungssatz " HTTPS Required " scheint eine praktische Option zu sein, und was ich verwende.

siehe https://en.wikipedia.org/wiki/HTTP_403

Das Umleiten einer REST-API ist keine gute Idee, zumal Sie möglicherweise keine Ahnung haben, wie oder was Ihren Service verbraucht.

4
NER1808

Senden Sie einfach eine Weiterleitung an die entsprechende https: URI.

UPDATE

Das ist eine falsche Antwort - siehe Kommentare unten

0
Jan Algermissen