Чего я хочу достичь: 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 увеличивает адрес, но страница просто обновляется в каталоге "/".
А точнее:
Из того, что я могу видеть ... Я думаю, что где-то создаю петлю. Если кто-нибудь знает, что мне нужно сделать, чтобы сделать это функциональным, помощь будет принята с благодарностью.
ПРИМЕЧАНИЕ Вышеуказанное поведение наблюдается в Firefox, в Chrome Я получаю одну из 2 ошибок в журнале ошибок сервера, в зависимости от внесенных изменений:
- 2019/09/29 19:59:37 http: Ошибка квитирования TLS от [:: 1]: 53287: EOF
- 2019/09/29 19:15:59 http: Ошибка квитирования TLS от [:: 1]: 50457: tls: клиент не поддерживает выбранный сертификат