mkcert Web UI: management de certificate local
Securitate

mkcert: HTTPS local fara avertismente, in doua comenzi

Toata lumea a trecut prin asta: pornesti un serviciu local pe https://localhost, iar browserul te intampina cu un ecran rosu de “conexiunea ta nu este privata”. Faci click pe “avanseaza oricum”, muncesti mai departe, si te obisnuiesti cu avertismentul. Problema e ca acel avertisment te antreneaza sa ignori exact semnalul care ar trebui sa te opreasca in productie, plus ca unele tool-uri (webhook-uri, aplicatii mobile, service worker-e) pur si simplu refuza sa vorbeasca cu un certificat in care nu au incredere. Certificatele self-signed nu sunt raspunsul, sunt sursa durerii.

mkcert , unealta scrisa de Filippo Valsorda (fostul lead de securitate pe Go la Google), rezolva asta elegant. E licentiata sub BSD-3, e una dintre cele mai iubite unelte de dev din ecosistem, si o folosim in propriile fluxuri de lucru. Acest articol e raportul de teren, plus varianta cu interfata web pe care o rulam pentru echipe.

Ce este, mai exact, mkcert

mkcert face un singur lucru si il face perfect: genereaza certificate de incredere local pentru dezvoltare. Nu certificate self-signed pe care browserul le respinge, ci certificate semnate de o autoritate de certificare (CA) proprie pe care mkcert o instaleaza in trust store-ul sistemului si al browserelor tale. Din acel moment, orice certificat emis de acel CA e considerat valid de calculatorul tau, fara niciun avertisment.

Diferenta subtila dar cruciala fata de self-signed e increderea. Un certificat self-signed nu are pe nimeni in spate care sa garanteze pentru el, deci browserul se plange. Un certificat mkcert e semnat de CA-ul tau local, iar CA-ul tau local e explicit de incredere pe masina ta pentru ca mkcert l-a inregistrat acolo. E acelasi mecanism prin care functioneaza Let’s Encrypt sau orice CA public, doar ca la scara masinii tale, nu a internetului.

Cum functioneaza pe dedesubt

Fluxul are doi pasi, si e tot ce trebuie sa intelegi:

  1. mkcert -install: creeaza o pereche de chei de CA (o data, la prima rulare) si o instaleaza in trust store-urile relevante, sistemul de operare, plus Firefox si Chrome prin baza de date NSS. Din acest moment, masina ta are incredere in orice semneaza acest CA.
  2. mkcert example.test localhost 127.0.0.1 ::1: emite un certificat valid pentru exact acele nume si IP-uri, semnat de CA-ul tau local. Iti scrie doua fisiere, certificatul si cheia privata, pe care le dai serverului tau local.

Pui certificatul in nginx, in aplicatia ta de Node, in orice, si https://example.test merge cu lacatul verde, fara un singur avertisment. Doi pasi, zero configurare, zero teorie de PKI de invatat.

Ce primesti din cutie

mkcert e minimalist prin design, dar acopera tot ce iti trebuie:

  • Nume multiple pe un certificat: domenii, subdomenii, localhost, adrese IP (IPv4 si IPv6), toate intr-un singur certificat.
  • Certificate wildcard: mkcert "*.example.test" acopera toate subdomeniile deodata.
  • Cross-platform: macOS, Linux si Windows, cu instalare prin Homebrew, pachetele distributiei, Chocolatey/Scoop sau binar direct.
  • Trust store-uri multiple: sistem, Firefox, Chrome, Java, NSS, toate actualizate de -install.
  • Formate: PEM implicit, plus PKCS#12 (.p12) pentru tool-urile care il cer.
  • Certificate S/MIME: pentru semnarea de email in dezvoltare.

Ce nu face, si e prin design: mkcert nu e pentru productie. CA-ul lui e de incredere doar pe masinile pe care l-ai instalat manual. Un vizitator aleator de pe internet va vedea acelasi ecran rosu, pentru ca browserul lui nu cunoaste CA-ul tau. Pentru certificate publice ai nevoie de un CA public (Let’s Encrypt, Google Trust Services), iar mkcert nici nu incearca sa concureze acolo. E unealta pentru dezvoltare, laborator si retele interne, exact acolo unde straluceste.

Instalare si primul certificat

Pe Linux, cel mai simplu e prin managerul de pachete sau binarul direct:

# Debian/Ubuntu
sudo apt install libnss3-tools
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
chmod +x mkcert-v*-linux-amd64
sudo mv mkcert-v*-linux-amd64 /usr/local/bin/mkcert

# instaleaza CA-ul local (o singura data)
mkcert -install

# emite un certificat pentru proiectul tau
mkcert example.test "*.example.test" localhost 127.0.0.1 ::1

A doua comanda iti scrie example.test+4.pem (certificatul) si example.test+4-key.pem (cheia). Le indici in configul serverului tau si gata. In nginx, de exemplu:

server {
    listen 443 ssl;
    server_name example.test;
    ssl_certificate     /cale/example.test+4.pem;
    ssl_certificate_key /cale/example.test+4-key.pem;
}

libnss3-tools e important pe Linux: fara el, mkcert nu poate instala CA-ul in Firefox si Chrome, doar in trust store-ul de sistem. Cu el, toate browserele au incredere din prima.

mkcert pentru o echipa: interfata web

mkcert pe linia de comanda e perfect pentru un dezvoltator la masina lui. Dar cand ai o echipa sau un laborator intern in care mai multi oameni au nevoie de certificate pentru servicii interne, sa distribui manual chei pe Slack devine urat repede. Aici intervine mkcert Web UI , un layer web peste mkcert pe care il rulam noi pentru genul asta de nevoie.

Iti da un dashboard in care emiti certificate pentru orice domeniu si IP fara sa atingi terminalul, in formate PEM, CRT sau PFX. In plus aduce lucruri utile pentru o echipa:

  • Monitorizare de expirare cu notificari email inainte sa expire un certificat.
  • SCEP, protocolul de enrollment automat pentru dispozitive.
  • Autentificare, basic auth sau SSO prin OpenID Connect.
  • Tema dark/light si un UI curat.

Noi il tinem in spatele SSO-ului, ca doar oamenii nostri sa poata emite certificate din CA-ul intern. Un pas de igiena: CA-ul e o cheie de incredere, trateaza-l ca pe un secret. Oricine are cheia privata a CA-ului poate emite certificate pe care masinile tale le vor crede. Nu il expune, nu il pune in Git, si restrictioneaza cine ajunge la interfata.

Tipare de configurare care merita stiute

Cateva lucruri utile dincolo de default-uri.

Distribuie CA-ul, nu certificatele

Daca ai o echipa, nu emite si distribui certificate pe rand. Distribuie o data CA-ul public (mkcert -CAROOT iti arata unde e), instaleaza-l pe masinile echipei, si de acolo fiecare emite ce certificate vrea, toate de incredere pe toate masinile. Un CA, multe certificate.

Foloseste un domeniu .test sau .localhost

Pentru dezvoltare, foloseste TLD-uri rezervate ca .test sau .localhost, care nu vor exista niciodata public. Eviti coliziunile cu domenii reale si e clar din nume ca e mediu de dezvoltare.

Nu pune CA-ul in imagini Docker publice

Tentatia e sa incluzi CA-ul intr-o imagine de dezvoltare ca sa fie “gata”. Nu o face pentru imagini care ajung intr-un registry public, ai publicat o cheie de CA. Monteaza-l la runtime dintr-un volum, nu il coace in imagine.

PKCS#12 pentru tool-urile incapatanate

Unele tool-uri (Java, anumite clienti) nu vor PEM ci .p12. mkcert scoate direct formatul cu mkcert -pkcs12 example.test, fara sa te chinui cu incantatii openssl.

Unde mkcert nu e raspunsul potrivit

Merita sa fim onesti despre limite.

  • Nu e pentru productie. Repetam pentru ca e cea mai frecventa greseala: CA-ul mkcert e de incredere doar unde l-ai instalat manual. Un site public are nevoie de un certificat de la un CA public.
  • Nu e management de certificate la scala. Pentru rotatia automata a sute de certificate de productie ai nevoie de un ACME (Let’s Encrypt, Google Trust Services), nu de mkcert.
  • CA-ul local e o suprafata de risc. Daca cineva fura cheia CA-ului tau si ti-o instaleaza fara sa stii, poate emite certificate in care ai incredere. Trateaza -CAROOT cu grija.
  • Nu rezolva increderea intre masini straine. Doua calculatoare care nu au acelasi CA instalat nu vor avea incredere unul in certificatele celuilalt. E o unealta local-first prin definitie.

Alternative pe care le-am luat in calcul

Pentru completitudine: ne-am uitat si la openssl pur (poti face tot ce face mkcert, dar cu zece comenzi criptice si sanse mari sa gresesti un camp), Caddy (care emite automat certificate locale de incredere pentru dezvoltare, excelent daca oricum il folosesti ca server), si step-ca de la Smallstep (un CA privat complet cu ACME, mult mai capabil dar si mult mai greu, potrivit cand chiar vrei o PKI interna serioasa). Pentru “vreau HTTPS local care merge acum, fara sa devin expert in PKI”, mkcert e cel mai direct la tinta.

Deci, sa-l rulezi?

Daca dezvolti orice serviciu web local si te-ai saturat de ecranul rosu, mkcert merita cele cinci minute de instalat. Prima data cand https://proiectul-tau.test se deschide cu lacatul verde, fara un singur avertisment, fara sa fi invatat un cuvant de teorie PKI, vei intelege de ce e una dintre cele mai iubite unelte de dezvoltare din ecosistem.

Daca ai o echipa sau un laborator intern, adauga mkcert Web UI in spatele unui SSO si distribuie CA-ul o data pe toate masinile, iar emiterea de certificate devine un click. Noi il rulam exact asa, pentru serviciile noastre interne. Daca vrei sa-l pui pe infrastructura pe care nu trebuie sa o construiesti tu intai, planurile noastre VPS sunt perfecte pentru un mic server de certificate intern, iar serviciul de administrare server acopera setup-ul si integrarea cu SSO daca preferi sa sari peste curba de invatare.

Oricum ai alege, o seara fara ecrane rosii de browser e o seara mai buna. Codul e pe GitHub, instalarea e o singura comanda, si vei sti in cinci minute daca isi castiga un loc in fluxul tau de lucru.

Avem Incredere & Suntem Membri

Suntem membri ai principalelor organizatii de infrastructura internet.

RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX