Verificator de potrivire certificat și cheie privată

Se lipește certificatul pe care îl folosește un server și cheia privată care urmează să fie implementată cu el, iar această pagină răspunde la întrebarea la care eșuează un site după implementare: cele două provin din aceeași pereche de chei? Răspunsul nu este o presupunere bazată doar pe lungimile modulilor sau pe amprente — pagina semnează o provocare fixă cu cheia privată și verifică acea semnătură cu cheia publică din certificat. Dacă verificarea reușește, cele două aparțin împreună; dacă eșuează, nicio modificare a configurației nu le va face să funcționeze. Ambele citiri sunt afișate alăturat, cu algoritmul, dimensiunea cheii, identificatorul cheii subiectului și amprenta cheii publice, iar nimic din ce se lipește nu părăsește browserul.
1. Certificat sau lanț
Se lipesc câte blocuri se doresc. Fiecare certificat este verificat față de fiecare cheie, deci un lanț plus o cheie arată exact ce certificat din lanț corespunde cheii — o surpriză frecventă pe un server care servește un certificat greșit dintr-un pachet. Se citesc PEM, un corp base64 sau hexazecimal simplu și un fișier PKCS#7 .p7b; verificatorul de certificate auditează certificatul în sine după ce cheia este stabilită.
2. Cheie privată sau cheia publică
Sunt înțelese cheile PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 (BEGIN RSA PRIVATE KEY), SEC1 (BEGIN EC PRIVATE KEY) și o cheie publică SPKI simplă (BEGIN PUBLIC KEY), precum și un fișier de cheie lipit ca base64 sau hexazecimal. O cheie PKCS#8 criptată (BEGIN ENCRYPTED PRIVATE KEY) nu poate fi citită de un browser și este raportată ca atare, împreună cu comanda care elimină parola.
nimic verificat încă
Exemplul este un certificat autosemnat și cheia privată care îi aparține, ambele făcute pentru această pagină și care nu protejează nimic. Se înlocuiește cheia cu oricare altă cheie pentru a vedea celălalt verdict, sau se pune blocul cheii publice în locul celei private pentru a vedea potrivirea cheii publice.
O cheie privată lipită în orice pagină web merită o a doua gândire mai întâi. Această pagină este un singur fișier de JavaScript simplu, nu încarcă nimic de nicăieri și nu face nicio cerere, deci cheia este citită, folosită și uitată în interiorul acestei file. Aceasta este totuși o promisiune făcută de un cod care poate fi citit, nu o garanție dintr-o rețea care poate fi văzută: dacă se lucrează cu o cheie de producție, se lucrează offline, iar cea mai sigură verificare este aceeași comandă openssl pe propriul server. O cheie lipită aici nu este niciodată stocată, nu este pusă într-un fișier și nu este trimisă nicăieri — inclusiv prin butoanele de export, care scriu constatări despre cheie și niciodată cheia în sine.
De ce semnarea este răspunsul. Două fișiere pot arăta la fel și totuși să nu se potrivească: cheile RSA sunt comparate prin modul în majoritatea ghidurilor, dar aceasta funcționează doar pentru RSA, iar o cheie poate avea modulul corect cu un exponent deteriorat sau cu un padding greșit. Această pagină dovedește perechea așa cum o face un handshake — semnează o provocare fixă cu cheia privată și verifică semnătura cu cheia publică din certificat — deci verdictul este valabil atât pentru RSA, cât și pentru ECDSA și Ed25519. Când se lipește doar jumătatea publică, octeții cheii publice se compară direct cu cei din certificat, ceea ce este la fel de concludent pentru identitate, doar că fără dovada că cineva deține jumătatea privată.

Ce nu spune o potrivire. Că cheia este cea încărcată efectiv de server, că certificatul este de încredere, că fișierul cheii este intact pe disc sau că cheia nu a fost copiată de altcineva. Nici nu poate spune dacă certificatul este cel pe care îl va primi un client, deoarece un echilibrator de sarcină sau un CDN din fața site-ului poate servi unul diferit. Pentru a verifica ce prezintă de fapt un server activ, se rulează openssl s_client -connect example.com:443 -servername example.com -showcerts și se lipește ieșirea în caseta certificatului.

De unde provin fișierele. Certificatul este cel cu care este configurat serverul, sau cel exportat dintr-un browser ori scos dintr-un pachet .p7b. Cheia privată este fișierul pe care îl citește serverul web la pornire, de obicei ceva de genul privkey.pem sau server.key. Dacă cheia este criptată, se decriptează mai întâi o copie cu openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem, se lipește aceasta și apoi copia se șterge.
Nimic verificat încă. Se lipesc un certificat și o cheie mai sus, apoi se apasă Verificare dacă se potrivesc. Verdictul apare aici împreună cu dovezile din spatele lui, iar raportul poate fi copiat sau salvat.
Aceeași verificare cu openssl, pe propriul calculator
# cheia publică din interiorul certificatului openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256 # cheia publică din interiorul cheii private openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256 # cele două digesturi sunt egale doar când perechea aparține împreună # varianta veche, numai pentru RSA: compararea modulilor openssl x509 -in cert.pem -noout -modulus | openssl md5 openssl rsa -in key.pem -noout -modulus | openssl md5
Compararea digesturilor funcționează pentru orice tip de cheie și corespunde cu amprenta cheii publice raportată de această pagină, în timp ce comparația modulilor există doar pentru RSA. Niciuna dintre ele nu dovedește că cineva deține jumătatea privată — verificarea prin semnătură de mai sus o face, de aceea o folosește această pagină.
Ce conține raportul. Verdictul, perechea de citiri din care a provenit (algoritm, dimensiunea cheii, curba, identificatorul cheii subiectului și amprenta cheii publice, atât pentru certificat, cât și pentru cheie) și testul exact care a fost rulat. Raportul nu conține niciodată cheia privată: cheia este folosită pentru a produce o semnătură și nu este scrisă în text, în JSON sau în clipboard. Ce se copiază sau se salvează este sigur de atașat unui tichet; cheia lipită nu este, iar clipboardul trebuie tratat ca singurul alt loc în care a existat vreodată.

Confidențialitate: certificatul și cheia sunt citite în interiorul filei, nimic nu se încarcă, iar pagina nu face nicio cerere — nu există nicio sondare și nicio căutare pe această pagină. Pentru a crea o pereche potrivită se folosește generatorul de certificate autosemnate; pentru a cere un certificat pentru o cheie existentă se folosește generatorul de CSR; pentru a citi ce conține un certificat se folosește decodorul de certificate.