2014-05-06 10 views
9

Poniżej jest mój TLS backend:Golang ListenAndServeTLS zwraca dane, gdy nie jest używany https w przeglądarce

package main 

import (
    "fmt" 
    "net/http" 
) 

const (
    PORT  = ":8443" 
    PRIV_KEY = "./private_key" 
    PUBLIC_KEY = "./public_key" 
) 

func rootHander(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, "Nobody should read this.") 
} 

func main() { 
    http.HandleFunc("/", rootHander) 
    err := http.ListenAndServeTLS(PORT, PUBLIC_KEY, PRIV_KEY, nil) 
    if err != nil { 
     fmt.Printf("main(): %s\n", err) 
    } 
} 

Klucze są generowane przy użyciu tych dwóch wierszy:

openssl genrsa -out private_key 2048 
openssl req -new -x509 -key private_key -out public_key -days 365 

Kiedy uruchomić serwer TLS i odwiedź witrynę za pomocą przeglądarki (https://example.com:8443) Otrzymuję oczekiwany wynik, po ignorując ostrzeżenie przeglądarki:

Nobody should read this. 

Do tej pory wszystko jest w porządku.

Teraz, kiedy momencie moja przeglądarka http://example.com:8443 (zauważ, że HTTP jest używany, nie https) pojawia się następujący wynik dla Firfox (Chrome robi to samo, ale pobierając stronę):

using http

Pytanie: Dlaczego istnieje znak zapytania?

+0

Czy https://groups.google.com/forum/#!topic/golang-nuts/ZtP5vPPeyHE pracy dla Ciebie ? – ddevienne

Odpowiedz

9

Po dopisaniu wyniku do od, curl -k -3 http://localhost:8443 | od -A n -t x1, otrzymasz następującą sekwencję bajtów 15 03 01 00 02 02 0a, która jest renderowana/obsługiwana przez przeglądarkę.

Które według https://code.google.com/p/go/issues/detail?id=2253, jest TLS dla "Nie rozumiem, co powiedziałeś."

+2

Tak, to jest zgodne z projektem. Jeśli chcę zezwolić tylko na https, powinienem przekierować, prawda? – Kiril

+0

@Kiril Czy istnieje już rozwiązanie tego problemu? Co masz na myśli przez "przekierowanie"? – codepushr

+0

To jest właściwie oczekiwane zachowanie. Możesz sprawdzić https://golang.org/pkg/net/http/#Request (TLS), aby dowiedzieć się, czy żądanie używa protokołu http lub https. – Kiril

4

Jeśli w ogóle jeszcze dowiemy się z:

http.ListenAndServeTLS(...) trwa certyfikat i klucza prywatnego nie publicznego & klucza prywatnego.

+0

Dzięki za wyjaśnienia. Więc utworzyłem certyfikat z odpowiednim kluczem prywatnym? – Kiril

+1

Tak.Utworzono certyfikat z kluczem prywatnym. Właśnie nazwałeś certyfikat "public_key". Zwykle robi się to mniej więcej tak: '-out cert.pem'. – SunSparc

1

Oto kod do przekierowywania żądań na porcie 80 do 443 oraz do serwowania certyfikatów TTL za pomocą CA, takiego jak umożliwia zaszyfrowanie. Wiem, że z pozwala szyfrować (letsencrypt.org), które chcesz odwołać się do wynikowego pliku fullchain.pem, a także privkey.pem.

Największym problemem z samodzielnym podpisywaniem jest to, że nie będzie on bardzo opłacalny w produkcji. Z golangiem naprawdę konfigurujemy nasze aplikacje, więc coś prostego, jak poprawne podłączenie certyfikatów TLC, jest ważnym tematem, kiedy jesteśmy gotowi do uruchomienia.

tutaj jakiś prosty kod I rzeczywiście wykorzystane do przeprowadzenia statycznej strony:

package main 
import (
"net/http" 
"log" 
) 
func redirect(w http.ResponseWriter, req *http.Request) { 
// remove/add not default ports from req.Host 
target := "https://" + req.Host + req.URL.Path 
if len(req.URL.RawQuery) > 0 { 
    target += "?" + req.URL.RawQuery 
} 
log.Printf("redirect to: %s", target) 
http.Redirect(w, req, target, 
     http.StatusTemporaryRedirect) 
} 


func main() { 
//define a variable for the FileServer directory in this case ./static/ 
var fs = http.FileServer(http.Dir("static")) 
//express the handler function 
http.Handle("/", fs) 
//We should redirect requests on port 80 
go http.ListenAndServe(":80", http.HandlerFunc(redirect)) 
//finally we Listen for requests and serve them up on a specific port 
http.ListenAndServeTLS(":443", "fullchain.pem", "privkey.pem", nil) 

} 
Powiązane problemy