如何将CAFile添加到我们的证书中

时间:2019-06-17 13:17:33

标签: http go server x509certificate ca

我们正在docker容器中使用Web服务器。目前,我们的公共私钥工作正常。我们遇到的问题是,当我们使用https://www.ssllabs.com/测试站点时,我们的CAFile没有作为提供的证书包括在内。在查看解决方案之后,我尝试将证书添加到caCertPool并将其添加到配置中。即使这样做,SSL Labs仍然表示看不到它,并且我们仍然得到B分数。这是到目前为止我没有运气的尝试的代码片段。

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 CA时 是“额外下载”,不包含在我们的网站上。

1 个答案:

答案 0 :(得分:0)

tls.Config documentation

  

证书包含一个或多个证书,以呈现给连接的另一端。

     

[...]

     

RootCA定义了客户端在验证服务器证书时使用的一组根证书颁发机构。

RootCAs字段对服务器不起作用。您只需要在Certificates字段中设置完整的证书链(不包括根CA;在技术上不会破坏任何东西,但会浪费带宽)。

您尚未显示certs.ReadFile的功能,但只需要确保它返回PEM编码的叶子证书和中间件(即“额外下载”的中间件),并串联在那个命令。 tls.X509KeyPair自动构建链。