2017-05-15 16 views
1

Ich stelle ein Docker-Image auf Azure bereit, das eine REST-API veröffentlicht, die ich zum Speichern einiger Informationen in einer Datenbank verwenden kann.
Die Frage ist: Ist es möglich, HTTPS anstelle von HTTP zu erzwingen und ein selbstsigniertes Zertifikat zu verwenden?HTTPS auf Azure-RESTAPI

so, wenn meine Ruhe api so etwas wie dieses:

curl -i -H "Content-type: application/json" http://AZURE_IP_ADDRESS:5100/module/api/v1.0/person -X POST -d '{ "name" : "test", "surname": "test_surname" }' 

Ich möchte, dass nur Zertifikat Maschinen den vorherigen Befehl ausführen können.

Soweit ich verstanden Azure arbeitet mit Zertifikat registrieren von einem Truster CA, aber ich möchte einige Tests vor, um alles zu tun.

In wenigen Worten möchte ich eine REST-API nur aufrufen, wenn der Rechner, auf dem ich die HTTPS-Anfrage durchführe, "Erlaubt" ist, um die Anfrage auszuführen.
Ich bin ein bisschen verwirrt. Ich meine, ich möchte wissen, wie ich meine REST-API schützen kann, die von meinem Andockfenster auf Azure bereitgestellt wird. Aber ich möchte generischer sein ... in Bezug darauf, nicht nur Azure-Funktionalität zu verwenden und bereit zu sein, wenn ich etwas anderes verwende Azurblau.

von unten wie folgt:

# Create the CA Key and Certificate for signing Client Certs 
openssl genrsa -des3 -out ca.key 4096 
openssl req -new -x509 -days 365 -key ca.key -out ca.crt 

# Create the Server Key, CSR, and Certificate 
openssl genrsa -des3 -out server.key 1024 
openssl req -new -key server.key -out server.csr 

# We're self signing our own server cert here. This is a no-no in production. 
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt 

# Create the Client Key and CSR 
openssl genrsa -des3 -out client.key 1024 
openssl req -new -key client.key -out client.csr 

# Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do. 
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt 



openssl rsa -in server.key -out server_without_key.key  

und konfigurieren nginx.conf wie folgt:

server { 
     listen 443 ssl; 


     ssl_certificate  /etc/nginx/certs/server.crt; 
     ssl_certificate_key /etc/nginx/certs/server_without_key.key; 
     ssl_client_certificate /etc/nginx/certs/ca.crt; # the cert used to sign the client certificates 
     ssl_verify_client  on; # force SSL verification (can also be set to 'optional') 


     ssl  on; 
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     ssl_prefer_server_ciphers on; 
     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
     ssl_session_cache shared:SSL:10m; 
     ssl_session_timeout 10m; 
     keepalive_timeout 70; 

    } 

Sobald ich curl:

curl -v -s -k --key client.key --cert client.crt https://172.18.0.9 

(im dir` wo Kunden. Taste und * crt sind gespeichert) Ich habe folgenden Ausgang

* Rebuilt URL to: https://172.18.0.9/ 
* Trying 172.18.0.9... 
* Connected to 172.18.0.9 (172.18.0.9) port 443 (#0) 
* found 173 certificates in /etc/ssl/certs/ca-certificates.crt 
* found 698 certificates in /etc/ssl/certs 
* ALPN, offering http/1.1 
* error reading X.509 key or certificate file: Error while reading file. 
* Closing connection 0 

Irgendwelche Vorschläge? Ist es möglich?

Dank

Antwort

2

Abhängig von dem Web-Server Sie Ihre genauen Konfigurationsdetails verwenden, werden variieren, aber in dem Punkt gebracht, was Sie tun möchten, ist es, alle HTTP-Anfragen auf https umgeleitet werden. Siehe unten für einige Links.

Auf der Client-Seite, damit dies funktioniert, müssen Sie der Umleitung folgen. In der Regel sind die Browser so konfiguriert, dass dies automatisch geschieht. Durch die Verwendung von Curl wird dies durch die -L-Flagge erreicht.

curl -L -i -H "Content-type: application/json" http://AZURE_IP_ADDRESS:5100/module/api/v1.0/person -X POST -d '{ "name" : "test", "surname": "test_surname" }' 

Auf der Serverseite sind dies Anweisungen, die helfen könnten.

NGINX https://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom

Apache https://wiki.apache.org/httpd/RedirectSSL

IIS https://www.iis.net/configreference/system.webserver/httpredirect

+0

Beachten Sie, dass für eine API nicht wirklich viel Sinn Umleitungen machen. Abhängig von der Client-Bibliothek können sie ihnen folgen oder nicht. Ehrlich gesagt würde ich lieber eine Antwort zurückgeben, dass dies nicht unterstützt wird, oder sogar HTTP komplett deaktivieren.Da Sie mit APIs nicht das Problem haben, dass jemand Ihren Domain-Namen in einen Browser eingibt und standardmäßig zu HTTP geht. Mit APIs kann der Entwickler sofort HTTPS verwenden. Geben Sie ihnen einen Fehler, wenn sie HTTP versuchen, würden sie ihnen sagen, dass sie HTTPS-URLs für den Zugriff verwenden müssen. – juunas

+0

Redirects sind korrekt, da Entwickler einer API-Client-Anwendung verstehen sollten, was HTTP-Statuscode 301 bedeutet. Sie könnten einen Körper hinzufügen, wie Sie es mit einer Antwort vorschlagen, aber das ist möglicherweise nicht einfach mit einer Webserver-Konfiguration zu erreichen. –