14.4.4. CA által aláírt (nyilvánosan megbízható) tanúsítványok¶
Az önaláírt tanúsítványok akkor működnek, ha mindkét végpontot te felügyeled. Ha viszont tetszőleges klienseknek (böngészőknek, telefonoknak, harmadik féltől származó szoftvereknek) kell csatlakozniuk a kamerához anélkül, hogy utasítanád őket egy egyedi tanúsítvány megbízhatóként való kezelésére, akkor a tanúsítványt egy nyilvános hitelesítésszolgáltatónak (Certificate Authority, CA) kell aláírnia, amelyben ezek a kliensek már megbíznak. A kamerán futó TLS kód azonos az önaláírt esettel – load_cert_chain egy tanúsítvánnyal és egy kulccsal DER formátumban – csak az változik, ahogyan azt a tanúsítványt megszerzed.
A legfontosabb egyetlen szempont: a privát kulcsot te magad hozod létre, és az soha nem hagyja el a gépedet. A CA soha nem látja. Amit a CA-nak küldesz, az egy tanúsítvány-aláírási kérelem (certificate signing request, CSR) – egy kis fájl, amely a nyilvános kulcsodat és a domain nevedet tartalmazza –, amit pedig visszakapsz, az egy tanúsítvány (a nyilvános kulcsod és a neved, a CA által aláírva). A kulcs és a tanúsítvány két különálló fájl, amelyeket két különálló lépés állít elő; a CA mindig csak a nyilvános felével dolgozik.
Az általános folyamat, mindez egy szokványos gépen elvégezve (soha nem a kamerán):
Szerezz egy domain nevet. A nyilvános CA-k egy általad felügyelt DNS-nevet hitelesítenek (pl.
cam.example.com); önálló IP-címre vagy csak helyi névre, mint amycam, nem állítanak ki tanúsítványt.Hozz létre egy kulcsot és egy CSR-t. Egyetlen OpenSSL parancs előállítja a privát kulcsot és a hozzá tartozó CSR-t. Ugyanazt a kulcstípust használd, amelyet egy önaláírt tanúsítványhoz használnál (lásd Fogalmak: megbízhatóság, kulcsok és fájlformátum); az ECDSA P-256 az ajánlott.
ECDSA P-256 – ajánlott:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \ -nodes -keyout domain.key -out domain.csr \ -subj "/CN=cam.example.com" \ -addext "subjectAltName=DNS:cam.example.com"
ECDSA P-384 – erősebb, nagyobb/lassabb:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 \ -nodes -keyout domain.key -out domain.csr \ -subj "/CN=cam.example.com" \ -addext "subjectAltName=DNS:cam.example.com"
RSA-2048 – maximális kompatibilitás:
openssl req -new -newkey rsa:2048 \ -nodes -keyout domain.key -out domain.csr \ -subj "/CN=cam.example.com" \ -addext "subjectAltName=DNS:cam.example.com"
Tartsd titokban a
domain.keyfájlt – ez az a kulcsfájl, amelyet végül a kamerára teszel. Adomain.csraz a fájl, amelyet átadsz a CA-nak; nem tartalmaz titkokat.Küldd be a CSR-t, és igazold, hogy felügyeled a domaint. Itt különbözik egymástól a két gyakori útvonal:
Egy automatizált ACME CA, mint például a Let’s Encrypt, amelyet egy olyan eszköz vezérel, mint a
certbotvagy azacme.sh, a 2. és 3. lépést helyetted végzi el: létrehozza a kulcsot, felépíti a CSR-t, automatikusan megválaszolja a kihívást (HTTP-01: egy token kiszolgálása a 80-as porton a domainen, vagy DNS-01: egy TXT rekord közzététele a DNS-ében), és kiírja a kész fájlokat.Egy kereskedelmi CA (közvetlenül vagy egy domain-/tárhely-viszonteladón keresztül megvásárolva): bemásolod a
domain.csrszövegét egy webűrlapba, majd egy validációs e-mailre válaszolva, egy DNS-rekord közzétételével, vagy egy fájl elhelyezésével az adott domain webszerverén igazolod a felügyeletet. A validálás után letöltöd a kiállított fájlokat.
Gyűjtsd össze a kiállított fájlokat. Hogy értelmezni tudd, amit kapsz, érdemes tudni, hogy a tanúsítványok megbízhatósági láncot alkotnak: a domained tanúsítványát egy köztes CA írja alá, amelyet pedig egy gyökér CA ír alá. Minden láncszem kezeskedik az alatta lévőért. A végén ezt kapod:
A privát kulcsod (a 2. lépésből). A CA-nak soha nem volt birtokában; a gépeden marad, és ez az a kulcs, amelyet végül a kamerára teszel.
A levél (leaf) tanúsítvány – amelyet végpont (end-entity) vagy szerver tanúsítványnak is neveznek. Ez az adott domainedhez (
cam.example.com) tartozó tanúsítvány: a nyilvános kulcsodat és a nevedet tartalmazza, és a CA köztes tanúsítványa írja alá. Ez az a tanúsítvány, amelyet a kamera bemutat, hogy azonosítsa magát.Egy vagy több köztes CA tanúsítvány (a „lánc” vagy „CA bundle”). Egy CA nem közvetlenül a gyökerével írja alá a leveledet – a gyökér kulcsát offline tartják és erősen védik –, így egy köztes tanúsítvánnyal írja alá, amelyet maga a gyökér ír alá. A köztes tanúsítvány az a láncszem, amely a leveledet összeköti a gyökérrel.
A gyökér tanúsítvány a megbízhatósági horgony: egy önaláírt tanúsítvány, amely a CA-hoz tartozik, és a lánc tetején helyezkedik el. Ezt nem kapod meg, és soha nem telepíted, mert minden kliens már rendelkezik vele – az operációs rendszerek, böngészők, telefonok és nyelvi futtatókörnyezetek beépített „megbízhatósági tárolóval” (trust store) érkeznek, amely a gyökértanúsítványokat tartalmazza. Egy kliens a lánc bejárásával bízik meg a leveledben: már megbízik a gyökérben, a gyökér kezeskedik a köztes tanúsítványért, a köztes tanúsítvány pedig a leveledért. (Pontosan ezt a feladatot látja el az egyetlen
server.der/cafilefájlod az önaláírt esetben – ott te vagy a saját gyökered.)Egy fullchain fájl egyszerűen a levél és a köztes tanúsítvány(ok) egyetlen fájlba fűzve, a levéllel az élen, szándékosan a gyökér nélkül (a gyökér elküldése értelmetlen – egy kliens csak azokban a gyökerekben bízik, amelyekkel már rendelkezik). Egy szokványos szerver ezt a teljes fullchaint mutatja be, hogy bármelyik kliens bejárhassa. A kamera erre nem képes: egyetlen tanúsítványt – a levelet – tölt be és mutat be, és nem tudja emellett elküldeni a CA által adott köztes tanúsítvány(oka)t is.
Fájlnevek, amelyekkel ténylegesen találkozni fogsz: egy ACME eszköz, mint a
certbot, aprivkey.pem(a kulcsod), acert.pem(csak a levél), achain.pem(csak a köztes tanúsítvány(ok)) és afullchain.pem(levél + köztes tanúsítvány(ok)) fájlokat írja ki. Egy kereskedelmi CA általában egy.crtfájlt ad a levélhez és egy.ca-bundlefájlt a köztes tanúsítvány(ok)hoz, a.keypedig az, amelyet te magad hoztál létre.Konvertálj és másolj. Konvertáld a privát kulcsot és a levél tanúsítványt DER formátumba, és másold a kamerára pontosan úgy, mint a Önaláírt tanúsítványok oldalon. A kamera ezután ezeket mutatja be a saját szervertanúsítványaként, és a szokványos kliensek automatikusan elfogadják a kapcsolatot, mert már megbíznak a CA-ban – nincs szükség kliensoldali konfigurációra.
Javaslat
A gyakorlatban az, hogy a kamera csak a levelet mutatja be (és soha nem a köztes tanúsítványokat), így alakul:
Azok a kliensek, amelyek már gyorsítótárazták a CA köztes tanúsítványát – a mainstream böngészők és HTTPS könyvtárak általában igen –, maguk fejezik be a láncot, és gond nélkül csatlakoznak.
Azok a kliensek, amelyek arra támaszkodnak, hogy a szerver szolgáltatja a köztes tanúsítványt, hibára futnak a kézfogás során a kamerával szemben.
Ha minden lehetséges kliensnek sikeresen kell csatlakoznia, ne közvetlenül a kamerán zárd le a nyilvános TLS-t. Tegyél elé egy átjárót / fordított proxyt (reverse proxy), amely a teljes láncot szolgálja ki a külvilág felé, és a proxy érje el a kamerát a fent leírt önaláírt folyamaton keresztül.