title: “53. Konfigurasi Sertifikat TLS dengan Golang” date: 2024-06-20 tags: [golang, tls, security, certificate, programming]
TLS (Transport Layer Security) telah menjadi standar utama untuk mengamankan komunikasi di internet. Dengan semakin meningkatnya ancaman siber, memastikan koneksi aplikasi berjalan dengan protokol terenkripsi menjadi sangat vital. Golang, sebagai bahasa yang modern dan efisien, menyediakan library native yang tangguh untuk mengintegrasikan TLS ke dalam aplikasi kita.
Pada artikel ke-53 serial “Belajar Golang”, saya akan membahas cara mengonfigurasi sertifikat TLS pada aplikasi Go. Kita akan menyelami bagaimana mengimplementasikannya baik pada sisi server maupun client, berikut tips manajemen sertifikat, hingga monitoring handshake TLS. Bagian bonus di akhir: saya menyertakan simulasi table dan diagram alur handshake TLS menggunakan mermaid.
Mengapa TLS Penting?
TLS melindungi data dalam perjalanan melalui dua hal:
- Enkripsi — Mencegah pihak ketiga mengintip data.
- Otentikasi — Memastikan komunikasi hanya antara pihak yang benar.
Konfigurasi TLS yang tepat pada aplikasi Go adalah fondasi kuat untuk membangun sistem backend modern.
Arsitektur Sederhana TLS
Diagram Alur Handshake TLS (mermaid)
sequenceDiagram
autonumber
participant Client
participant Server
Client->>Server: ClientHello
Server->>Client: ServerHello
Server->>Client: Certificate
Server->>Client: ServerHelloDone
Client->>Server: ClientKeyExchange
Client->>Server: ChangeCipherSpec
Client->>Server: Finished
Server->>Client: ChangeCipherSpec
Server->>Client: Finished
Note over Client,Server: Encrypted communication starts
Schema di atas adalah handshake TLS paling umum – fase dimana client dan server bertukar informasi, memvalidasi sertifikat, lalu membangun komunikasi terenkripsi.
Persiapan: Generasi Sertifikat Self-Signed
Untuk pengujian lokal dan integrasi awal, biasanya kita menggunakan sertifikat self-signed. Dalam implementasi produksi, jangan gunakan self-signed – gunakan yang diterbitkan CA terpercaya seperti Let’s Encrypt.
Membuat Sertifikat dan Private Key:
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
-keyout server.key -out server.crt \
-subj "/CN=localhost"
server.key: Private keyserver.crt: Sertifikat public
Konfigurasi TLS pada Server Go
Mari langsung ke contoh kode!
package main
import (
"crypto/tls"
"log"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello over TLS!"))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", helloHandler)
// load sertifikat dan private key
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
log.Fatalf("Gagal memuat sertifikat: %v", err)
}
// Konfigurasi TLS secara eksplisit
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
MinVersion: tls.VersionTLS12, // Hanya terima TLS >= 1.2
CipherSuites: []uint16{
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
},
}
server := &http.Server{
Addr: ":8443",
Handler: mux,
TLSConfig: tlsConfig,
}
log.Println("Server TLS dijalankan di https://localhost:8443")
if err := server.ListenAndServeTLS("", ""); err != nil {
log.Fatalf("Gagal menjalankan server: %v", err)
}
}
Highlight:
- Loading sertifikat dengan
tls.LoadX509KeyPair(pemrosesan file PEM). MinVersionuntuk keamanan dengan minimum TLS 1.2.CipherSuitesdapat dikustom sesuai kebutuhan compliance perusahaan.
Konfigurasi Client TLS
Salah satu kekuatan Go adalah betapa mudahnya melakukan request HTTPS kustom. Berikut contoh client yang melakukan trust pada CA custom (misal, untuk sertifikat self-signed).
package main
import (
"crypto/tls"
"crypto/x509"
"io/ioutil"
"log"
"net/http"
)
func main() {
// Load CA certificate
caCert, err := ioutil.ReadFile("server.crt")
if err != nil {
log.Fatalf("Gagal membaca CA: %v", err)
}
caPool := x509.NewCertPool()
caPool.AppendCertsFromPEM(caCert)
tlsConfig := &tls.Config{
RootCAs: caPool,
MinVersion: tls.VersionTLS12,
}
transport := &http.Transport{TLSClientConfig: tlsConfig}
client := &http.Client{Transport: transport}
resp, err := client.Get("https://localhost:8443")
if err != nil {
log.Fatalf("Gagal HTTP GET: %v", err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
log.Printf("Response: %s", body)
}
Catatan: Di environment production, Anda sebaiknya memakai CA resmi. Kode di atas mengasumsikan self-signed untuk percobaan.
Tabel: Opsi Konfigurasi TLS yang Sering Digunakan
| Property | Deskripsi | Contoh |
|---|---|---|
| Certificates | Sertifikat X.509 + private key | []tls.Certificate{cert} |
| MinVersion | Versi minimal TLS yang diterima | tls.VersionTLS12 |
| CipherSuites | Daftar cipher suite yang diperbolehkan | []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256} |
| ClientAuth | Kebutuhan client certificate untuk mutual TLS | tls.RequireAndVerifyClientCert |
| RootCAs | CA yang dipercaya (client route) | Pool dari x509.CertPool |
| PreferServerCipherSuites | Prioritas pilihan cipher dari server | true |
Bonus: Mutual TLS (mTLS)
Untuk aplikasi B2B dengan kebutuhan autentikasi ekstra (misal API internal antar service), mutual TLS adalah solusi.
Skema Alur mTLS
sequenceDiagram
Client->>Server: ClientHello
Server->>Client: ServerHello + RequestClientCertificate
Client->>Server: ClientCertificate + ClientKeyExchange
Server->>Client: ServerCertificate,ChangeCipherSpec,Finished
Client->>Server: ChangeCipherSpec,Finished
Note over Client,Server: Both parties validate each other's certificates
Untuk mengaktifkan mTLS di Golang:
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{serverCert},
ClientAuth: tls.RequireAndVerifyClientCert, // Mewajibkan client certificate!
ClientCAs: clientCAPool, // Pool CA public client yang dipercayai
}
Sering digunakan pada banking system, P2P API, dan skenario CI/CD automation.
Debug dan Monitoring TLS
Gunakan TLS handshake logging di Go:
os.Setenv("GODEBUG", "tls13=1,tls13keylogfile=./keylog.txt")
Ini menghasilkan log yang dapat di-inspect via Wireshark untuk analisis traffic terenkripsi dengan membaca session key.
Kesimpulan
Konfigurasi sertifikat TLS dalam Go sangatlah praktis dan powerful, baik untuk aplikasi kecil maupun enterprise. Mulailah dari understanding pemrosesan sertifikat, minimalisasi exposure dengan MinVersion yang tinggi, hingga improvisasi keamanan dengan mTLS. Go menyediakan seluruh tool security-level enterprise namun tetap sederhana, asalkan kita menulis konfigurasinya dengan benar.
Saran: Untuk produksi, set up automation renewal via ACME (Let’s Encrypt), dan selalu audit opsi TLS Anda minimal setiap 6 bulan sekali mengikuti update best practice.
Anda punya pengalaman unik dengan TLS di Go? Ceritakan di kolom komentar!
Sampai jumpa di tulisan berikutnya. Jika artikel ini membantu, support saya dengan clap di Medium! 🚀