Чего я хочу достичь: сервер HTTPS, специально разработанный для доставки двоичных файлов примерно на 1000 устройств, иногда одновременно (клиенты будут получать двоичные файлы через wget, curl, загрузку браузера и т. д.).
Основные функциональные возможности:
- клиент не сможет скачать бинарник без сертификата
- сервер разрешит просмотр/загрузку клиентского каталога через браузер (если у клиента есть сертификат)
- сервер оптимизирован для стабильности и безопасности, затем для скорости
- сервер должен использовать шифры высокой безопасности и TLS1.2
Чего мне удалось достичь
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
http.ServeFile(w, req, "/")
})
log.Printf("Server running\nAccess the server via: https://localhost:9900/")
log.Fatal(http.ListenAndServeTLS(":9900", "cert.crt", "priv.key", http.FileServer(http.Dir("/"))))
}
Теперь это работает нормально, хотя он не проверяет все функции и не очень гибкий, и почему-то я хотел сделать его более надежным в будущем, так как я хочу учиться, создавая этот проект, а также расширять его в будущем, когда я Мне интересно узнать больше о серверах.
После небольшого исследования я нашел несколько фрагментов кода на GitHub и в учебных пособиях, которые привели меня к следующему фрагменту кода:
package main
import (
"crypto/tls"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
w.Header().Add("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
http.ServeFile(w, req, "/")
})
cfg := &tls.Config{
MinVersion: tls.VersionTLS12,
CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
PreferServerCipherSuites: true,
CipherSuites: []uint16{
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_RSA_WITH_AES_256_CBC_SHA,
tls.TLS_AES_256_GCM_SHA384,
},
}
srv := &http.Server{
Addr: ":9900",
Handler: mux,
TLSConfig: cfg,
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
}
log.Printf("Server running\nAccess the server via: https://localhost:9900/")
log.Fatal(srv.ListenAndServeTLS("cert.crt", "priv.key"), http.FileServer(http.Dir("/")))
}
Проблема в том, что когда сервер запускается и я подключаюсь к нему через браузер, мне предоставляется корневой каталог, но каждый раз, когда я нажимаю на папку, URL-адрес увеличивает адрес, но страница просто обновляется в каталоге «/».
Если быть точным:
- Сначала я подключаюсь к серверу, и мне показывают корневой каталог, мне показывают Dir1, Dir2, Dir3.
- Я нажимаю Dir1
- URL-адрес изменяется с https://localhost:9900 на https://localhost:9900/Dir1
- Но я все еще в корневом каталоге
Из того, что я могу видеть... я думаю, что где-то создаю петлю. Если кто-нибудь знает, что мне нужно сделать, чтобы сделать это функциональным, помощь будет очень признательна.
ПРИМЕЧАНИЕ Вышеприведенное поведение наблюдается в Firefox, в Chrome я получаю одну из двух ошибок в журнале ошибок сервера, в зависимости от внесенных изменений:
- 2019/09/29 19:59:37 http: ошибка рукопожатия TLS от [::1]:53287: EOF
- 2019/09/29 19:15:59 http: ошибка рукопожатия TLS от [::1]:50457: tls: клиент не поддерживает выбранный сертификат
/
(третий аргумент ServeFile), независимо от пути запроса. Рассматривали ли вы https://golang.org/pkg/net/http/#FileServer? - person Peter   schedule 29.09.2019http.FileServer
и три его примера: https://golang.org/pkg/net/http/#FileServer - person Adrian   schedule 30.09.2019