猿问

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

我有一个用戈兰语编写的HTTP REST服务,演示了我正在尝试的内容。

我希望 GET 请求不安全,而所有其他 REST 请求都使用 MTLS 进行保护。我的实现已经使用了gin Web服务器库,所以如果可能的话,我想坚持下去。

我的问题是,我只能将tlsConfig应用于两个组,或者两者都不应用。我无法找到在小组级别应用它的方法。

package main


import (

    "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)

    }

}


沧海一幻觉
浏览 129回答 1
1回答

开满天机

只需创建两个实例并同时运行它们,一个使用 配置相同的路由,另一个使用 配置。由于 HTTP 和 HTTPS 在不同的端口上运行,因此它们必须具有不同的侦听器,但两个侦听器都可以使用相同(或不同)的处理程序。例如:ServerListenAndServeListenAndServeTLSpublicRouter := gin.Default()// Unprotected public router for GET requestspublic := 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 MTLSrouter := 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 errorrootCAs, 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 itcaCert, 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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答