Self-signed sertifikat
HTTPS server ishga tushirish uchun sertifikat va yopiq kalit kerak. Production’da sertifikat ishonchli sertifikat markazidan (CA) olinadi. Lokal kompyuterda esa localhost uchun hech bir CA sertifikat bermaydi, chunki localhost hech kimga tegishli domen emas.
Bunday holatda self-signed (o‘zi imzolagan) sertifikat ishlatiladi. U CA tomonidan emas, egasining o‘zi tomonidan imzolanadi. Shifrlash xuddi haqiqiy sertifikatdagidek ishlaydi. Faqat brauzer va boshqa klientlar unga avtomatik ishonmaydi, chunki imzo ishonchli ildiz sertifikatlar ro‘yxatida yo‘q.
Self-signed sertifikat qachon kerak bo‘ladi:
- lokal ishlab chiqishda HTTPS’ni sinash uchun:
Securecookie’lar, HSTS, HTTP/2; - ichki tarmoqdagi servislar orasidagi aloqada, agar o‘z CA’ingiz bo‘lsa;
- testlarda.
Ommaviy saytda esa self-signed sertifikat ishlatilmaydi. U uchun Let's Encrypt kabi bepul CA’lar bor.
1. Sertifikat yaratish
Sertifikat yaratishning uch usulini ko‘rib chiqamiz.
Go bilan: generate_cert.go
Go o‘rnatilgan bo‘lsa, sertifikat yaratish uchun qo‘shimcha dastur kerak emas. Go manba kodida tayyor skript bor:
Joriy katalogda ikkita fayl paydo bo‘ladi:
cert.pem— sertifikat. Unda ochiq kalit va domenlar bor. Uni tarqatish mumkin;key.pem— yopiq kalit. U maxfiy.
OpenSSL bilan
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
-days 365 -nodes \
-keyout key.pem -out cert.pem \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
Parametrlar:
-x509— so‘rov emas, tayyor self-signed sertifikat yaratadi;-newkey ec ... prime256v1— yangi ECDSA P-256 kaliti. RSA’ga qaraganda qisqa va tez;-days 365— amal qilish muddati;-nodes— yopiq kalit parol bilan shifrlanmaydi;-subj "/CN=localhost"— sertifikat nomi;-addext "subjectAltName=..."— sertifikat qaysi domen va IP manzillar uchun ekanini bildiradi.
Sertifikat ichini tekshirish:
subject=CN=localhost
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1
notBefore=Sep 30 05:00:00 2026 GMT
notAfter=Sep 30 05:00:00 2027 GMT
Info
Zamonaviy klientlar domenni CN maydonidan emas, faqat Subject Alternative Name (SAN) kengaytmasidan tekshiradi. Go ham shunday ishlaydi. SAN bo‘lmagan sertifikat bilan x509: certificate relies on legacy Common Name field xatosi chiqadi. Shu sababli -addext qatorini tushirib qoldirmang.
mkcert bilan
mkcert — lokal ishlab chiqish uchun maxsus yaratilgan vosita. U kompyuteringizda shaxsiy CA yaratadi va uni tizimning hamda brauzerlarning ishonchli ro‘yxatiga qo‘shadi. Shundan keyin u bergan sertifikatlarga brauzer ogohlantirishsiz ishonadi.
Birinchi buyruq lokal CA yaratib, uni ishonchli ro‘yxatga qo‘shadi. Ikkinchisi ko‘rsatilgan nomlar uchun sertifikat yaratadi va fayllar nomini chiqaradi. Masalan, localhost+2.pem sertifikat va localhost+2-key.pem kalit.
Warning
mkcert -install tizimning ishonchli sertifikatlar ro‘yxatini o‘zgartiradi. Yaratilgan CA’ning yopiq kaliti (mkcert -CAROOT buyrug‘i ko‘rsatadigan katalogda) kimning qo‘liga tushsa, u sizning kompyuteringiz ishonadigan istalgan sayt uchun sertifikat yarata oladi. Bu kalitni hech kimga bermang va boshqa kompyuterga ko‘chirmang. mkcertni o‘rnatish bo‘yicha joriy ko‘rsatmalarni loyihaning rasmiy sahifasidan oling.
Lokal ishlab chiqish uchun mkcert eng qulay variant: brauzer ham, curl ham ogohlantirish bermaydi.
2. Yopiq kalitni himoyalash
Yopiq kalitni faqat dastur egasi o‘qiy olishi kerak va u Git’ga tushmasligi lozim. Lokal self-signed kalit uchun ham shu qoidaga amal qilish yaxshi odat.
3. Go serverini HTTPS’da ishga tushirish
ListenAndServe o‘rniga ListenAndServeTLS chaqirildi va unga sertifikat hamda kalit fayllari berildi. Boshqa hech narsa o‘zgarmadi.
r.TLS — so‘rov TLS orqali kelgan bo‘lsa, ulanish haqidagi ma’lumot. Oddiy HTTP so‘rovda u nil bo‘ladi.
Go HTTPS ulanishlar uchun HTTP/2ni avtomatik yoqadi. Buning uchun hech narsa qilish shart emas.
4. Klientdan ulanish
curl bilan
curl sertifikatga ishonmadi. Bu to‘g‘ri xatti-harakat. Ikkita yechim bor:
# ✅ Aynan shu sertifikatga ishonish
curl --cacert cert.pem https://localhost:8443
# ⚠️ Tekshiruvni butunlay o‘chirish: faqat tez sinov uchun
curl -k https://localhost:8443
--cacert curlga faqat shu sertifikatni ishonchli deb qabul qilishni aytadi. Tekshiruv saqlanib qoladi: sertifikatdagi domen ham tekshiriladi. -k esa hamma narsaga ko‘z yumadi.
Go klienti bilan
Go klienti ham self-signed sertifikatni rad etadi. Unga sertifikatni ishonchli ro‘yxatga qo‘shib beramiz:
RootCAs maydoni klient ishonadigan ildiz sertifikatlar ro‘yxatini almashtiradi. Endi klient faqat cert.pemga ishonadi, lekin sertifikat tekshiruvi to‘liq saqlanadi: domen, muddat va imzo tekshiriladi. Bu InsecureSkipVerify: truedan tubdan farq qiladi.
Protokol bu safar HTTP/1.1 chiqdi. Maxsus TLSClientConfig berilgan http.Transport HTTP/2’ni avtomatik yoqmaydi. Kerak bo‘lsa, uni ForceAttemptHTTP2: true maydoni bilan yoqish mumkin.
5. Testlarda: httptest.NewTLSServer
Testlarda sertifikat fayllari bilan ishlash shart emas. httptest paketi TLS serverni vaqtinchalik sertifikat bilan o‘zi yaratadi:
srv.Client() shu server sertifikatiga ishonadigan tayyor klientni qaytaradi.
Xulosa
- Self-signed sertifikat lokal ishlab chiqish va testlar uchun mo‘ljallangan. Ommaviy saytda u ishlatilmaydi.
- Sertifikatni
generate_cert.go, OpenSSL yokimkcertbilan yaratish mumkin.mkcertbrauzer ogohlantirishlarisiz ishlaydi. - Sertifikatda domenlar SAN kengaytmasida ko‘rsatilishi shart.
- Yopiq kalit maxfiy: fayl huquqlari
600bo‘lishi va Git’ga tushmasligi kerak. - Go serveri
ListenAndServeTLSbilan HTTPS’da ishlaydi va HTTP/2’ni avtomatik yoqadi. - Klientda
-kyokiInsecureSkipVerifyo‘rniga--cacertyokiRootCAsishlatiladi. - Testlarda
httptest.NewTLSServerqulay.
Keyingi darsda tls.Config orqali TLS sozlamalarini boshqarishni o‘rganamiz.