Чтение ecdsa из env выдает: Ошибка декодирования PEM-блока

Всем добрый день!

в env прописано

TLS_KEY=-----BEGIN EC PRIVATE KEY-----MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbYgFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==-----END EC PRIVATE KEY-----

пробывал так

TLS_KEY=-----BEGINECPRIVATEKEY-----MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbYgFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==-----ENDECPRIVATEKEY-----

и так

TLS_KEY=MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbYgFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==

и так

TLS_KEY=MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbYgFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==

и так

TLS_KEY=-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49
AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbY
gFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==
-----END EC PRIVATE KEY-----

Но мой код:

    err := godotenv.Load("../../../.env")
    envKey := os.Getenv("TLS_KEY")
    envKeyByte := []byte(envKey)
    block, _ := pem.Decode(envKeyByte)
    if block == nil {
        fmt.Println("Ошибка декодирования PEM-блока")
        return
    }
    // Извлекаем приватный ключ из PEM-блока
    privateKey, err := x509.ParseECPrivateKey(block.Bytes)
    if err != nil {
        fmt.Println("Ошибка при извлечении приватного ключа:", err)
        return
    }

    // Теперь privateKey содержит приватный ключ в формате ecdsa.PrivateKey
    fmt.Println("Приватный ключ из файла:", privateKey)

выдает

Ошибка декодирования PEM-блока

Тот же ключ из файла читает на ура

os.Getenv("TLS_KEY") - точно получает данные

Подскажите, пожалуйста, как исправить?


Ответы (1 шт):

Автор решения: Pak Uula

Как я понимаю, godotenv не умеет читать многострочные значения из .env, поэтому вам нужно вытянуть PEM файл в одну строку. Например, заменив в .env переводы строки на \n:

TLS_KEY=-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49\nAwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbY\ngFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==\n-----END EC PRIVATE KEY-----

В программе нужно эти \n превратить обратно в перводы каретки

envKey = strings.Replace(envKey, "\\n", "\n", -1)

Работает, проверено

package main

import (
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "os"
    "strings"

    "github.com/joho/godotenv"
)

func main() {
    err := godotenv.Load(".env")
    if err != nil {
        panic(err)
    }
    envKey := os.Getenv("TLS_KEY")
    fmt.Println("envKey:", envKey)
    envKey = strings.Replace(envKey, "\\n", "\n", -1)
    fmt.Println("envKey:", envKey)
    envKeyByte := []byte(envKey)
    block, _ := pem.Decode(envKeyByte)
    if err != nil {
        panic(err)
    }
    if block == nil {
        fmt.Println("Ошибка декодирования PEM-блока")
        return
    }
    // Извлекаем приватный ключ из PEM-блока
    privateKey, err := x509.ParseECPrivateKey(block.Bytes)
    if err != nil {
        fmt.Println("Ошибка при извлечении приватного ключа:", err)
        return
    }

    // Теперь privateKey содержит приватный ключ в формате ecdsa.PrivateKey
    fmt.Println("Приватный ключ из файла:", privateKey)

}

результат

envKey: -----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49\nAwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbY\ngFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==\n-----END EC PRIVATE KEY-----
envKey: -----BEGIN EC PRIVATE KEY-----
MHcCAQEEIAl3OVDPI+DZga26bSGBoIuYsXHYBMuBdhHqT/zdrYoFoAoGCCqGSM49
AwEHoUQDQgAESUiOTkfLNuzOGVolROj356z4pa585PcjLZnCqI8TtfZ8yqMinwbY
gFtba0RdYLuKTBZuKHycSxO8irgaegOJYQ==
-----END EC PRIVATE KEY-----
Приватный ключ из файла: &{{0xf49e20 33147033093660344646645925386663119719432505505321643683373607924858793211382 56444822249450449874350353117301656088240469555926601698131529356926452468065} 4281466016109929524467996645554519299923541051122177355964790875171320596997} 
→ Ссылка