2017-10-15 3 views
0

Ich habe Probleme beim Umleiten von HTTP-Verkehr in HTTPS in meiner EC2-Instanz auf einem Golang-Service. Die Verbindung funktioniert einwandfrei, wenn Sie direkt zu https://sub.domain.com gehen, aber die Umleitung von HTTP scheint nicht zu funktionieren.Golan Redirect zu HTTPS in AWS

Es gibt keinen Load Balancer und es wird nur das net/http-Paket als Webserver verwendet.

Ich verwende auch iptables, die HTTP/HTTPS-Anfragen an Ports 8080/8081 jeweils umleiten sollten.

Um die Möglichkeiten einzuschränken, verfügt die Sicherheitsgruppe, die auf die Instanz angewendet wird, über Verbindungen zu den Ports 80 und 443, die von einer beliebigen IPv4- oder IPv6-Adresse aus zulässig sind.

Hier ist der Server-Code, der HTTPS bedient und HTTP-Anfragen umleiten soll;

// LetsEncrypt setup 
    certManager := autocert.Manager{ 
      Prompt:  autocert.AcceptTOS, 
      HostPolicy: autocert.HostWhitelist("sub.domain.com"), // your domain here 
      Cache:  autocert.DirCache("certs"),   // folder for storing certificates 
    } 
    server := &http.Server{ 
      Addr:  ":8081", 
      Handler: context.ClearHandler(http.DefaultServeMux), 
      TLSConfig: &tls.Config{GetCertificate: certManager.GetCertificate}, 
    } 
    // open https server 
    err = server.ListenAndServeTLS("", "") 
    if err != nil { 
      fmt.Printf("ListenAndServe: %s\n", err) 
    } 
    // redirect everything to https 
    go http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      reqhost := strings.Split(r.Host, ":")[0] 
      http.Redirect(w, r, "https://" + reqhost + r.URL.Path, http.StatusMovedPermanently) 
    })) 

Hier sind meine PREROUTING Regeln von iptables, andere Ketten sind leer;

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) 
pkts bytes target  prot opt in  out  source    destination 
    7 420 REDIRECT tcp -- eth0 any  anywhere    anywhere    tcp dpt:https redir ports 8081 
    45 2508 REDIRECT tcp -- eth0 any  anywhere    anywhere    tcp dpt:http redir ports 8080 

Beide Umleitungen werden immer Pakete auf Anfragen, aber die 8080 einfach gewohnt die Verbindung zum HTTPS Seite umleiten.

+0

verwenden Sie einen beliebigen Webserver (nginx oder apache) für Ihre Anwendung –

+0

Kein Webserver, nur das net/http-Paket. – manifest

+0

* "8080 wird die Verbindung nicht umleiten" * Also, wenn es nicht die HTTP-Weiterleitung macht, was macht es dann **? Behandeln Sie die Anfrage wie gewohnt? Auszeit? Verbindung abgelehnt? –

Antwort

0

Sie fehlen port in der Umleitung

http.Redirect (w, r, "https: //" + reqhost + r.URL.Path + ":" + port, http.StatusMovedPermanently)

Sie müssen dort Port hinzufügen. Sie können auch Postbote in der Anfrage verwenden, um zu sehen, was die Standort-URL ist, die gesendet wird.

Ich hoffe, es hilft.

+0

Versucht dieser Fix, kann selbst Postbote keine Antwort bekommen. Sollte der Port nicht nach dem Host eingefügt werden, nicht der gesamte Pfad? – manifest

+0

Lesen Sie die bearbeitete Frage. Das Setup verwendet iptables, um 80> 8080 und 443> 8081 zuzuordnen. Es müssen keine Ports in der Umleitung angegeben werden. –

0

überprüfte ich, was mit

netstat -tulpn | grep LISTEN 

auf meine Ports zuhörte ..und es war Apache auf Port 80. Entweder es heruntergefahren oder entfernt es ganz gut funktioniert.