Точнее теперь есть
// log.Println(http.ListenAndServeTLS(":7544",
// "/home/user/cert/http://ift.tt/1ZW8ne2",
// "/home/user/cert/http://ift.tt/1RhHXSg", nil))
for {
log.Println(pyrahttp.ListenAndServeLetsEncrypt(":7544",
"/home/user/cert/http://ift.tt/1ZW8ne2",
"/home/user/cert/http://ift.tt/1RhHXSg", nil))
time.Sleep(time.Second * 5)
}
Цикл не обязателен. Он нужен, если вы хотите, чтобы сервер не падал, когда в новом сертификате есть ошибка, https сервис будет гаснуть, когда пропадет сертификат, и оживет, если появится нормальный сертификат.
Как это работает
В пакете net/http нет простого способа остановить http или https сервер. Поэтому я вдохновился вот этим постом. Скопировал код ListenAndServeTLS и еще немного кода из net/http, и получил работающий pyrahttp.ListenAndServeLetsEncrypt.
http.Server получает мою реализацию net.Listener. Она в Accept() вызывает TCPListener.Accept() с Deadline в одну минуту. В случае deadline или нового соединения listner проверяет файл сертификата, и если он таки обновился, то возвращает ReloadError, что приводит к перезагрузке сервера в ListenAndServeLetsEncrypt.
Надеюсь теперь больше счастливых серверов на Go смогут дожить до своего двух или трехлетия без перезапуска.
Установка/обновление
go get -u github.com/CossackPyra/pyrahttp
PS
Если у вас несколько доменов, поддоменов, серверов (виртуальных), и вы раздумываете как начать использовать LetsEncrypt, то я выбрал решение, когда у меня один сервер имеет код LetsEncrypt, а на всех остальных запросы к /.well-known/acme-challenge проксируются на LetsEncrypt сервер. Это позволяет получить один сертификат на несколько серверов, которые впоследствии я могу объединить в один сервер или поместить за общий прокси.
This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий