Бесплатный Wildcard SSL с помощью Let's Encrypt

Содержание

Введение

Иногда нужно, чтобы страницы профилей, проектов и т.д. были на отдельном поддомене, а так же были доступны по https.

В это статье говорится о том, как это сделать через сервис letsencrypt, а так же проводится тестирование через веб-сервер на Go.

Настройка Let’s Encrypt1

Для начала нужно установить certbot.

Далее, выполняем следующую команду:

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d 'letsencrypt.msadakov.me,*.letsencrypt.msadakov.me'

Далее, выполняем все действия, которые от нас требуют.

В конце должен появиться следующий текст:

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/letsencrypt.msadakov.me/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/letsencrypt.msadakov.me/privkey.pem
   Your cert will expire on 2018-09-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Запуск Go сервера с TLS2

Загружаем созданные выше сертификат (tls.crt) и ключ (tls.key) на сервер.

Запускаем код ниже:

package main

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

    "github.com/bobesa/go-domain-util/domainutil"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        // Указываем принудительно использовать браузеру протокол HTTPS. 3 месяца
        w.Header().Add("Strict-Transport-Security", "max-age=7889400; includeSubDomains")

        // Получаем поддомен
        subdomain := domainutil.Subdomain(req.Host)

        // Убираем "суффикс" .wildcard и делаем первую букву заглавной.
        name := strings.Title(strings.TrimSuffix(subdomain, ".letsencrypt"))

        // Выводим на страницу
        w.Write([]byte(fmt.Sprintf("Hello, %s!", name)))
    })
    cfg := &tls.Config{
        MinVersion:               tls.VersionTLS12,
        CurvePreferences:         []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
        PreferServerCipherSuites: true,
        CipherSuites: []uint16{
            tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
            tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
            tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
            tls.TLS_RSA_WITH_AES_256_CBC_SHA,
        },
    }
    srv := &http.Server{
        Addr:         ":443",
        Handler:      mux,
        TLSConfig:    cfg,
        TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
    }
    log.Fatal(srv.ListenAndServeTLS("/etc/letsencrypt/live/letsencrypt.msadakov.me/fullchain.pem", "/etc/letsencrypt/live/letsencrypt.msadakov.me/privkey.pem"))
}

Заходим в браузер и видим результат:

Hello, World!

Информация о сертификате:

world.letsencrypt.msadakov.me cert info

Тест на ssllabs.com

Заходим на SSL Labs и проверяем.

Результат:

SSLLabs

CC-BY

Если не указано иное, контент на этом сайте лицензируется в соответствии с лицензией Creative Commons Attribution 4.0 International license.