ListenAndServerTLS продолжает сбой с ошибкой: не удалось найти какие-либо данные PEM во входных данных сертификата - PullRequest
1 голос
/ 07 мая 2019

Я купил сертификат SSL у Godaddy для веб-сайта.Я добавил файлы на сервер и запустил службу, и она просто возвращает ошибку:

не удалось найти данные PEM при вводе сертификата

Я использовал cat для генерациифайл server.pem со всеми файлами, даже добавил промежуточный pem-файл godaddy pem, который они предоставляют для цепочки сертификатов G2, и ничего.

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

Использование самозаверяющего сертификата работает, но, конечно, его нельзя использовать в реальномworld.

Попытка кода 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 для продуктивной среды.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

В конце концов, решив это, мне пришлось объединить и генерируемый-private-key.txt, и генерируемый-csr.txt, который Godaddy предоставил мне, в один файл "server.key".Невероятно, что отсутствие знаний о некоторых вещах в конечном итоге тратит так много времени.Но я думаю, именно поэтому были здесь, для острых ощущений исследования.Спасибо всем за помощь!

0 голосов
/ 08 мая 2019

Я боролся с этим сам, и я думаю ваша проблема здесь в том, что вам нужно обработать ключи перед представлением для http.Server, и вам нужно будет включить RootCA.Я скачал SSL с GoDaddy (используя опцию Other) и взял их gd_bundle-g2.crt RootCA с здесь .После того, как вы это схватили, создайте функцию, подобную приведенной ниже (добавьте гист здесь ):

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 ****
}
...