pemrograman

17 Membuat Middleware Ssl Tls Authentication Pada Golang

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:

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

package main

import (
	"crypto/tls"
	"fmt"
	"log"
	"net/http"

	"github.com/julienschmidt/httprouter"
)

// CertificateAuthMiddleware memverifikasi sertifikat klien
func CertificateAuthMiddleware(next httprouter.Handle) httprouter.Handle {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		// Mendapatkan sertifikat klien dari koneksi TLS
		clientCert := r.TLS.PeerCertificates
		if len(clientCert) == 0 {
			http.Error(w, "Client certificate required", http.StatusUnauthorized)
			return
		}

		// Menampilkan informasi sertifikat klien (bisa dikembangkan lebih lanjut)
		fmt.Println("Client certificate subject:", clientCert[0].Subject)

		// Jika sertifikat valid, lanjutkan ke handler berikutnya
		next(w, r, ps)
	}
}

func main() {
	// Membuat router
	router := httprouter.New()

	// Menambahkan middleware
	router.GET("/secure", CertificateAuthMiddleware(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		w.Write([]byte("You have access to the secure resource!"))
	}))

	// Menyiapkan server dengan TLS
	server := &http.Server{
		Addr:      ":8080",
		Handler:   router,
		TLSConfig: &tls.Config{MinVersion: tls.VersionTLS13},
	}

	// Menjalankan server HTTPS
	log.Println("Server running at https://localhost:8080")
	err := server.ListenAndServeTLS("certs/server.crt", "certs/server.key")
	if err != nil {
		log.Fatal("ListenAndServeTLS failed: ", err)
	}
}

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:

package main

import (
	"crypto/tls"
	"net/http"
	"net/http/httptest"
	"testing"
)

// TestCertificateAuthMiddleware menguji middleware SSL/TLS
func TestCertificateAuthMiddleware(t *testing.T) {
	// Membuat router untuk tes
	router := httprouter.New()
	router.GET("/secure", CertificateAuthMiddleware(func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		w.Write([]byte("You have access to the secure resource!"))
	}))

	// Membuat server uji
	server := httptest.NewServer(router)
	defer server.Close()

	// Buat permintaan HTTPS ke server uji tanpa sertifikat klien
	req, err := http.NewRequest("GET", server.URL+"/secure", nil)
	if err != nil {
		t.Fatalf("Error creating request: %v", err)
	}

	// Uji bahwa server menolak akses tanpa sertifikat
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		t.Fatalf("Error making request: %v", err)
	}

	if resp.StatusCode != http.StatusUnauthorized {
		t.Errorf("Expected status %v, got %v", http.StatusUnauthorized, resp.StatusCode)
	}
}

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:

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

Setelah itu, jalankan aplikasi menggunakan perintah:

go run main.go

Untuk menjalankan unit test, jalankan perintah berikut:

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

comments powered by Disqus