Чтение 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}