14.4.4. Sertifikat bertanda tangan CA (dipercaya publik)

Sertifikat self-signed berfungsi ketika Anda mengontrol kedua ujung. Jika sebaliknya klien sembarangan (browser, ponsel, perangkat lunak pihak ketiga) harus terhubung ke kamera tanpa diberitahu untuk mempercayai sertifikat kustom, sertifikat tersebut harus ditandatangani oleh Certificate Authority (CA) publik yang sudah dipercayai oleh klien tersebut. Kode TLS di kamera identik dengan kasus self-signed -- load_cert_chain dengan sertifikat dan kunci dalam bentuk DER -- hanya cara mendapatkan sertifikat tersebut yang berbeda.

Satu poin terpenting: Anda menghasilkan kunci privat sendiri dan tidak pernah meninggalkan mesin Anda. CA tidak pernah melihatnya. Yang Anda kirimkan ke CA adalah certificate signing request (CSR) -- file kecil yang berisi kunci publik dan nama domain Anda -- dan yang Anda terima kembali adalah sertifikat (kunci publik dan nama Anda, ditandatangani oleh CA). Kunci dan sertifikat adalah dua file terpisah yang dihasilkan oleh dua langkah terpisah; CA hanya menangani bagian publik.

Alur umum, semuanya dilakukan di mesin biasa (tidak pernah di kamera):

  1. Dapatkan nama domain. CA publik mensertifikasi nama DNS yang Anda kontrol (misalnya cam.example.com); mereka tidak akan menerbitkan untuk alamat IP kosong atau nama lokal saja seperti mycam.

  2. Hasilkan kunci dan CSR. Satu perintah OpenSSL menghasilkan kunci privat dan CSR yang cocok. Gunakan jenis kunci yang sama yang akan Anda gunakan untuk sertifikat self-signed (lihat Konsep: kepercayaan, kunci, dan format file); ECDSA P-256 direkomendasikan.

    ECDSA P-256 -- direkomendasikan:

    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 -- lebih kuat, lebih besar/lebih lambat:

    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 -- kompatibilitas maksimal:

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

    Jaga kerahasiaan domain.key -- ini adalah file kunci yang pada akhirnya akan Anda letakkan di kamera. domain.csr adalah file yang Anda serahkan ke CA; tidak mengandung rahasia.

  3. Kirimkan CSR dan buktikan Anda mengontrol domain. Di sinilah dua rute umum berbeda:

    • CA ACME otomatis seperti Let's Encrypt, yang dijalankan oleh alat seperti certbot atau acme.sh, melakukan langkah 2 dan 3 untuk Anda: ia menghasilkan kunci, membangun CSR, menjawab tantangan secara otomatis (HTTP-01: sajikan token melalui port 80 pada domain, atau DNS-01: publikasikan catatan TXT di DNS-nya) dan menuliskan file yang sudah selesai.

    • CA komersial (dibeli langsung atau melalui reseller domain/hosting): Anda menempelkan teks domain.csr ke dalam formulir web, lalu membuktikan kontrol dengan membalas email validasi, mempublikasikan catatan DNS, atau menempatkan file di server web untuk domain tersebut. Setelah divalidasi, Anda mengunduh file yang diterbitkan.

  4. Kumpulkan file yang diterbitkan. Untuk memahami apa yang Anda terima, penting untuk mengetahui bahwa sertifikat membentuk rantai kepercayaan: sertifikat domain Anda ditandatangani oleh CA intermediate, yang pada gilirannya ditandatangani oleh CA root. Setiap tautan menjamin yang di bawahnya. Anda akan mendapatkan:

    • Kunci privat Anda (dari langkah 2). CA tidak pernah memilikinya; ia tetap di mesin Anda dan merupakan kunci yang pada akhirnya Anda letakkan di kamera.

    • Sertifikat leaf -- juga disebut sertifikat end-entity atau server. Ini adalah sertifikat untuk domain spesifik Anda (cam.example.com): berisi kunci publik dan nama Anda, dan ditandatangani oleh intermediate CA. Ini adalah sertifikat yang disajikan kamera untuk mengidentifikasi dirinya.

    • Satu atau lebih sertifikat CA intermediate ("chain" atau "CA bundle"). CA tidak menandatangani leaf Anda dengan root-nya secara langsung -- kunci root disimpan offline dan dilindungi dengan ketat -- sehingga ia menandatangani dengan intermediate, yang sendirinya ditandatangani oleh root. Intermediate adalah tautan yang menghubungkan leaf Anda ke atas ke root.

    Sertifikat root adalah trust anchor: sertifikat self-signed milik CA yang berada di puncak rantai. Anda tidak diberikannya dan tidak pernah men-deploy-nya, karena setiap klien sudah memilikinya -- sistem operasi, browser, ponsel, dan runtime bahasa dikirimkan dengan "trust store" bawaan berisi sertifikat root. Klien mempercayai leaf Anda dengan menelusuri rantai: klien sudah mempercayai root, root menjamin intermediate, dan intermediate menjamin leaf Anda. (Inilah tepatnya pekerjaan yang dilakukan satu server.der / cafile Anda dalam kasus self-signed -- di sana Anda adalah root Anda sendiri.)

    File fullchain hanyalah leaf dan intermediate yang digabungkan menjadi satu file, leaf terlebih dahulu, dengan sengaja tanpa root (mengirimkan root tidak berguna -- klien hanya mempercayai root yang sudah dimilikinya). Server normal menyajikan fullchain ini sehingga klien mana pun dapat menelusurinya. Kamera tidak bisa: ia memuat dan menyajikan satu sertifikat -- leaf -- dan tidak dapat juga mengirimkan sertifikat intermediate yang diberikan CA kepada Anda.

    Nama file yang sebenarnya akan Anda lihat: alat ACME seperti certbot menulis privkey.pem (kunci Anda), cert.pem (leaf saja), chain.pem (intermediate saja) dan fullchain.pem (leaf + intermediate). CA komersial biasanya memberi Anda .crt untuk leaf dan .ca-bundle untuk intermediate, dengan .key adalah yang Anda hasilkan sendiri.

  5. Konversi dan salin. Konversi kunci privat dan sertifikat leaf ke DER dan salin ke kamera persis seperti di Sertifikat yang ditandatangani sendiri. Kamera kemudian menyajikannya sebagai sertifikat server dan klien standar menerima koneksi secara otomatis, karena mereka sudah mempercayai CA -- tidak diperlukan konfigurasi sisi klien.

Tip

Dalam praktiknya, kamera yang hanya menyajikan leaf (dan tidak pernah intermediate) berjalan seperti ini:

  • Klien yang sudah memiliki intermediate CA yang di-cache -- browser utama dan pustaka HTTPS biasanya memilikinya -- melengkapi rantai sendiri dan terhubung dengan baik.

  • Klien yang mengandalkan server untuk menyediakan intermediate akan gagal dalam handshake terhadap kamera.

Jika setiap klien yang mungkin harus berhasil, jangan terminasi TLS publik langsung di kamera. Letakkan gateway / reverse proxy di depannya yang menyajikan rantai penuh ke dunia luar, dan biarkan proxy menjangkau kamera melalui alur self-signed yang dijelaskan di atas.