Как настроить Let Encrypt для приложения сервера Go

У меня есть свой домен с веб-сервисами, написанными на Go. Я использую встроенный веб-сервер Go, без Nginx или Apache впереди.

Я хотел бы начать обслуживать HTTPS, и я понял, что Let Encrypt вот-вот станет THE WAY для этого.

Может ли кто-нибудь использовать всю процедуру настройки для настройки приложения Go, запущенного на сервере Linux?

Ответ 1

Это минимальная автоматическая настройка HTTPS-сервера с использованием сертификатов Go и Let Encrypt, которые я обнаружил:

package main

import (
    "crypto/tls"
    "log"
    "net/http"

    "golang.org/x/crypto/acme/autocert"
)

func main() {
    certManager := autocert.Manager{
        Prompt:     autocert.AcceptTOS,
        HostPolicy: autocert.HostWhitelist("example.com"), //Your domain here
        Cache:      autocert.DirCache("certs"),                   //Folder for storing certificates
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello world"))
    })

    server := &http.Server{
        Addr: ":https",
        TLSConfig: &tls.Config{
            GetCertificate: certManager.GetCertificate,
        },
    }

    go http.ListenAndServe(":http", certManager.HTTPHandler(nil))

    log.Fatal(server.ListenAndServeTLS("", "")) //Key and cert are coming from Let Encrypt
}

Более подробная информация о пакете autocert: ссылка

РЕДАКТИРОВАТЬ: необходимо сделать http доступным из-за проблемы безопасности letsencrypt, читайте больше здесь. В качестве бонуса к этому исправлению у нас теперь есть перенаправление http--> https. Старый пример будет продолжать работать, если вы уже получили сертификаты на него, но он сломается для новых сайтов.

Ответ 2

Я нашел очень простое решение, используя режим автономный.


УСТАНОВИТЕ КЛИЕНТА CERTBOT (рекомендуется Let Encrypt)

(go to the directory where you want to install the certbot client)
git clone https://github.com/certbot/certbot
cd certbot
./certbot-auto --help`


СЕРТИФИКАТ ВЫПУСКА (ВПЕРВЫЕ)

N.B. эта операция происходит через порт 80, поэтому, если ваше приложение Go прослушивает порт 80, его нужно отключить перед запуском этой команды (что очень удобно для запуска, кстати)

./certbot-auto certonly --standalone-supported-challenges http-01 -d www.yourdomain.com

ДОБАВИТЬ ПРОСЛУШИВАТЕЛЬ SSL В ВАШЕМ КОДЕ GOOG

http.ListenAndServeTLS(":443", "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem", "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem", nil)

Готово!


ВОЗВРАТ СЕРТИФИКАТ (срок действия сертификатов истекает через 90 дней)

N.B. Вы можете запустить это вручную (вы получите электронное письмо за несколько дней до истечения срока действия сертификата) или настройте crontab

если ваше приложение Go не прослушивает порт 80, ваше приложение Go может продолжать работать при выполнении этой команды:
./certbot-auto renew --standalone

если ваше приложение Go все еще прослушивает порт 80, вы можете указать команды для остановки и перезапуска приложения Go:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"

для полной документации команд Certbot: https://certbot.eff.org/docs/using.html

Ответ 3

Эта библиотека абстрагирует любую логику обработки сертификатов от вашего кода. И все, что вам нужно сделать, это убедиться, что доменное имя разрешается на сервер.

https://github.com/adrianosela/sslmgr