CA csere OpenVPN alatt

A problema:

lassan lejar egy 10 eves CA cert egy openvpn szerver alatt. amugy is sha1-es, le kene cserelni egy ujra, es mar sha256-osra.

de van tobb 100 user, es nem megy egyik pillanatrol a masikra a kliens oldal frissitese... jo lenne parhuzamosan megoldani.

A megoldas:

Inditsunk parhuzamosan egy masik openvpn szervert masik ip/porton, uj CA-val es kulcsokkal. De ezt a hulye is meg tudja csinalni :)

Ha van ennel sokkal bonyolultabb megoldas is, miert ne? :)

https://www.hexonet.net/blog/migrating-new-ca-for-openvpn

In the first step, the root certificate of the new CA gets added to the CA file of the OpenVPN Server (stacked certificate).

Also, the server certificate is replaced by one signed by the new CA. Additionally, an intermediate certificate (OLD-NEW-IM.crt) that uses the private key of the new CA, but is signed by the old CA, gets added to the server certificate file.

So, the server certificate file will consist of both the actual new server certificate, and the intermediate certificate. The VPN server will return both certificates to each connecting client.

This allows clients that only support the root certificate of the old CA to verify the intermediate certificate, which in turn verifies the new server certificate.

IMPORTANT: When signing the new server certificate, the 'authorityKeyIdentifier' section must only include the keyid, and not the issuer. This is neccessary to prevent issues related to different subjects of the old and new CA's.

 

ezt egyaltalan nem trivialis ezt megcsinalni, napokig olvasgattam emesztettem, keresgeltem mig vegul ma raszantam magam... sok oranyi kinlodas, patcheles utan vegulis sikerult a mukodo certeket osszehozni.

Az easy-rsa v2-t meg kellett kicsit patchelni hozza:

- openssl-1.0.0.cnf-ben a server szekcioban authorityKeyIdentifier=keyid,issuer:always vegerol kivenni az :always-t

- pkitool-ban atirni, hogy ha van mar $FN.key file, akkor ne hozzon letre ujat (-newkey + -keyout helyett -key opcio)

- pkitool-ban atirni az -md sha1 opciot -md sha256-ra

Innentol mar viszonylag egyszeru, persze miutan kikiserleteztem a megfelelo sorrendet/metodikat:

1. megcsinalod az uj CA-t (. ./vars ; ./clean-all ; ./build-ca ) es a szerver kulcsot (./build-key-server server1)

2. mentsd le / nevezd at az 1. pontban generalt CA kulcsot+certet, es rakd a helyere a regi CA kulcs+cert fileokat! az uj CA kulcsot masold oda intermed.key neven is!!!

3. elkeszitjuk az intermediate cert-et, ami majdnem ugyanolyan mint az uj CA, csak nem sajat magat irja ala (self-signed) hanem a regi CA-val lesz alairva:  

./build-inter intermed 

- fontos, hogy a .key mar legyen ott es legyen azonos az uj CA privat kulcsaval

- fontos, hogy a subject (teljes hosszaban, beleertve a city stb reszeket de foleg a CN-t) legyen azonos az uj CA-eval

ha mindent jol csinaltal, akkor az uj szerver kulcs ellenorizheto az uj CA-val (nyilvan, hisz azzal generaltad) es a regi CA-val is (ebben az esetben kell hozza az intermed.crt is):

# openssl verify -verbose -CAfile ca-old.crt -untrusted intermed.crt server1.crt
# openssl verify -verbose -CAfile ca-new.crt -untrusted intermed.crt server1.crt

Ha mindketto OKE, akkor a 2 ca-t (old es new) osszefuzve masold az openvpn-be CA-nak, az uj szerver kulcsot, hozzafuzve az intermed certet pedig a szrever cert-hez, es restart! Az intermed cert miatt a regi CA is tudja hitelesiteni az uj server certet, es nyilvan az uj CA is, igy raersz szep lassan lecserelgetni a klienseken a CA filet (es a kulcsaikat is persze).

Hozzászólások

Nájsz!

Miért nem migráltál esay rsa v3-ra? Lehet ott kevesebbet kellett volna mókolni...

neztem, de ott inkabb tobbet...

eredetileg sima openssl parancsokkal mokoltam, azzal probaltam az intermed certet is letrehozni, de ha sikeurlt is, nem egyezett a subject-je az eredetivel, hiaba parametereztem fel ugyanugy... (a leirasok meg mindenfele template config fileokat irogatnak at, azt inkabb kihagytam :))

ki kell dobni az ilyen hulladek fosokat mint openvpn, es vagy hekkelsz magadnak wireguardot (headscale) vagy fizetsz a tailscalert, problem solved.

Én már csináltam ilyet, de közel se volt ennyire komplikált. Egyszerűen összefűzöd a két CA certet egy fájlba, és akkor mindkettő által aláírt certet elfogadja.