- PVSM.RU - https://www.pvsm.ru -

LetsEncrypt в Go

Суть проблемы в том, что сертификаты LetsEncrypt действуют 3 месяца, а обновляются каждый месяц. Достаточно легко автоматизировать обновление certonly сертификатов через cron, но в Go пока нет простого способа автоматически подхватывать новые обновлённые сертификаты.

Точнее теперь есть

//		 log.Println(http.ListenAndServeTLS(":7544", 
//                               "/home/user/cert/game01.example.com/fullchain.pem", 
//                               "/home/user/cert/game01.example.com/privkey.pem", nil))
		for {
			log.Println(pyrahttp.ListenAndServeLetsEncrypt(":7544", 
                               "/home/user/cert/game01.example.com/fullchain.pem", 
                               "/home/user/cert/game01.example.com/privkey.pem", nil))
			time.Sleep(time.Second * 5)
		}

Цикл не обязателен. Он нужен, если вы хотите, чтобы сервер не падал, когда в новом сертификате есть ошибка, https сервис будет гаснуть, когда пропадет сертификат, и оживет, если появится нормальный сертификат.

Как это работает

В пакете net/http нет простого способа остановить http или https сервер. Поэтому я вдохновился вот этим постом [1]. Скопировал код ListenAndServeTLS и еще немного кода из net/http, и получил работающий pyrahttp.ListenAndServeLetsEncrypt [2].

http.Server получает мою реализацию net.Listener. Она в Accept() вызывает TCPListener.Accept() с Deadline в одну минуту. В случае deadline или нового соединения listner проверяет файл сертификата, и если он таки обновился, то возвращает ReloadError, что приводит к перезагрузке сервера в ListenAndServeLetsEncrypt [3].

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

Установка/обновление

go get -u github.com/CossackPyra/pyrahttp

PS

Если у вас несколько доменов, поддоменов, серверов (виртуальных), и вы раздумываете как начать использовать LetsEncrypt, то я выбрал решение, когда у меня один сервер имеет код LetsEncrypt, а на всех остальных запросы к /.well-known/acme-challenge проксируются на LetsEncrypt сервер. Это позволяет получить один сертификат на несколько серверов, которые впоследствии я могу объединить в один сервер или поместить за общий прокси.

Автор: pyra

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/108598

Ссылки в тексте:

[1] постом: http://www.hydrogen18.com/blog/stop-listening-http-server-go.html

[2] pyrahttp.ListenAndServeLetsEncrypt: https://github.com/CossackPyra/pyrahttp/blob/170bc727ac943c5251f5282827ccc9dc3779b858/pyrahttp.go#L46

[3] ListenAndServeLetsEncrypt: https://github.com/CossackPyra/pyrahttp/blob/170bc727ac943c5251f5282827ccc9dc3779b858/pyrahttp.go#L91

[4] Источник: http://habrahabr.ru/post/274749/