Как мне добавить CAFile в наши сертификаты - PullRequest
1 голос
/ 17 июня 2019

Мы используем веб-сервер в Docker-контейнере. На данный момент наш открытый закрытый ключ работает нормально. У нас проблема в том, что наш CAFile не включается в качестве предлагаемого сертификата, когда мы тестируем наш сайт с https://www.ssllabs.com/.. После проверки решений я попытался добавить сертификат в caCertPool и добавил его в конфигурацию. Даже после этого SSL Labs по-прежнему заявляет, что не видит его, и мы все равно получаем B Score. Вот фрагмент кода того, что я пока безуспешно пытаюсь сделать.

certs, err := newStaticCerts(&static.Config{UseStaticFiles: cfg.IsProduction, FallbackToDisk: true, AbsPkgPath: getMessagePath()})
        if err != nil {
            log.WithFields(log.F("error", err)).Fatal("Issue initializing static certs")
        }

        httpKey, err := certs.ReadFile("/certs/website.com.key")
        if err != nil {
            log.WithFields(log.F("error", err)).Fatal("Issue loading tls key")
        }

        httpPem, err := certs.ReadFile("/certs/website.com.pem")
        if err != nil {
            log.WithFields(log.F("error", err)).Fatal("Issue loading tls pem")
        }

        caFilePem, err := certs.ReadFile("/certs/CAFile.pem")
        if log.CheckErr(err, "Issue loading CAFile pem") {
            return
        }

        // Load client cert
        cert, err := tls.X509KeyPair(httpPem, httpKey)
        if err != nil {
            log.Fatal(err)
        }

        caCertPool := x509.NewCertPool()
        caCertPool.AppendCertsFromPEM(caFilePem)

        tlsConfig := &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,
            },
            Certificates: []tls.Certificate{cert},
            RootCAs:      caCertPool,
        }

        tlsConfig.BuildNameToCertificate()

        //server := &http.Server{Addr: ":" + strconv.Itoa(cfg.AppPort), Handler: p.Serve(), TLSConfig: tlsConfig}
        srv := &http.Server{
            Addr:         ":" + strconv.Itoa(cfg.AppPort),
            Handler:      p.Serve(),
            TLSConfig:    tlsConfig,
            TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
        }

        err = kmshttp.RunServer(srv)
        if log.CheckErr(err, "shutting down server") {
            return
        }

Проблема в том, что когда мы проверяем наши пути сертификации, наш центр сертификации RSA является дополнительной загрузкой и не включена в наш сайт.

1 Ответ

0 голосов
/ 17 июня 2019

Из документации tls.Config :

Сертификаты содержат один или несколько сертификатов цепочки для представления на другую сторону соединения.

[...]

RootCAs определяет набор корневых центров сертификации, которые клиенты используют при проверке сертификатов сервера.

Поле RootCAs ничего не делает для серверов. Вам нужно всего лишь задать полную цепочку сертификатов в поле Certificates (исключая корневой ЦС; это технически не нарушит ничего, кроме потери пропускной способности).

Вы не показали, что делает certs.ReadFile, но вам нужно только убедиться, что он возвращает закодированный PEM листовой сертификат и промежуточные продукты (т. Е. Тот, который является "дополнительной загрузкой"), объединенные в таком порядке , tls.X509KeyPair создает цепочку автоматически.

...