gpt4 book ai didi

go - 创建HTTPS服务器以服务二进制文件和其他文件时出现问题

转载 作者:行者123 更新时间:2023-12-01 22:17:51 25 4
gpt4 key购买 nike

我要实现的目标:
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:来自[:: 1]:50457的TLS握手错误:tls:客户端不支持所选证书
  • 最佳答案

    其他地方有一些有关如何执行此操作的示例(如前所述)。

    这是一个工作示例,其中文件服务器处理程序是标准库中的增强版本,它支持更多的缓存头和本地压缩的文件。如果需要,可以将标准文件服务器处理程序放入此处。

    package main

    import (
    "crypto/tls"
    "flag"
    "fmt"
    "log"
    "net/http"
    "time"

    "github.com/rickb777/servefiles/v3"
    )

    var path = flag.String("path", "..", "directory for the files tp be served")
    var cert = flag.String("cert", "", "file containing the certificate (optional)")
    var key = flag.String("key", "", "file containing the private key (optional)")
    var port = flag.Int("port", 8080, "TCP port to listen on")
    var maxAge = flag.String("maxage", "", "Maximum age of assets sent in response headers - causes client caching")
    var verbose = flag.Bool("v", false, "Enable verbose messages")

    func main() {
    flag.Parse()

    if *verbose {
    servefiles.Debugf = log.Printf
    }

    if (*cert != "" && *key == "") ||
    (*cert == "" && *key != "") {
    log.Fatal("Both certificate file (-cert) and private key file (-key) are required.")
    }

    h := servefiles.NewAssetHandler(*path)

    if *maxAge != "" {
    d, err := time.ParseDuration(*maxAge)
    log.Printf("MaxAge: %s %v\n", d, err)
    h = h.WithMaxAge(d)
    }

    srv := &http.Server{
    Addr: fmt.Sprintf(":%d", *port),
    Handler: h,
    }

    if *cert != "" {
    srv.TLSConfig = &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,
    },
    }
    log.Printf("Access the server via: https://localhost:%d/", *port)
    log.Fatal(srv.ListenAndServeTLS(*cert, *key))

    } else {
    log.Printf("Access the server via: http://localhost:%d/", *port)
    log.Fatal(srv.ListenAndServe())
    }
    }

    源代码 https://github.com/rickb777/servefiles/blob/master/v3/webserver/example.go

    关于go - 创建HTTPS服务器以服务二进制文件和其他文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157860/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com