14.4.4. Certifikati potpisani od strane CA-a (javno pouzdani)

Samopotpisani certifikati funkcioniraju kada kontrolirate oba kraja. Ako se umjesto toga proizvoljni klijenti (preglednici, telefoni, softver treće strane) moraju povezati s kamerom bez upute da vjeruju prilagođenom certifikatu, certifikat mora biti potpisan od strane javnog tijela za izdavanje certifikata (Certificate Authority, CA) kojem ti klijenti već vjeruju. TLS kôd na kameri identičan je samopotpisanom slučaju – load_cert_chain s certifikatom i ključem u DER obliku – mijenja se samo način na koji dolazite do tog certifikata.

Najvažnija jedna točka: privatni ključ generirate sami i on nikada ne napušta vaše računalo. CA ga nikada ne vidi. Ono što šaljete CA-u je zahtjev za potpisivanje certifikata (CSR) – mala datoteka koja sadrži vaš javni ključ i vaše ime domene – a ono što dobivate natrag je certifikat (vaš javni ključ i ime, potpisani od strane CA-a). Ključ i certifikat dvije su zasebne datoteke nastale u dva zasebna koraka; CA uvijek rukuje samo javnom polovicom.

Opći tijek, sve obavljeno na uobičajenom računalu (nikada na kameri):

  1. Nabavite ime domene. Javni CA-ovi certificiraju DNS ime koje kontrolirate (npr. cam.example.com); neće izdati certifikat za golu IP adresu ili lokalno ime poput mycam.

  2. Generirajte ključ i CSR. Jedna OpenSSL naredba proizvodi privatni ključ i odgovarajući CSR. Koristite istu vrstu ključa koju biste koristili za samopotpisani certifikat (pogledajte Koncepti: povjerenje, ključevi i format datoteke); preporučuje se ECDSA P-256.

    ECDSA P-256 – preporučeno:

    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 – jači, veći/sporiji:

    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 – najveća kompatibilnost:

    openssl req -new -newkey rsa:2048 \
        -nodes -keyout domain.key -out domain.csr \
        -subj "/CN=cam.example.com" \
        -addext "subjectAltName=DNS:cam.example.com"
    

    Čuvajte domain.key u tajnosti – ovo je datoteka ključa koju ćete na kraju staviti na kameru. domain.csr je datoteka koju predajete CA-u; ne sadrži nikakve tajne.

  3. Predajte CSR i dokažite da kontrolirate domenu. Tu se dva uobičajena puta razlikuju:

    • Automatizirani ACME CA poput Let’s Encrypt, vođen alatom poput certbot ili acme.sh, obavlja korake 2 i 3 umjesto vas: generira ključ, gradi CSR, automatski odgovara na izazov (HTTP-01: poslužuje token preko porta 80 na domeni, ili DNS-01: objavljuje TXT zapis u svom DNS-u) i zapisuje gotove datoteke.

    • Komercijalni CA (kupljen izravno ili preko preprodavača domena/hostinga): zalijepite tekst domain.csr u web obrazac, zatim dokažete kontrolu odgovaranjem na validacijsku e-poštu, objavom DNS zapisa ili postavljanjem datoteke na web poslužitelj za tu domenu. Nakon validacije preuzimate izdane datoteke.

  4. Prikupite izdane datoteke. Da biste razumjeli što primate, korisno je znati da certifikati tvore lanac povjerenja: certifikat vaše domene potpisuje posredni CA, koji opet potpisuje korijenski CA. Svaka karika jamči za onu ispod nje. Na kraju dobivate:

    • Vaš privatni ključ (iz koraka 2). CA ga nikada nije imao; ostaje na vašem računalu i ključ je koji na kraju stavljate na kameru.

    • Listni certifikat – koji se naziva i end-entity ili poslužiteljski certifikat. Ovo je certifikat za vašu specifičnu domenu (cam.example.com): sadrži vaš javni ključ i vaše ime te je potpisan od strane CA-ovog posrednog certifikata. Ovo je certifikat koji kamera predstavlja kako bi se identificirala.

    • Jedan ili više posrednih CA certifikata („lanac” ili „CA paket”). CA ne potpisuje vaš listni certifikat izravno svojim korijenskim certifikatom – ključ korijenskog certifikata drži se izvan mreže i strogo zaštićen – pa potpisuje posrednim certifikatom, koji je sam potpisan korijenskim. Posredni certifikat je karika koja povezuje vaš listni certifikat s korijenskim.

    Korijenski certifikat je sidro povjerenja: samopotpisani certifikat koji pripada CA-u i nalazi se na vrhu lanca. Njega ne dobivate i nikada ga ne raspoređujete, jer ga svaki klijent već ima – operacijski sustavi, preglednici, telefoni i izvršna okruženja programskih jezika dolaze s ugrađenom „pohranom povjerenja” korijenskih certifikata. Klijent vjeruje vašem listnom certifikatu prolaskom kroz lanac: već vjeruje korijenskom, korijenski jamči za posredni, a posredni jamči za vaš listni. (Ovo je upravo posao koji vaš jedan server.der / cafile obavlja u samopotpisanom slučaju – tamo ste vi sami sebi korijenski certifikat.)

    Datoteka fullchain jednostavno je listni certifikat i posredni certifikati spojeni u jednu datoteku, listni prvi, namjerno bez korijenskog (slanje korijenskog je besmisleno – klijent vjeruje samo korijenskim certifikatima koje već ima). Normalan poslužitelj predstavlja cijeli taj fullchain kako bi ga bilo koji klijent mogao proći. Kamera to ne može: ona učitava i predstavlja jedan certifikat – listni – i ne može poslati i posredne certifikate koje vam je CA dao.

    Nazivi datoteka koje ćete zapravo vidjeti: ACME alat poput certbot zapisuje privkey.pem (vaš ključ), cert.pem (samo listni), chain.pem (samo posredni) i fullchain.pem (listni + posredni). Komercijalni CA obično vam daje .crt za listni i .ca-bundle za posredne, pri čemu je .key onaj koji ste sami generirali.

  5. Pretvorite i kopirajte. Pretvorite privatni ključ i listni certifikat u DER i kopirajte ih na kameru točno kao na Samopotpisani certifikati. Kamera ih zatim predstavlja kao svoj poslužiteljski certifikat, a standardni klijenti automatski prihvaćaju vezu, jer već vjeruju CA-u – nije potrebna nikakva konfiguracija na strani klijenta.

Savjet

U praksi, kamera koja predstavlja samo listni certifikat (i nikada posredne) izgleda ovako:

  • Klijenti koji već imaju spremljen CA-ov posredni certifikat – mainstream preglednici i HTTPS biblioteke obično ga imaju – sami upotpunjuju lanac i uredno se povezuju.

  • Klijenti koji se oslanjaju na poslužitelj da osigura posredni certifikat neće uspjeti u rukovanju (handshake) s kamerom.

Ako svaki mogući klijent mora uspjeti, nemojte terminirati javni TLS izravno na kameri. Stavite pristupnik / obrnuti proxy ispred nje koji poslužuje cijeli lanac prema vanjskom svijetu, a neka proxy doseže kameru preko samopotpisanog tijeka opisanog gore.