Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
06 Feb 2025 · 5 mnt baca ·Artikel 76 / 119
Go

17 Membuat Middleware Ssl Tls Authentication Pada Golang

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Pada artikel ini, kita akan belajar bagaimana cara membuat middleware untuk otentikasi berbasis sertifikat (SSL/TLS) menggunakan library httprouter di Go. SSL/TLS adalah protokol yang banyak digunakan untuk meningkatkan keamanan komunikasi di internet, salah satunya dengan memastikan hanya pihak yang sah yang dapat berkomunikasi dengan server. Middleware ini akan membantu kita memverifikasi apakah klien mengirimkan sertifikat yang valid untuk mengakses suatu endpoint.

Apa itu Certificate-based Authentication?

Certificate-based Authentication adalah metode otentikasi yang menggunakan sertifikat digital untuk memverifikasi identitas klien. Sertifikat ini biasanya berisi kunci publik yang digunakan untuk mengenkripsi komunikasi antara klien dan server, serta memastikan bahwa klien yang berkomunikasi adalah pihak yang sah.

SSL (Secure Socket Layer) dan TLS (Transport Layer Security) adalah dua protokol utama yang digunakan untuk mengamankan komunikasi jaringan. Saat menggunakan sertifikat, server dapat mengonfirmasi bahwa klien memiliki sertifikat yang valid, mengurangi risiko serangan seperti MITM (Man in the Middle).

Langkah-langkah Membuat Middleware

Untuk membangun middleware ini, kita akan menggunakan beberapa komponen penting:

  • httprouter: Library router HTTP yang ringan dan cepat di Go.
  • crypto/tls: Paket untuk menangani sertifikat dan komunikasi TLS.
  • net/http: Untuk membuat server HTTP di Go.

1. Instalasi dan Setup Proyek

Langkah pertama adalah menginstal library httprouter. Anda dapat menginstalnya dengan menjalankan perintah berikut di terminal:

bash
1go get -u github.com/julienschmidt/httprouter

Setelah itu, buatlah file Go dengan nama main.go untuk menyiapkan server HTTP dan middleware.

2. Membuat Middleware SSL/TLS

Middleware ini akan memverifikasi sertifikat klien. Jika sertifikat valid, middleware akan melanjutkan request ke handler berikutnya. Jika tidak valid, middleware akan menanggapi dengan status HTTP 403 Forbidden.

go
 1package main
 2
 3import (
 4	"crypto/tls"
 5	"fmt"
 6	"log"
 7	"net/http"
 8
 9	"github.com/julienschmidt/httprouter"
10)
11
12// CertificateAuthMiddleware memverifikasi sertifikat klien
13func CertificateAuthMiddleware(next httprouter.Handle) httprouter.Handle {
14	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
15		// Mendapatkan sertifikat klien dari koneksi TLS
16		clientCert := r.TLS.PeerCertificates
17		if len(clientCert) == 0 {
18			http.Error(w, "Client certificate required", http.StatusUnauthorized)
19			return
20		}
21
22		// Menampilkan informasi sertifikat klien (bisa dikembangkan lebih lanjut)
23		fmt.Println("Client certificate subject:", clientCert[0].Subject)
24
25		// Jika sertifikat valid, lanjutkan ke handler berikutnya
26		next(w, r, ps)
27	}
28}
29
30func main() {
31	// Membuat router
32	router := httprouter.New()
33
34	// Menambahkan middleware
35	router.GET("/secure", CertificateAuthMiddleware(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
36		w.Write([]byte("You have access to the secure resource!"))
37	}))
38
39	// Menyiapkan server dengan TLS
40	server := &http.Server{
41		Addr:      ":8080",
42		Handler:   router,
43		TLSConfig: &tls.Config{MinVersion: tls.VersionTLS13},
44	}
45
46	// Menjalankan server HTTPS
47	log.Println("Server running at https://localhost:8080")
48	err := server.ListenAndServeTLS("certs/server.crt", "certs/server.key")
49	if err != nil {
50		log.Fatal("ListenAndServeTLS failed: ", err)
51	}
52}

Penjelasan Kode:

  1. CertificateAuthMiddleware: Middleware ini memeriksa apakah klien telah mengirimkan sertifikat melalui koneksi TLS. Jika klien tidak mengirimkan sertifikat, maka server akan mengembalikan error HTTP 401 (Unauthorized). Jika sertifikat ditemukan, informasi sertifikat klien akan ditampilkan di log, dan request diteruskan ke handler berikutnya.

  2. Server TLS: Server diatur untuk menggunakan koneksi HTTPS dengan sertifikat yang disediakan dalam file server.crt dan server.key.

3. Unit Test Middleware

Selanjutnya, kita akan menulis unit test untuk memastikan bahwa middleware kita bekerja dengan baik.

Buatlah file main_test.go untuk menulis test case menggunakan testing dan net/http/httptest:

go
 1package main
 2
 3import (
 4	"crypto/tls"
 5	"net/http"
 6	"net/http/httptest"
 7	"testing"
 8)
 9
10// TestCertificateAuthMiddleware menguji middleware SSL/TLS
11func TestCertificateAuthMiddleware(t *testing.T) {
12	// Membuat router untuk tes
13	router := httprouter.New()
14	router.GET("/secure", CertificateAuthMiddleware(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
15		w.Write([]byte("You have access to the secure resource!"))
16	}))
17
18	// Membuat server uji
19	server := httptest.NewServer(router)
20	defer server.Close()
21
22	// Buat permintaan HTTPS ke server uji tanpa sertifikat klien
23	req, err := http.NewRequest("GET", server.URL+"/secure", nil)
24	if err != nil {
25		t.Fatalf("Error creating request: %v", err)
26	}
27
28	// Uji bahwa server menolak akses tanpa sertifikat
29	resp, err := http.DefaultClient.Do(req)
30	if err != nil {
31		t.Fatalf("Error making request: %v", err)
32	}
33
34	if resp.StatusCode != http.StatusUnauthorized {
35		t.Errorf("Expected status %v, got %v", http.StatusUnauthorized, resp.StatusCode)
36	}
37}

Penjelasan Unit Test:

  1. TestCertificateAuthMiddleware: Fungsi ini menguji apakah middleware SSL/TLS bekerja dengan benar. Pertama, kita membuat server uji menggunakan httptest.NewServer. Lalu, kita membuat request ke endpoint /secure tanpa sertifikat klien dan memastikan bahwa server mengembalikan status 401 Unauthorized.

4. Menjalankan Server dan Test

Sebelum menjalankan server, pastikan Anda memiliki sertifikat yang valid di direktori certs/. Jika tidak, Anda dapat membuat sertifikat self-signed untuk keperluan pengujian. Berikut adalah cara untuk membuat sertifikat menggunakan OpenSSL:

bash
1openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365

Setelah itu, jalankan aplikasi menggunakan perintah:

bash
1go run main.go

Untuk menjalankan unit test, jalankan perintah berikut:

bash
1go test -v

5. Kesimpulan

Pada artikel ini, kita telah mempelajari bagaimana cara membuat middleware untuk Certificate-based Authentication menggunakan Go dengan library httprouter. Kita juga telah membuat unit test untuk memastikan bahwa middleware bekerja dengan benar. Dengan memahami konsep ini, Anda dapat menambahkan lapisan keamanan tambahan di aplikasi Anda, terutama untuk API yang membutuhkan otentikasi berbasis sertifikat.

Untuk mempelajari lebih lanjut tentang Go dan penggunaan HTTP router, Anda bisa membaca artikel terkait berikut:

Artikel Terkait

💬 Komentar