Защитите свой go REST Api в Docker с помощью Letsencrypt

Недавно мне пришлось разобраться в этом и я не смог найти хороший ресурс, надеюсь, что это первый.

Как настроить HTTPS для Go (Gin) REST API с помощью Docker и Letsencrypt

Что используется (что нужно установить):

  1. Go
  2. Gin
  3. Docker

Исходный код для демонстрационного Go REST API:

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func setupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, "pong")
    })
    return r
}

func main() {
    r := setupRouter()
    r.Run(":80")
}
Вход в полноэкранный режим Выход из полноэкранного режима

Как зашифровать его с помощью letsencrypt

  1. Добавьте "github.com/gin-gonic/autotls" к вашим импортам.
  2. Откройте goroutine для запуска на порту 80, чтобы предотвратить блокировку потока и в то же время обеспечить доступ через http:Change:
r.Run(":80")
Вход в полноэкранный режим Выход из полноэкранного режима

Чтобы:

go r.Run(":80")
Войти в полноэкранный режим Выйти из полноэкранного режима
  1. Добавьте возможность доступа к сервису через ssl:
m := autocert.Manager{
    Prompt:     autocert.AcceptTOS,
    HostPolicy: autocert.HostWhitelist("domain.com"),
    Cache:      autocert.DirCache("/var/www/.cache"),
}
autotls.RunWithManager(r, &m)
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы должны ввести свой домен вместо “domain.com”.

Докеризация

Dockerfile:

FROM golang:latest

WORKDIR /

COPY . .

EXPOSE 80

EXPOSE 443

ENV GIN_MODE=release

VOLUME ["/var/www/.cache"]

CMD [ "go","run", "main.go" ]
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы также должны добавить том в docker-compose, потому что вы будете ограничены в скорости letsencrypt, если запросите слишком много сертификатов.

go-backend:
  build:
    context: ./go-backend
    dockerfile: Dockerfile
  ports:
    - 80:80
    - 443:443
  container_name: go-backend
  volumes:
    - certcache:/var/www/.cache
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь проект gin расположен в ./go-backend, что может быть другим для вашего проекта. Важной частью является то, что том создан в /var/www/.cache для предотвращения большого количества запросов к letsencrypt.

Последние замечания:

Если вы хотите зашифровать свой api и сделать его доступным по протоколу https, возможно, будет хорошей идеей запретить использование http. Это будет особенно важно, если вы отправляете пароли или другие конфиденциальные данные на сервер или с сервера через ваш api. В этом случае вам следует удалить это из вашего кода go:

go r.Run(":80")
Вход в полноэкранный режим Выйти из полноэкранного режима

Вы также должны закрыть (не открывать) порт 80 в вашем Dockerfile и в docker-compose, потому что они не нужны.

Полный код go:

package main

import (
    "github.com/gin-gonic/autotls"
    "github.com/gin-gonic/gin"
    "golang.org/x/crypto/acme/autocert"
    "net/http"
)

func setupRouter() *gin.Engine {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, "pong")
    })
    return r
}

func main() {
    r := setupRouter()
    go r.Run(":80")
    m := autocert.Manager{
        Prompt:     autocert.AcceptTOS,
        HostPolicy: autocert.HostWhitelist("domain.com"),
        Cache:      autocert.DirCache("/var/www/.cache"),
    }
    autotls.RunWithManager(r, &m)
}
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий