La vostra VPN respon connexions a les 3 de la matinada mentre la màquina que signa els seus certificats està apagada en un calaix. Un client que valida el certificat del servidor mai no contacta amb la vostra CA, així que la CA no ha de ser accessible per a cap connexió. La part que necessita planificació és el dia que cal emetre, renovar o revocar un certificat mentre la clau arrel roman tancada amb pany.

Què valida realment una connexió

Quan el client OpenVPN es connecta, recorre la cadena de signatures des del certificat fulla del servidor fins a un certificat de CA en què ja confia, comprova la finestra de validesa i, si el perfil ho indica, consulta una llista de revocació. Mai no busca la vostra CA arrel. El servidor fa la imatge inversa per als certificats de client. En el moment de la connexió només hi ha presents el certificat fulla, l’intermedi i el paquet de confiança que vau distribuir abans.

El que falla realment és una de tres coses: la clau de signatura no està disponible en l’emissió, una llista de revocació ha quedat obsoleta o el paquet de confiança del client és més antic que la cadena que presenta el servidor. La primera és un problema de procés; les altres dues són problemes de distribució. Cap d’elles no requereix que la clau arrel sigui en línia, i un servei VPN gestionat que exigeix un certificat privat per a l’autenticació del túnel només trasllada l’autoritat de signatura al proveïdor. Azure punt a lloc funciona a l’inrevés: pugeu un certificat arrel i els certificats signats sota ell es consideren de confiança, així que pregunteu qui signa, qui valida i com es retira un certificat abans d’hora.

Construïu l’arrel en un amfitrió que mai no rep una adreça

Una arrel fora de línia s’usa poques vegades: per signar el certificat de la CA intermèdia i, més endavant, per renovar-lo o revocar-lo. La resta passa un nivell més avall. Feu la feina de l’arrel en una màquina mantinguda fora de la xarxa, si és possible des d’un sistema viu, i anoteu qui era a la sala. Les ordres assumeixen OpenSSL 1.1.1 o més recent, perquè -addext no és disponible en compilacions antigues.

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out root.key
openssl req -x509 -new -key root.key -sha256 -days 7300 \
  -subj "/CN=Example VPN Root CA" -out root.crt \
  -addext "basicConstraints=critical,CA:TRUE" \
  -addext "keyUsage=critical,keyCertSign,cRLSign"

Creeu la intermèdia a l’amfitrió de signatura i porteu només la seva sol·licitud a la màquina fora de línia. L’arrel signa aquesta sol·licitud amb una longitud de camí zero, de manera que la CA intermèdia pot signar certificats de punt final però no pot crear una altra CA sota seu. Aquesta única extensió impedeix que un amfitrió de signatura compromès encunyi una autoritat equivalent a l’arrel. Feu servir ECDSA només si cada client executa OpenVPN 2.4 o més recent; en cas contrari genereu claus RSA i manteniu el flux idèntic.

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out intermediate.key
openssl req -new -key intermediate.key -subj "/CN=Example VPN Intermediate CA" -out intermediate.csr
openssl x509 -req -in intermediate.csr -CA root.crt -CAkey root.key \
  -CAcreateserial -days 3650 -sha256 -extfile intermediate.ext -out intermediate.crt

intermediate.ext conté basicConstraints=critical,CA:TRUE,pathlen:0, keyUsage=critical,keyCertSign,cRLSign i authorityKeyIdentifier=keyid:always. Torneu la clau arrel a la caixa forta abans que es reconnecti l’amfitrió de signatura. Si l’arrel ha de poder revocar la intermèdia, signeu-la amb openssl ca -config root.cnf -extensions intermediate_ca contra un index.txt d’abast arrel en lloc de openssl x509 -req, perquè el número de sèrie quedi registrat; després envieu la llista arrel resultant dins del perfil del client, on un crl-verify basat en fitxer la llegeix en arrencar. Envieu als clients un paquet amb els dos certificats de CA; un certificat fulla sol no es validarà contra l’arrel.

Emeteu fulls des de la intermèdia, amb una base de dades

Signar amb openssl x509 -req funciona fins que cal revocar, perquè res no registra el número de sèrie. Useu openssl ca des del primer certificat perquè el número de sèrie, la caducitat i l’estat de revocació visquin en una sola base de dades. Creeu els fitxers de la base de dades un cop i després apunteu-hi la configuració:

mkdir -p /etc/vpn-ca/intermediate/newcerts
touch /etc/vpn-ca/intermediate/index.txt
echo 1000 > /etc/vpn-ca/intermediate/serial
echo 1000 > /etc/vpn-ca/intermediate/crlnumber
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/vpn-ca/intermediate
database = $dir/index.txt
new_certs_dir = $dir/newcerts
serial = $dir/serial
crlnumber = $dir/crlnumber
certificate = $dir/intermediate.crt
private_key = $dir/intermediate.key
default_md = sha256
default_days = 365
default_crl_days = 30
unique_subject = no
policy = policy_any
[ policy_any ]
commonName = supplied
[ server_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @server_names
[ client_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = clientAuth
[ server_names ]
DNS.1 = vpn.example.com

La línia d’ús de clau assumeix una clau ECDSA; afegiu keyEncipherment per a RSA. Doneu a cada client el seu propi nom comú, perquè OpenVPN identifica una connexió per aquest camp, i dos portàtils que comparteixen CN=vpn-client no es poden distingir en els registres, en les regles de client-config-dir ni en cap enviament per usuari, i perdeu l’atribució que fa defensable una decisió de revocació. Emeteu i valideu un full així:

openssl req -new -key alice.key -subj "/CN=alice-laptop" -out alice.csr
openssl ca -config intermediate.cnf -extensions client_cert -in alice.csr -out alice.crt -batch
openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt alice.crt

Mantingueu la clau de signatura darrere d’una frontera de política en lloc de copiar-la a l’amfitrió VPN: un servei petit que autentica la sol·licitud, comprova el nom comú contra una llista d’autoritzats i retorna només el certificat. Registreu cada número de sèrie; el registre és l’únic enllaç entre un certificat i la persona que el va demanar.

Publiqueu la revocació sense despertar l’arrel

Els certificats de client els revoca la intermèdia, mai l’arrel. La llista arrel només importa quan es crema una intermèdia. Apunteu el servidor a la llista intermèdia amb crl-verify. Una CRL basada en fitxer es carrega en iniciar el servei, així que recarregueu-la després de cada regeneració; la forma de directori llegeix l’estat en el moment de la connexió i costa un fitxer per número de sèrie.

Revogueu i regenereu amb dues ordres de la mateixa base de dades:

openssl ca -config intermediate.cnf -revoke /etc/vpn-ca/intermediate/newcerts/1001.pem
openssl ca -config intermediate.cnf -gencrl -out /etc/openvpn/crl.pem

Després vigileu el rellotge. Una CRL porta un camp de propera actualització, i quan aquesta data passa, un parell que valida rebutja la llista en lloc d’ignorar-la. Regenerar mensualment amb default_crl_days = 30 deixa marge; regenerar anualment no. Uns temps de vida de full més curts són el control més fiable, perquè la revocació només s’aplica allà on es consulta la llista.

Proveu la cadena i després escriviu la cerimònia

Reproduïu quatre fallades abans de confiar en el disseny. Valideu la cadena amb openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt. Connecteu-vos amb un certificat de client caducat i confirmeu que el servidor el rebutja. Revogueu un client de prova, recarregueu i confirmeu que la llista fa efecte. Avanceu el rellotge d’un amfitrió un dia, perquè un rellotge incorrecte pot emetre i rebutjar certificats que semblen vàlids en un altre lloc.

Una arrel fora de línia només és un control si existeix el paperam: dues persones nomenades per a la cerimònia, un registre de cada número de sèrie signat, una còpia de seguretat xifrada guardada a part de la màquina i una prova de restauració en un amfitrió aïllat. Signeu una intermèdia de recanvi durant la mateixa cerimònia perquè un amfitrió de signatura mort no us obligui a desbloquejar l’arrel a mitjanit.

Abans de donar-ho per acabat, confirmeu cinc coses: la clau arrel no és en un amfitrió en xarxa, la clau intermèdia només viu a l’amfitrió de signatura, el paquet del client porta els dos certificats de CA, la CRL té una propera actualització futura i algú posseeix una entrada d’agenda per a cada caducitat de la cadena. Si en falta una, la configuració que sembla fora de línia només és indocumentada.

Articles relacionats