VPN:si vastaa yhteyksiin kello 3 yöllä, kun taas kone, joka allekirjoittaa sen varmenteet, on sammutettuna laatikossa. Palvelimen varmenteen validoiva asiakas ei koskaan ota yhteyttä CA:han, joten CA:n ei tarvitse olla tavoitettavissa mitään yhteyttä varten. Osa, joka vaatii suunnittelua, on päivä, jolloin varmenne on myönnettävä, uusittava tai peruutettava samalla kun juuriavain pysyy lukittuna.

Mitä yhteys oikeastaan validoi

Kun OpenVPN-asiakas yhdistää, se kulkee allekirjoitusketjun palvelimen lehtivarmenteesta ylöspäin CA-varmenteeseen, johon se jo luottaa, tarkistaa voimassaoloikkunan ja katsoo profiilin niin sanoessa peruutuslistaa. Se ei koskaan hae juuri-CA:tasi. Palvelin tekee peilikuvan asiakasvarmenteille. Yhteyshetkellä paikalla ovat vain lehtivarmenne, välittäjävarmenne ja aiemmin jakamasi luottamuspaketti.

Mikä oikeastaan epäonnistuu, on yksi kolmesta: allekirjoitusavain ei ole käytettävissä myönnettäessä, peruutuslista on vanhentunut tai asiakkaan luottamuspaketti on vanhempi kuin palvelimen esittämä ketju. Ensimmäinen on prosessiongelma; kaksi muuta ovat jakeluongelmia. Mikään niistä ei vaadi juuriavaimen olevan verkossa, ja hallittu VPN-palvelu, joka vaatii yksityisen varmenteen tunnelin todennukseen, siirtää vain allekirjoitusvallan palveluntarjoajalle. Azure piste-sivusto toimii päinvastoin: lataat juurivarmenteen, ja sen alle allekirjoitetut varmenteet hyväksytään, joten kysy, kuka allekirjoittaa, kuka validoi ja miten varmenne vedetään takaisin aikaisin.

Rakenna juuri isäntään, joka ei koskaan saa osoitetta

Offline-juurta käytetään harvoin: välittäjä-CA:n varmenteen allekirjoittamiseen ja myöhemmin sen uusimiseen tai peruuttamiseen. Kaikki muu tapahtuu yhden tason alempana. Tee juurityö koneella, joka pidetään poissa verkosta, mahdollisuuksien mukaan live-järjestelmästä, ja kirjaa, ketä huoneessa oli. Komennot edellyttävät OpenSSL 1.1.1:tä tai uudempaa, koska -addext ei ole vanhemmissa koosteissa.

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"

Luo välittäjä allekirjoitusisännällä ja vie vain sen pyyntö offline-koneelle. Juuri allekirjoittaa pyynnön polun pituudella nolla, joten välittäjä-CA voi allekirjoittaa päätepisteiden varmenteita mutta ei saa luoda toista CA:ta allensa. Se yksi laajennus estää kompromettoitunutta allekirjoitusisäntää luomasta juuren veroista valtaa. Käytä ECDSA:ta vain, jos jokainen asiakas ajaa OpenVPN 2.4:ää tai uudempaa; muuten luo RSA-avaimet ja pidä kulku samana.

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 sisältää basicConstraints=critical,CA:TRUE,pathlen:0, keyUsage=critical,keyCertSign,cRLSign ja authorityKeyIdentifier=keyid:always. Palauta juuriavain kassakaappiinsa ennen kuin allekirjoitusisäntä kytketään uudelleen. Jos juuren on voitava peruuttaa välittäjä, allekirjoita se komennolla openssl ca -config root.cnf -extensions intermediate_ca juuritason index.txt vasten komennon openssl x509 -req sijaan, jotta sarjanumero tallentuu; lähetä sitten syntyvä juurilista asiakasprofiilin sisällä, jossa tiedostopohjainen crl-verify lukee sen käynnistyksessä. Lähetä asiakkaille paketti, jossa on molemmat CA-varmenteet; pelkkä lehtivarmenne ei validoidu juurta vasten.

Myönnä lehdet välittäjältä, tietokannan kanssa

Komennolla openssl x509 -req allekirjoittaminen toimii, kunnes tarvitset peruutusta, koska mikään ei tallenna sarjanumeroa. Käytä komentoa openssl ca ensimmäisestä varmenteesta lähtien, jotta sarjanumero, vanheneminen ja peruutustila elävät yhdessä tietokannassa. Luo tietokantatiedostot kerran ja osoita sitten kokoonpano niihin:

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

Avaimen käytön rivi olettaa ECDSA-avaimen; lisää keyEncipherment RSA:ta varten. Anna jokaiselle asiakkaalle oma yleisnimensä, koska OpenVPN tunnistaa yhteyden tuosta kentästä, eikä kahta kannettavaa, jotka jakavat CN=vpn-client, voi erottaa toisistaan lokeissa, client-config-dir-säännöissä tai missään käyttäjäkohtaisessa pushissa, ja menetät sen kohdistuksen, joka tekee peruutuspäätöksestä puolustettavan. Myönnä ja validoi lehtivarmenne näin:

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

Pidä allekirjoitusavain käytäntörajan takana sen sijaan, että kopioisit sen VPN-isäntään: pieni palvelu, joka todennuspyynnön, tarkistaa yleisnimen sallittujen luetteloa vasten ja palauttaa vain varmenteen. Kirjaa jokainen sarjanumero; loki on ainoa yhteys varmenteen ja sitä pyytäneen henkilön välillä.

Julkaise peruutus herättämättä juurta

Asiakasvarmenteet peruuttaa välittäjä, ei koskaan juuri. Juurilistalla on merkitystä vain, kun välittäjä on poltettu. Osoita palvelin välittäjälistaan komennolla crl-verify. Tiedostopohjainen CRL ladataan palvelun käynnistyksessä, joten lataa se uudelleen jokaisen uudelleenluonnin jälkeen; hakemistomuoto lukee tilan yhteyshetkellä ja maksaa yhden tiedoston sarjanumeroa kohden.

Peruuta ja luo uudelleen kahdella komennolla samasta tietokannasta:

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

Seuraa sitten kelloa. CRL kantaa seuraavan päivityksen kentän, ja kun se päivä on ohitettu, validoiva osapuoli hylkää listan sen sijaan, että jättäisi sen huomiotta. Kuukausittainen uudelleenluonti komennolla default_crl_days = 30 jättää pelivaraa; vuosittainen ei. Lyhyemmät lehtien eliniät ovat luotettavampi valvonta, koska peruutus koskee vain siellä, missä listaa tarkastellaan.

Testaa ketju ja kirjoita sitten seremonia muistiin

Toisinna neljä epäonnistumista ennen kuin luotat suunnitelmaan. Validoi ketju komennolla openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt. Yhdistä vanhentuneella asiakasvarmenteella ja varmista, että palvelin hylkää sen. Peruuta testiasiakas, lataa uudelleen ja varmista, että lista astuu voimaan. Siirrä isännän kelloa päivä eteenpäin, koska väärä kello voi myöntää ja hylätä varmenteita, jotka näyttävät muualla kelvollisilta.

Offline-juuri on valvonta vain, jos paperityö on olemassa: kaksi nimettyä henkilöä seremonialle, kirjaus jokaisesta allekirjoitetusta sarjanumerosta, salattu varmuuskopio, joka säilytetään erillään koneesta, ja palautustesti eristetyllä isännällä. Allekirjoita varavälittäjä saman seremonian aikana, jotta kuollut allekirjoitusisäntä ei pakota sinua avaamaan juuren keskiyöllä.

Ennen kuin sanot sitä valmiiksi, varmista viisi asiaa: juuriavain ei ole verkkoon kytketyllä isännällä, välittäjäavain elää vain allekirjoitusisännällä, asiakaspaketti kantaa molemmat CA-varmenteet, CRL:llä on tulevaisuudessa seuraava päivitys ja jollakulla on kalenterimerkintä jokaisesta ketjun vanhenemisesta. Jos jokin puuttuu, verkosta irrallaan näyttävä kokoonpano on vain dokumentoimaton.

Aiheeseen liittyvät artikkelit