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):

  1. 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 a mycam, nem állítanak ki tanúsítványt.

  2. 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.key fájlt – ez az a kulcsfájl, amelyet végül a kamerára teszel. A domain.csr az a fájl, amelyet átadsz a CA-nak; nem tartalmaz titkokat.

  3. 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 certbot vagy az acme.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.csr szö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.

  4. 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 / cafile fá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, a privkey.pem (a kulcsod), a cert.pem (csak a levél), a chain.pem (csak a köztes tanúsítvány(ok)) és a fullchain.pem (levél + köztes tanúsítvány(ok)) fájlokat írja ki. Egy kereskedelmi CA általában egy .crt fájlt ad a levélhez és egy .ca-bundle fájlt a köztes tanúsítvány(ok)hoz, a .key pedig az, amelyet te magad hoztál létre.

  5. 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.