53. 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:
- 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:
1openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
2 -keyout server.key -out server.crt \
3 -subj "/CN=localhost"server.key: Private keyserver.crt: Sertifikat public
Konfigurasi TLS pada Server Go
Mari langsung ke contoh kode!
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). 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).
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}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:
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}Debug dan Monitoring TLS
Gunakan TLS handshake logging di 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.
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! 🚀