Go programınız HTTPS isteğinde x509: certificate signed by unknown authority hatası veriyorsa, sunucu sertifikasının zinciri sistemin güvendiği kök CA'lardan birine bağlanamıyor demektir. Go, kendi kök listesini taşımaz; işletim sisteminin CA deposunu kullanır.
En sık karşılaşılan durumlar
- Minimal konteyner:
scratchveya çok sade imajlarda CA paketi yoktur. - Özel/kurumsal CA: Dahili servisler kendi CA'sıyla imzalanmıştır.
- Self-signed sertifika kullanan geliştirme ortamı.
- Eksik ara sertifika: Sunucu zinciri tamamlamıyor.
Çözüm adımları
- Docker imajınıza CA paketini ekleyin. Alpine tabanlı imajda:
Debian tabanlıdaRUN apk add --no-cache ca-certificatesapt-get install -y ca-certificates. Çok aşamalı derlemede/etc/ssl/certs/ca-certificates.crtdosyasını son imaja kopyalayabilirsiniz. - Özel kök CA'yı sistem deposuna ekleyin ve
update-ca-certificatesçalıştırın. - Sistem deposunu değiştiremiyorsanız Go'da kendi havuzunuzu oluşturun:
pool, _ := x509.SystemCertPool() if pool == nil { pool = x509.NewCertPool() } pem, _ := os.ReadFile("kok-ca.pem") pool.AppendCertsFromPEM(pem) client := &http.Client{Transport: &http.Transport{ TLSClientConfig: &tls.Config{RootCAs: pool}, }} - Alternatif olarak
SSL_CERT_FILEveyaSSL_CERT_DIRortam değişkenlerini kullanın (Linux'ta Go bunları dikkate alır).
Kaçınılacak kısayol
InsecureSkipVerify: true hatayı kaldırır, ancak sertifika doğrulamasını tamamen devre dışı bırakır; üretimde kullanmayın. Halka açık bir sitede hata alıyorsanız sunucu zincirini SSL denetleme aracıyla inceleyin; eksik ara sertifika sunucu tarafında tamamlanmalıdır. Sertifika seçenekleri için SSL sertifikaları sayfası kullanılabilir.
Ek notlar
- Çok aşamalı Dockerfile'da derleme imajında çalışan program, son imajda CA paketi olmadığı için hata verebilir.
- macOS ve Windows'ta Go sistemin kök deposunu kullandığından hata genellikle kurumsal proxy kaynaklıdır.
- Test sunucusu için self-signed sertifika yerine yerel bir CA kurup kökünü RootCAs'a eklemek daha güvenli bir alışkanlıktır.
Bu yaklaşım, geliştirme ile üretim arasındaki doğrulama farkını da azaltır.
Özet: Go hatası çoğunlukla ortam kaynaklıdır; CA paketini imaja eklemek ya da özel kökü açıkça tanıtmak yeterlidir.