Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
31 Jul 2025 · 5 mnt baca ·Artikel 53 / 110
Go

53. Konfigurasi Sertifikat TLS dengan Golang

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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)

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:

bash
1openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
2    -keyout server.key -out server.crt \
3    -subj "/CN=localhost"
  • server.key: Private key
  • server.crt: Sertifikat public

Konfigurasi TLS pada Server Go

Mari langsung ke contoh kode!

go
 1package main
 2
 3import (
 4	"crypto/tls"
 5	"log"
 6	"net/http"
 7)
 8
 9func helloHandler(w http.ResponseWriter, r *http.Request) {
10	w.Write([]byte("Hello over TLS!"))
11}
12
13func main() {
14	mux := http.NewServeMux()
15	mux.HandleFunc("/", helloHandler)
16
17	// load sertifikat dan private key
18	cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
19	if err != nil {
20		log.Fatalf("Gagal memuat sertifikat: %v", err)
21	}
22
23	// Konfigurasi TLS secara eksplisit
24	tlsConfig := &tls.Config{
25		Certificates: []tls.Certificate{cert},
26		MinVersion:   tls.VersionTLS12,              // Hanya terima TLS >= 1.2
27		CipherSuites: []uint16{
28			tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
29			tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
30		},
31	}
32
33	server := &http.Server{
34		Addr:      ":8443",
35		Handler:   mux,
36		TLSConfig: tlsConfig,
37	}
38
39	log.Println("Server TLS dijalankan di https://localhost:8443")
40	if err := server.ListenAndServeTLS("", ""); err != nil {
41		log.Fatalf("Gagal menjalankan server: %v", err)
42	}
43}

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).

go
 1package main
 2
 3import (
 4	"crypto/tls"
 5	"crypto/x509"
 6	"io/ioutil"
 7	"log"
 8	"net/http"
 9)
10
11func main() {
12	// Load CA certificate
13	caCert, err := ioutil.ReadFile("server.crt")
14	if err != nil {
15		log.Fatalf("Gagal membaca CA: %v", err)
16	}
17	caPool := x509.NewCertPool()
18	caPool.AppendCertsFromPEM(caCert)
19
20	tlsConfig := &tls.Config{
21		RootCAs:    caPool,
22		MinVersion: tls.VersionTLS12,
23	}
24	transport := &http.Transport{TLSClientConfig: tlsConfig}
25
26	client := &http.Client{Transport: transport}
27	resp, err := client.Get("https://localhost:8443")
28	if err != nil {
29		log.Fatalf("Gagal HTTP GET: %v", err)
30	}
31	defer resp.Body.Close()
32
33	body, _ := ioutil.ReadAll(resp.Body)
34	log.Printf("Response: %s", body)
35}
Danger
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

MERMAID
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:

go
1tlsConfig := &tls.Config{
2	Certificates: []tls.Certificate{serverCert},
3	ClientAuth:   tls.RequireAndVerifyClientCert,  // Mewajibkan client certificate!
4	ClientCAs:    clientCAPool,  // Pool CA public client yang dipercayai
5}
Sering digunakan pada banking system, P2P API, dan skenario CI/CD automation.


Debug dan Monitoring TLS

Gunakan TLS handshake logging di Go:

go
1os.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.

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

Artikel Terkait

💬 Komentar