Недавно мне пришлось разобраться в этом и я не смог найти хороший ресурс, надеюсь, что это первый.
- Как настроить HTTPS для Go (Gin) REST API с помощью Docker и Letsencrypt
- Что используется (что нужно установить):
- Исходный код для демонстрационного Go REST API:
- Как зашифровать его с помощью letsencrypt
- Докеризация
- Dockerfile:
- Вы также должны добавить том в docker-compose, потому что вы будете ограничены в скорости letsencrypt, если запросите слишком много сертификатов.
- Последние замечания:
- Полный код go:
Как настроить HTTPS для Go (Gin) REST API с помощью Docker и Letsencrypt
Что используется (что нужно установить):
- Go
- Gin
- 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
- Добавьте
"github.com/gin-gonic/autotls"
к вашим импортам. - Откройте goroutine для запуска на порту 80, чтобы предотвратить блокировку потока и в то же время обеспечить доступ через http:Change:
r.Run(":80")
Чтобы:
go r.Run(":80")
- Добавьте возможность доступа к сервису через 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)
}