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:
1go get -u github.com/julienschmidt/httprouterSetelah 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.
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:
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.
Server TLS: Server diatur untuk menggunakan koneksi HTTPS dengan sertifikat yang disediakan dalam file
server.crtdanserver.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:
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:
- 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/securetanpa sertifikat klien dan memastikan bahwa server mengembalikan status401 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:
1openssl req -x509 -newkey rsa:4096 -keyout certs/server.key -out certs/server.crt -days 365Setelah itu, jalankan aplikasi menggunakan perintah:
1go run main.goUntuk menjalankan unit test, jalankan perintah berikut:
1go test -v5. 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: