【问题标题】:ListenAndServerTLS keeps failing with error: failed to find any PEM data in certificate inputListenAndServerTLS 不断失败并出现错误:在证书输入中找不到任何 PEM 数据
【发布时间】:2019-05-07 19:45:42
【问题描述】:

我从 Godaddy 为网站购买了 SSL 证书。 我在服务器中添加了文件并运行服务,它只是返回一个错误:

在证书输入中找不到任何 PEM 数据

我使用 cat 生成了一个包含所有文件的 server.pem 文件,甚至添加了一个他们为 G2 证书链提供的 godaddy pem 中间 pem 文件,什么都没有。

cat generated-private-key.txt > server.pem
cat 678f65b8a7391017.crt >> server.pem
cat gd_bundle-g2-g1.crt >> server.pem
cat gdig2.crt.pem >> server.pem

使用自签名证书有效,但在现实世界中当然不可用。

代码尝试 1:

log.Fatal(http.ListenAndServeTLS(fmt.Sprintf("%s:%d", configuration.HttpServer.Address, configuration.HttpServer.Port), "server.pem", "generated-private-key.txt", router))

代码尝试 2:

    cert, err := tls.LoadX509KeyPair("server.pem","generated-private-key.txt")
    if err != nil {
        log.Fatalf("server: loadkeys: %s", err)
    }
    pem, err := ioutil.ReadFile("gd_bundle-g2-g1.crt")
    if err != nil {
        log.Fatalf("Failed to read client certificate authority: %v", err)
    }
    certpool := x509.NewCertPool()
    if !certpool.AppendCertsFromPEM(pem) {
        log.Fatalf("Can't parse client certificate authority")
    }
    tlsConfig := &tls.Config{
        ClientCAs:    certpool,
        Certificates: []tls.Certificate{cert},
    }

    srv := &http.Server{
        Addr: fmt.Sprintf("%s:%d", configuration.HttpServer.Address, configuration.HttpServer.Port),
        Handler: router,
        ReadTimeout: time.Duration(5) * time.Second,
        WriteTimeout: time.Duration(5) * time.Second,
        TLSConfig: tlsConfig,
    }
    log.Fatal(srv.ListenAndServeTLS("678f65b8a7391017.crt","generated-private-key.txt"))

两者都给出相同的错误。

我需要启动并运行它,因为我已经完成了后端,但现在我只想为生产环境启用 HTTPS。

【问题讨论】:

  • 看起来您正在使用您的私钥内容开始您的证书。尝试跳过证书创建脚本的第一行并重试。

标签: ssl go ssl-certificate x509certificate


【解决方案1】:

最终解决了这个问题,我不得不将 Godaddy 提供给我的 generate-private-key.txt 和 generated-csr.txt 合并到一个“server.key”文件中。 令人难以置信的是,缺乏对某些事情的了解最终会浪费这么多时间。 但我想这就是为什么来到这里,为了探索的快感。 谢谢大家的帮助!

【讨论】:

  • 嘿,我在同一条船上。您的 server.key 看起来如何?你是如何附加每个文件的内容的?
【解决方案2】:

我自己也为此苦苦挣扎,我认为您的问题是您需要在提交 http.Server 之前处理密钥,并且您需要包含 RootCA。我从 GoDaddy 下载了 SSL(使用 Other 选项)并从 here 获取了他们的 gd_bundle-g2.crt RootCA。一旦你掌握了它,创建一个如下所示的函数(添加了一个要点here):

func genTLS() (*tls.Config, error) {
    caCert, err := ioutil.ReadFile("/home/sborza/gd_bundle-g2.crt")
    if err != nil {
            return nil, fmt.Errorf("read root cert: %s", err.Error())
    }

    // **** START PRIV KEY PROCESSING ****

    clientBytes, err := ioutil.ReadFile("/home/sborza/sborza_dev.key")
    if err != nil {
            return nil, fmt.Errorf("read client priv key: %s", err.Error())
    }

    cb, _ := pem.Decode(clientBytes)
    k, err := x509.ParsePKCS8PrivateKey(cb.Bytes)
    if err != nil {
            return nil, fmt.Errorf("parse client privkey: %s", err.Error())
    }

    clientKey, _ := x509.MarshalPKCS8PrivateKey(k)
    clientKeyPEM := pem.EncodeToMemory(&pem.Block{
            Type:  "PRIVATE KEY",
            Bytes: clientKey,
    })

    // **** END PRIV KEY PROCESSING ****
    // **** START CERT PROCESSING ****

    certBytes, err := ioutil.ReadFile("/home/sborza/sborza_dev.pem")
    if err != nil {
            return nil, fmt.Errorf("read client cert: %s", err.Error())
    }

    cbk, _ := pem.Decode(certBytes)
    certs, err := x509.ParseCertificates(cbk.Bytes)
    if err != nil {
            return nil, fmt.Errorf("parse client cert: %s", err.Error())
    }

    clientCertPEM := pem.EncodeToMemory(&pem.Block{
            Type:  "CERTIFICATE",
            Bytes: certs[0].Raw,
    })

    // **** END CERT PROCESSING ****
    // **** START TLS CONFIG ****

    cert, err := tls.X509KeyPair(clientCertPEM, clientKeyPEM)
    if err != nil {
            return nil, fmt.Errorf("tls key pair: %s", err.Error())
    }
    caCertPool := x509.NewCertPool()
    if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {
            return nil, fmt.Errorf("append cert: %s", err.Error())
    }

    return &tls.Config{
            RootCAs:      caCertPool,
            Certificates: []tls.Certificate{cert},
    }, nil
    // **** END TLS CONFIG ****
}

【讨论】:

    【解决方案3】:

    根据其他 cmets 之一,对于 ListenAndServeTLS 的第一个参数,必须连接 GoDaddy 证书和链文件。这是一个例子

    var srv http.Server
    srv.Handler = yourHandler
    srv.Addr = ":443"
    
    // Load cert files
    chainBytes, err := ioutil.ReadFile("gd_bundle-g2-g1.crt") // GoDaddy chain
    if err != nil {
        log.Fatal(err)
    }
    certBytes, err := ioutil.ReadFile("server.crt") // Your server cert
    if err != nil {
        log.Fatal(err)
    }
    keyBytes, err := ioutil.ReadFile("server.key") // Your server key
    if err != nil {
        log.Fatal(err)
    }
    
    // Concatenate chain and cert
    b := bytes.NewBuffer(certBytes)
    b.Write([]byte("\n"))
    b.Write(chainBytes)
    
    // Setup TLS
    cert, err := tls.X509KeyPair(b.Bytes(), keyBytes)
    if err != nil {
        log.Fatal(err)
    }
    cfg := &tls.Config{
        Certificates: []tls.Certificate{cert},
    }
    srv.TLSConfig = cfg
    
    // Start server
    err = srv.ListenAndServeTLS("", "")
    if err != nil {
        log.Fatal(err)
    }
    

    我的经验是在最新版本的浏览器(如 Google Chrome >卷曲

    certificate verify failed
    

    以及服务器上的各种错误

    tls: bad record MAC
    tls: unknown certificate authority
    

    连接证书和链文件解决了上述错误。

    【讨论】:

      【解决方案4】:

      问题出在密钥文件上。这是我使用 GoDaddy 提供的相同密钥,没有任何修改。正如@SteffenUllrich 提到的,文件的开头有一些问题(比如文件开头的UTF-8 BOM 或类似的)。为了解决这个问题,我在密钥文件的正上方添加了一个空行,它起作用了。

      最后,关键是这样的:

      <Empty line>
      -----BEGIN RSA PRIVATE KEY-----
      wlWPpSnGEdNjRapfW/6+xzjDVAaKC41c5b07OAviFchwqGI+88
      aZGwBJnTgkbsLddddddd=
      -----END RSA PRIVATE KEY-----
      

      【讨论】:

      • 虽然这可能会在特定情况下解决此问题,但它很可能只是在某些编辑器中打开文件并再次写入它的副作用,从而隐式清理密钥文件的一些问题,这些问题应该一开始就不存在(比如文件开头的 UTF-8 BOM 或类似的)。绝对不需要证书信息。可能只是在文件的开头添加一个空行也可以做到这一点,因为这样任何 UTF-8 BOM 都不会再直接位于 PEM 数据的开头。
      • 我还在努力。在更多的调试和结论之后,我将更新这个答案。谢谢你帮助我@SteffenUllrich
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2019-12-11
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多