[Go] gin framework https

gin 프레임워크를 사용하여 웹서버 배포 연습을 하던 중, http가 아닌 https가 필요하게 되었다.

찾아보니 go 자체에서 http를 https로 변환하기 위한 TLS 인증서를 만드는 방법이 있었다.

1. Go 자체 서명

1.1. TLS 인증서 파일 생성

$ go run /usr/local/go/src/crypto/tls/generate_cert.go --rsa-bits=2048 --host=localhost

위 명렁어를 실행하면 cert.pem과 key.pem 두 개의 파일이 생성된다.

1.2. 테스트

// https.go
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/unrolled/secure"
)

func main() {
    secureFunc := func() gin.HandlerFunc {
        return func(c *gin.Context) {
            secureMiddleware := secure.New(secure.Options{
                SSLRedirect: true,
                SSLHost:     "localhost:8083",
            })
            err := secureMiddleware.Process(c.Writer, c.Request)

            // If there was an error, do not continue.
            if err != nil {
                return
            }

            c.Next()
        }
    }()

    router := gin.Default()
    router.Use(secureFunc)

    router.GET("/", func(c *gin.Context) {
        c.String(200, "HELLO HTTPS GIN")
    })

    // HTTP
    //go router.Run(":8066")

    router.RunTLS(":8083", "cert.pem", "key.pem")
}
// 위 코드 실행
$ go run https.go

https://localhost:8083으로 접속

경고 창이 뜨긴 하나 https로 웹서버가 실행된다.

2. mkcert

경고 창이 뜨는게 싫다면 mkcert 프로그램을 이용하여 TLS 인증서를 만든다.

2.1. mkcert 설치

설치 방법은 https://velog.io/@bsy/HTTPS-CA를 참조하였다.

# Ubuntu에서 mkcert 설치
$ sudo apt install libnss3-tools
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

# 로컬을 인증된 발급기관으로 추가
$ mkcert -install

2.2 TLS 인증서 파일 생성

mkcert 설치 이후 TLS 인증서를 만든다.

$ mkcert localhost 127.0.0.1 ::1

위 명렁어를 실행하면 localhost+2.pem과 localhost+2-key.pem 두 개의 파일이 생성된다.

2.3. 테스트


router.RunTLS(":8083", "localhost+2.pem", "localhost+2-key.pem")

router.RunTLS 함수의 파일명만 변경해주고 실행해본다.

경고창 없이 잘 실행된다.