Jūsu VPN atbild uz savienojumiem pulksten 3 naktī, kamēr mašīna, kas paraksta tā sertifikātus, stāv izslēgta atvilktnē. Klients, kas validē servera sertifikātu, nekad nesazinās ar jūsu CA, tāpēc CA nav jābūt sasniedzamai nevienam savienojumam. Daļa, kurai nepieciešama plānošana, ir diena, kad sertifikāts jāizdod, jāatjauno vai jāatsauc kamēr saknes atslēga paliek aizslēgta.

Ko savienojums faktiski validē

Kad OpenVPN klients savienojas, tas iet pa parakstu ķēdi no servera lapas sertifikāta uz augšu līdz CA sertifikātam, kuram jau uzticas, pārbauda derīguma logu un, ja profils tā saka, aplūko atsaukšanas sarakstu. Tas nekad nemeklē jūsu saknes CA. Serveris veic spoguļattēlu klientu sertifikātiem. Savienojuma laikā ir tikai lapa, starpposma sertifikāts un iepriekš izplatītā uzticības pakete.

Faktiski neizdodas viens no trim: parakstīšanas atslēga izdošanas laikā nav pieejama, atsaukšanas saraksts ir novecojis vai klienta uzticības pakete ir vecāka par ķēdi, ko serveris uzrāda. Pirmais ir procesa problēma; pārējie divi ir izplatīšanas problēmas. Neviena no tām neprasa, lai saknes atslēga būtu tiešsaistē, un pārvaldīts VPN pakalpojums, kas tuneļa autentifikācijai pieprasa privātu sertifikātu, tikai pārceļ parakstīšanas pilnvaru pie pakalpojumu sniedzēja. Azure punkts-uz-vietu darbojas pretēji: jūs augšupielādējat saknes sertifikātu, un sertifikāti, kas parakstīti zem tā, tiek uzskatīti par uzticamiem, tāpēc jautājiet, kas paraksta, kas validē un kā sertifikāts tiek atsaukts agrāk.

Veidojiet sakni resursdatorā, kas nekad nesaņem adresi

Bezsaistes sakne tiek izmantota reti: lai parakstītu starpposma CA sertifikātu un vēlāk to atjaunotu vai atsauktu. Viss pārējais notiek vienu līmeni zemāk. Saknes darbu veiciet mašīnā, kas turēta ārpus tīkla, ja iespējams, no dzīvas sistēmas, un pierakstiet, kas bija telpā. Komandas pieņem OpenSSL 1.1.1 vai jaunāku, jo -addext vecākās būvēs nav.

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"

Izveidojiet starpposma sertifikātu parakstīšanas resursdatorā un nogādājiet tikai tā pieprasījumu uz bezsaistes mašīnu. Sakne paraksta šo pieprasījumu ar nulles ceļa garumu, tāpēc starpposma CA drīkst parakstīt galapunktu sertifikātus, bet nedrīkst izveidot citu CA zem sevis. Šis viens paplašinājums neļauj kompromitētam parakstīšanas resursdatoram radīt saknei līdzvērtīgu institūciju. Izmantojiet ECDSA tikai tad, ja katrs klients darbojas ar OpenVPN 2.4 vai jaunāku; pretējā gadījumā ģenerējiet RSA atslēgas un saglabājiet to pašu plūsmu.

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 satur basicConstraints=critical,CA:TRUE,pathlen:0, keyUsage=critical,keyCertSign,cRLSign un authorityKeyIdentifier=keyid:always. Atgrieziet saknes atslēgu tās seifā pirms parakstīšanas resursdatora atkārtotas pievienošanas. Ja saknei jāspēj atsaukt starpposma sertifikātu, parakstiet to ar openssl ca -config root.cnf -extensions intermediate_ca pret saknes līmeņa index.txt, nevis ar openssl x509 -req, lai sērijas numurs tiktu ierakstīts; pēc tam nosūtiet iegūto saknes sarakstu klienta profilā, kur uz failu balstīts crl-verify to nolasa startēšanas laikā. Nosūtiet klientiem paketi ar abiem CA sertifikātiem; viena lapa vien nepārbaudīsies pret sakni.

Izsniedziet lapas no starpposma CA, ar datubāzi

Parakstīšana ar openssl x509 -req darbojas, līdz nepieciešama atsaukšana, jo nekas neieraksta sērijas numuru. Izmantojiet openssl ca no pirmā sertifikāta, lai sērijas numurs, derīgums un atsaukšanas statuss dzīvotu vienā datubāzē. Izveidojiet datubāzes failus vienreiz, pēc tam vērsiet konfigurāciju uz tiem:

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

Atslēgas lietojuma rinda pieņem ECDSA atslēgu; RSA pievienojiet keyEncipherment. Dodiet katram klientam savu kopējo nosaukumu, jo OpenVPN identificē savienojumu pēc šī lauka, un divus portatīvos datorus, kas kopīgo CN=vpn-client, nevar atšķirt žurnālos, client-config-dir noteikumos vai jebkurā lietotāja push, un jūs zaudējat attiecinājumu, kas padara atsaukšanas lēmumu aizstāvamu. Izsniedziet un validējiet lapu šādi:

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

Turiet parakstīšanas atslēgu aiz politikas robežas, nevis kopējiet to uz VPN resursdatoru: mazs pakalpojums, kas autentificē pieprasījumu, pārbauda kopējo nosaukumu pret atļauto sarakstu un atgriež tikai sertifikātu. Reģistrējiet katru sērijas numuru; žurnāls ir vienīgā saite starp sertifikātu un cilvēku, kurš to pieprasīja.

Publicējiet atsaukšanu, nepamodinot sakni

Klientu sertifikātus atsauc starpposma CA, nekad sakne. Saknes saraksts ir svarīgs tikai tad, kad starpposma CA ir sadedzināta. Vērsiet serveri uz starpposma sarakstu ar crl-verify. Uz failu balstīts CRL tiek ielādēts pakalpojuma startā, tāpēc pēc katras atkārtotas ģenerēšanas ielādējiet to no jauna; direktorijas forma nolasa stāvokli savienojuma laikā un maksā vienu failu uz katru sērijas numuru.

Atsauciet un ģenerējiet no jauna ar divām komandām no tās pašas datubāzes:

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

Pēc tam vērojiet pulksteni. CRL nes nākamās atjaunināšanas lauku, un, kad šis datums ir pagājis, validējošais partneris sarakstu noraida, nevis ignorē. Ikmēneša atkārtota ģenerēšana ar default_crl_days = 30 atstāj rezervi; ikgadējā ne. Īsāks lapu mūžs ir uzticamāka kontrole, jo atsaukšana attiecas tikai tur, kur saraksts tiek aplūkots.

Pārbaudiet ķēdi, pēc tam pierakstiet ceremoniju

Reproducējiet četras kļūdas, pirms uzticaties dizainam. Validējiet ķēdi ar openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt. Savienojieties ar beigušos klienta sertifikātu un apstipriniet, ka serveris to noraida. Atsauciet testa klientu, ielādējiet no jauna un apstipriniet, ka saraksts stājas spēkā. Pārbīdiet resursdatora pulksteni vienu dienu uz priekšu, jo nepareizs pulkstenis var izdot un noraidīt sertifikātus, kas citur izskatās derīgi.

Bezsaistes sakne ir kontrole tikai tad, ja pastāv dokumenti: divi nosaukti cilvēki ceremonijai, ieraksts par katru parakstīto sērijas numuru, šifrēta dublējuma kopija, kas glabāta atsevišķi no mašīnas, un atjaunošanas tests izolētā resursdatorā. Tās pašas ceremonijas laikā parakstiet rezerves starpposma CA, lai miris parakstīšanas resursdators neliktu jums pusnaktī atvērt sakni.

Pirms saucat to par pabeigtu, apstipriniet piecas lietas: saknes atslēga nav tīklā esošā resursdatorā, starpposma atslēga dzīvo tikai parakstīšanas resursdatorā, klienta pakete nes abus CA sertifikātus, CRL ir nākotnes nākamā atjaunināšana, un kādam ir kalendāra ieraksts katram ķēdes derīguma termiņam. Ja kāds trūkst, iestatījums, kas izskatās bezsaistē, ir vienkārši nedokumentēts.

Saistītie raksti