tutorial

  1. Konfigurasi Sertifikat TLS dengan Golang


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:

  1. Enkripsi — Mencegah pihak ketiga mengintip data.
  2. 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 key
  • server.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).
  • MinVersion untuk keamanan dengan minimum TLS 1.2.
  • CipherSuites dapat 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

PropertyDeskripsiContoh
CertificatesSertifikat X.509 + private key[]tls.Certificate{cert}
MinVersionVersi minimal TLS yang diterimatls.VersionTLS12
CipherSuitesDaftar cipher suite yang diperbolehkan[]uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}
ClientAuthKebutuhan client certificate untuk mutual TLStls.RequireAndVerifyClientCert
RootCAsCA yang dipercaya (client route)Pool dari x509.CertPool
PreferServerCipherSuitesPrioritas pilihan cipher dari servertrue

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! 🚀

comments powered by Disqus