为了账号安全,请及时绑定邮箱和手机立即绑定

我是否可以在使用 MTLS 保护所有其他 HTTP 请求的同时,使用不安全的 GET HTTP 请求

我是否可以在使用 MTLS 保护所有其他 HTTP 请求的同时,使用不安全的 GET HTTP 请求

Go
沧海一幻觉 2022-10-04 19:27:06
我有一个用戈兰语编写的HTTP REST服务,演示了我正在尝试的内容。我希望 GET 请求不安全,而所有其他 REST 请求都使用 MTLS 进行保护。我的实现已经使用了gin Web服务器库,所以如果可能的话,我想坚持下去。我的问题是,我只能将tlsConfig应用于两个组,或者两者都不应用。我无法找到在小组级别应用它的方法。package mainimport (    "crypto/tls"    "crypto/x509"    "errors"    "fmt"    "io/ioutil"    "net/http"    "log"    "github.com/gin-gonic/gin")func main() {    router := gin.Default()    // Unprotected public router for GET requests    public := router.Group("/")    // Private router with MTLS    private := router.Group("/")    public.GET("/insecure-ping", func(c *gin.Context) {        c.JSON(200, gin.H{            "message": "insecure pong",        })    })    private.POST("/secure-ping", func(c *gin.Context) {        c.JSON(200, gin.H{            "message": "secure pong",        })    })    // Get the SystemCertPool, continue with an empty pool on error    rootCAs, err := x509.SystemCertPool()    if err != nil {        log.Fatal(err)    }    if rootCAs == nil {        rootCAs = x509.NewCertPool()    }    // Create a CA certificate pool and add cacert.pem to it    caCert, err := ioutil.ReadFile("cacert.pem")    if err != nil {        log.Fatal(err)    }    if ok := rootCAs.AppendCertsFromPEM(caCert); !ok {        err := errors.New("failed to append CA cert to local system certificate pool")        log.Fatal(err)    }    server := http.Server{        Addr:    fmt.Sprintf(":%v", 8080),        Handler: router,    }    server.TLSConfig = &tls.Config{        RootCAs: rootCAs,    }    err = server.ListenAndServeTLS("certificate.crt", "privateKey.key")    if err != nil {        log.Fatal(err)    }}
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

只需创建两个实例并同时运行它们,一个使用 配置相同的路由,另一个使用 配置。由于 HTTP 和 HTTPS 在不同的端口上运行,因此它们必须具有不同的侦听器,但两个侦听器都可以使用相同(或不同)的处理程序。例如:ServerListenAndServeListenAndServeTLS


publicRouter := gin.Default()


// Unprotected public router for GET requests

public := publicRouter.Group("/")


public.GET("/insecure-ping", func(c *gin.Context) {

    c.JSON(200, gin.H{

        "message": "insecure pong",

    })

})


server := http.Server{

    Addr:    fmt.Sprintf(":%v", 8081), // Or whatever

    Handler: publicRouter,

}


go func() {

    err = tlsServer.ListenAndServe()

    if err != nil {

        log.Fatal(err)

    }

}()


// Private router with MTLS

router := gin.Default()

private := router.Group("/")


private.POST("/secure-ping", func(c *gin.Context) {

    c.JSON(200, gin.H{

        "message": "secure pong",

    })

})


// Get the SystemCertPool, continue with an empty pool on error

rootCAs, err := x509.SystemCertPool()

if err != nil {

    log.Fatal(err)

}

if rootCAs == nil {

    rootCAs = x509.NewCertPool()

}


// Create a CA certificate pool and add cacert.pem to it

caCert, err := ioutil.ReadFile("cacert.pem")

if err != nil {

    log.Fatal(err)

}


if ok := rootCAs.AppendCertsFromPEM(caCert); !ok {

    err := errors.New("failed to append CA cert to local system certificate pool")

    log.Fatal(err)

}


tlsServer := http.Server{

    Addr:    fmt.Sprintf(":%v", 8080),

    Handler: router,

}


tlsServer.TLSConfig = &tls.Config{

    RootCAs: rootCAs,

}


err = tlsServer.ListenAndServeTLS("certificate.crt", "privateKey.key")

if err != nil {

    log.Fatal(err)

}



查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号