doc:guides:sslca

Certificats digitals amb OpenSSL

Si tens algun servidor web o de correu, tard o d'hora tindràs la necessitat de generar-te un certificat digital si necessites SSL sobre el servei. I, a no ser que treballis per una gran empresa que es pot permetre la certificació de Verisign o altres companyies també t'hauras de generar la teva CA.

L'eina per excel·lència (i lliure) per a Linux és OpenSSL. Les seves llibreries ja van per defecte en moltes distribucions i s'usen per la gran majoria de serveis i eines d'encriptació de sistema. El problema està en si has d'usar l'eina de línia de comandes per generar-te certificats, ja que no és gens fàcil encara que estiguis abessat amb els conceptes i terminologia del tema.

Per evitar-me problemes i haver de llegir cada cop tota la documentació per saber com funciona, vaig fer-me un Makefile per mantenir la meva pròpia CA i generar-me certificats nous cada cop que ho necessités sense problemes. El pots consultar a la Factoria, encara que la versió més nova sempre estarà al repositori CVS de la factoria.

En aquest document intento fer un resum de l'ús típic d'openssl per si algú li dóna un cop de mà (espero), tot i així doncs per suposat que es tenen coneixements de com funciona el sistema de certificació digital i clau pública, en centro només en l'ús d'openssl.

El primer pas per obtenir un certificat digital és generar la parella de claus pública-privada que necessitem per treballar amb SSL. La subcomanda openssl que necessitem serà genrsa per a claus RSA o gendsa per a claus DSA.

Clau DSA

La clau DSA és una mica més complexa de generar, ja que primer cal generar uns paràmetres amb la subcomanda dsaparam que després seran usats per generar la clau. El procés seria:

# openssl dsaparam -out <fitxer-parametres> <num_bits>
# openssl gendsa (-des|-des3|-aes128|...) -out <fitxer_clau> <fitxer-parametres>
  

Com podem observar la subcomanda gendsa utlitza el fitxer generat per dsaparam per generar la clau. Pel que fa a l'encriptació simètrica de la clau, podem escollir entre diferents algoritmes, típicament DES i triple-DES, encara que solen haver-n'hi molt més (IDEA, AES, …), per veure una llista dels suportats podem usar la comanda openssl –verify

Clau RSA

Generar la clau RSA (més típica) és més senzill i ho podem fer en una sola comanda

# openssl genrsa -out <fitxer_clau> (-des|-des3|-aes128|...) <num_bits>
  

El següent pas es generar un CSR o petició de signatura de certificat. Consisteix en generar un fitxer .req amb la nostra clau pública i les dades que volem certificar. Aquest document és el que ens ha de signar la CA per obtenir el certificat digital final.

Per generar la petició de signatura:

# openssl req -new (-md5|-sha1|...) -key <fitxer_clau> -days <dies> -out fitxer_CSR>
  

Juntament amb el CSR s'inclou una firma (digest o resum) de la informació del certificat per validar que sigui correcte, podem especificar quin algorisme de hash volem usar (per defecte md5). De nou per veure quins estan suportats podem mirar la comanda openssl –verify

Com podem veure també podem indicar quina caducitat volem que tingui el certificat, per defecte s'obté del fitxer de configuració.

Arribats a aquest punt només necessitem que la CA en signi la petició CSR, i ens doni el certificat digital ja signat (i per tant de confiança). Si (com sol ser) no estàs disposat a pagar una autoritat certificadora de confiança, ens l'hem de generar nosaltres mateixos. Per crear la nostra propia CA haurem de seguir els passos dels següents apartats.

Una CA és compon bàsicament de les mateixes coses que un certificat normal: Una clau pública, una clau privada i el certificat digital. La diferència clau és que la CA no està signada per ningú de confiança, sinó per ella mateixa (el que s'anomena un self-signed-certificate), a més està validat per signar altres certificats.

Així també cal generar una clau per la CA com hem vist abans, però com aquest cop l'hem d'autosignar. la sintaxis varia una mica

# openssl req -x509 -newkey rsa:<num_bits> (-md5|-sha1|...) -keyout <fitxer_clau_CA> -out <fitxer_certificat_CA> -days <dies_validesa>
  

Com podem veure amb una sola comanda generem les claus i fem l'autosignatura, això és el que fa -x509 a més d'afegir algunes extensions al certificat. A més ja genera la sortida en dos fitxers separats: fitxerclauCA que contindrà la clau privada de la CA (guardar amb molta cura), i fitxercertificatCA que és el certificat amb la clau pública de la CA. Instal·lant aquest útlim en els navegadors/lectors de correu/aplicacions farem que aquests confïn automàticament en tots els certificats signats per aquesta CA.

De nou cal tenir en compte algunes diferències si la clau és DSA. En aquest cas cal repetir la generació de paràmetres DSA que hem vist abans i després la generació de la CA es faria amb aquesta comanda:

# openssl req -x509 -newkey dsa:<parametres_dsa> (-md5|-sha1|...) -keyout <fitxer_clau_CA> -out <fitxer_certificat_CA> -days <dies_validesa>    
  

Un cop ja tenim la CA podem signar els certificats fent:

# openssl ca -md (md5|sha1|...) -keyfile <clau_CA> -cert <certificat_CA> -in <fitxer_CSR> -out <fitxer_certificat>
  

Revocar (invalidar) un certificat

Ja sigui per que ha caducat o la clau privada ha estat compromesa, podem necessitar invalidar un certificat. Això s'anomena revocar el certificat, tasca típica d'una CA.

En general al mateix moment que signa el certificat se'n fa la revocació, que consiteix en generar un certificat signat també per la CA on es considera invalidat el certificat en questió. Aquest fitxer però es guarda en clau i pany fins que sigui necessari el seu ús, en aquell moment la CA el publica i així es pot saber que aquell certificat ja no és vàlid.

# openssl ca -revoke <certificat_client> -keyfile <clau_CA> -cert <certificat_CA>
  

Publicació de revocacions de certificats

Com hem dit, el certificat no s'invalida fins que no es fa pública la seva revocació. Això es fa mitjançant les CRL, que és una llista dels certificats que s'han revocat signada per la CA. Els clients haurien de consultar aquesta llista cada cop que intenten validar el certificat per saber si encara és vàlid, i és responsabilitat de la CA de publicar-les.

# openssl ca -gencrl -keyfile <clau_CA> -cert <certificat_CA> -out <llista_CRL>
  

Per afegir més problemes a la certificació digital exiteixen molt formats diferents, per sort tots estàndards acceptats. Però no hi ha un format universal, les aplicacions més típiques usen cadascuna el format que li convé. TODO.

OpenSSL, i en aquests exemples, usa per defecte el format PEM, a més existeixen el DER, els PKCS, … openssl ofereix diverses subcomandes per convertir entre formats. Cal tenir en compte que alguns formats ho inclouen tot en un sol fitxer (claus i certificat) i d'altres formats ho separen en part pública i privada.

PKCS12

# openssl pkcs12 -export -in <certificat> -inkey <clau> -out <fitxer_PKCS12<

DER

# openssl (rsa|dsa) -inform PEM -outform DER -in <clau> -out <fitxer_DER>
  

El fitxer de configuració, al igual que openssl, sacrifica la senzillesa per la potència. Realment ofereix moltes opcions interessants com diferents polítiques de certificació, afegir camps als certificats, etc.

A aquesta complexitat si afegeix la falta de suport o alguns bugs d'algunes apliacions a l'hora d'interpretar alguns camps o extensions dels certificats. Tot i això el fitxer de configuració de sèrie bé força ben documentat i és fàcil intuïr que fa cada opció. D'altres opcions són més obscures i has de saber realment el que fas. Personalment et recomano fer-ne una lectura que potser t'ajudarà a entendre algun concepte i que si no l'entens excessivament et limitis a canviar les opcions senzilles com la ubicació de directoris i algorismes a usar.

Notes

Com ja he comentat al principi, aquest document l'he anat escrivint a mesura que creava un Makefile per gestionar més fàcilment la CA de Lady 3Jane. És molt útil per fer un breu repàs de les regles i dependències i saber que necessites per fer què i quines subcomandes d'openssl cal usar per cada cosa. Si l'uses cal tenir compte amb algunes coses:

* És un Makefile, no un script: Alerta amb les dependències, alguna regla prodria sobreescriure coses importants
* Cal ser root per què modifica el fitxer /etc/ssl/openssl.cnf, NO fa còpia
* Alerta amb els targets clean i distclean
* Conserva la jerarquia de directoris de la CA enlloc segur (no en el teu UpLoads del P2P), i agafa només el que necessitis (Certificats, claus, ...)
* Evidentment pots decidir no posar password en cap clau (el més habitual per a certificats de servidor), però és altament recomanable (FES-HO) posar-ne al certificat de la CA
* PKCS Format
* [[doc>OSPKI/|PKI Book]]
* [[man>openssl|La pàgina de manual]]

openssl falla sovint (per exemple per password erroni) i els errors no són gaire descriptius. A més moltes vegades crea el fitxer destí encara que no n'hagi generat el contingut fent que una segona invocació del Makefile doni un up to date

  • doc/guides/sslca.txt
  • Last modified: 2023/06/26 15:13
  • by Count Zero