14.4.4. Chứng chỉ được ký bởi CA (được tin tưởng công cộng)

Chứng chỉ tự ký hoạt động khi bạn kiểm soát cả hai đầu. Nếu thay vào đó các client tùy ý (trình duyệt, điện thoại, phần mềm bên thứ ba) phải kết nối tới camera mà không cần được thông báo để tin tưởng chứng chỉ tùy chỉnh, thì chứng chỉ phải được ký bởi một Certificate Authority (CA) công cộng mà những client đó đã tin tưởng. Mã TLS trên camera giống hệt trường hợp tự ký -- load_cert_chain với chứng chỉ và khóa ở dạng DER -- chỉ có cách bạn lấy chứng chỉ đó là khác.

Điểm quan trọng nhất: bạn tự tạo khóa riêng tư và nó không bao giờ rời khỏi máy của bạn. CA không bao giờ thấy nó. Những gì bạn gửi cho CA là một certificate signing request (CSR) -- một tệp nhỏ chứa khóa công khai và tên miền của bạn -- và những gì bạn nhận lại là một chứng chỉ (khóa công khai và tên của bạn, được ký bởi CA). Khóa và chứng chỉ là hai tệp riêng biệt được tạo ra bởi hai bước riêng biệt; CA chỉ xử lý phần công khai.

Quy trình chung, tất cả được thực hiện trên một máy thông thường (không bao giờ trên camera):

  1. Lấy một tên miền. Các CA công cộng chứng nhận tên DNS mà bạn kiểm soát (ví dụ: cam.example.com); họ sẽ không cấp cho địa chỉ IP trần hay tên chỉ nội bộ như mycam.

  2. Tạo khóa và CSR. Một lệnh OpenSSL tạo ra khóa riêng tư và CSR tương ứng. Sử dụng loại khóa giống như bạn dùng cho chứng chỉ tự ký (xem Khái niệm: tin tưởng, khóa và định dạng tệp); ECDSA P-256 được khuyến nghị.

    ECDSA P-256 -- được khuyến nghị:

    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 -- mạnh hơn, lớn hơn/chậm hơn:

    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 -- khả năng tương thích tối đa:

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

    Giữ bí mật domain.key -- đây là tệp khóa mà cuối cùng bạn sẽ đặt lên camera. domain.csr là tệp bạn giao cho CA; nó không chứa bí mật nào.

  3. Gửi CSR và chứng minh bạn kiểm soát tên miền. Đây là nơi hai hướng phổ biến khác nhau:

    • Một ACME CA tự động như Let's Encrypt, được điều khiển bởi công cụ như certbot hoặc acme.sh, thực hiện các bước 2 và 3 cho bạn: nó tạo khóa, xây dựng CSR, trả lời challenge tự động (HTTP-01: phục vụ token qua cổng 80 trên tên miền, hoặc DNS-01: công bố bản ghi TXT trong DNS của nó) và ghi ra các tệp hoàn chỉnh.

    • Một CA thương mại (mua trực tiếp hoặc qua đại lý tên miền/hosting): bạn dán văn bản domain.csr vào biểu mẫu web, sau đó chứng minh quyền kiểm soát bằng cách trả lời email xác nhận, công bố bản ghi DNS, hoặc đặt một tệp trên máy chủ web của tên miền đó. Sau khi được xác nhận, bạn tải xuống các tệp đã cấp.

  4. Thu thập các tệp đã cấp. Để hiểu những gì bạn nhận được, nên biết rằng các chứng chỉ tạo thành chuỗi tin tưởng: chứng chỉ tên miền của bạn được ký bởi một CA trung gian, vốn lại được ký bởi một CA root. Mỗi liên kết bảo đảm cho liên kết bên dưới nó. Bạn nhận được:

    • Khóa riêng tư của bạn (từ bước 2). CA không bao giờ có nó; nó ở lại trên máy của bạn và là khóa mà cuối cùng bạn đặt lên camera.

    • Chứng chỉ -- còn được gọi là chứng chỉ end-entity hoặc server. Đây là chứng chỉ cho tên miền cụ thể của bạn (cam.example.com): nó chứa khóa công khai và tên của bạn, và được ký bởi intermediate của CA. Đây là chứng chỉ camera trình bày để xác định mình.

    • Một hoặc nhiều chứng chỉ CA trung gian ("chain" hoặc "CA bundle"). CA không ký chứng chỉ lá của bạn trực tiếp bằng root -- khóa của root được giữ offline và bảo vệ chặt chẽ -- vì vậy nó ký bằng intermediate, vốn tự nó được ký bởi root. Intermediate là liên kết kết nối chứng chỉ lá của bạn lên root.

    Chứng chỉ rootđiểm neo tin tưởng: một chứng chỉ tự ký thuộc về CA ở đỉnh chuỗi. Bạn không được cấp nó và không bao giờ triển khai nó, vì mọi client đều đã có nó -- hệ điều hành, trình duyệt, điện thoại và các runtime ngôn ngữ đều đi kèm "kho tin tưởng" tích hợp gồm các chứng chỉ root. Một client tin tưởng chứng chỉ lá của bạn bằng cách đi theo chuỗi: nó đã tin tưởng root, root bảo đảm cho intermediate, và intermediate bảo đảm cho chứng chỉ lá của bạn. (Đây chính xác là công việc mà server.der / cafile duy nhất của bạn thực hiện trong trường hợp tự ký -- ở đó bạn là root của chính mình.)

    Tệp fullchain đơn giản là chứng chỉ lá và các intermediate được ghép nối thành một tệp, lá đứng đầu, cố ý không có root (gửi root là vô nghĩa -- client chỉ tin tưởng các root mà nó đã có). Một máy chủ thông thường trình bày toàn bộ fullchain này để mọi client có thể đi theo. Camera thì không thể: nó tải và trình bày một chứng chỉ -- chứng chỉ lá -- và không thể cũng gửi kèm các chứng chỉ intermediate mà CA đã cấp cho bạn.

    Tên tệp bạn thực sự sẽ thấy: một công cụ ACME như certbot ghi privkey.pem (khóa của bạn), cert.pem (chứng chỉ lá riêng lẻ), chain.pem (intermediate(s) riêng lẻ) và fullchain.pem (lá + intermediate(s)). Một CA thương mại thường cung cấp cho bạn .crt cho chứng chỉ lá và .ca-bundle cho intermediate(s), trong khi .key là tệp bạn đã tự tạo.

  5. Chuyển đổi và sao chép. Chuyển đổi khóa riêng tư và chứng chỉ lá sang DER và sao chép chúng lên camera chính xác như trên trang Chứng chỉ tự ký. Camera sau đó trình bày chúng như chứng chỉ server và các client chuẩn tự động chấp nhận kết nối, vì họ đã tin tưởng CA -- không cần cấu hình phía client.

Mẹo

Trong thực tế, khi camera chỉ trình bày chứng chỉ lá (và không bao giờ trình bày intermediate), tình huống diễn ra như sau:

  • Các client đã có intermediate của CA được lưu vào cache -- các trình duyệt chính thống và thư viện HTTPS thường có -- tự hoàn thành chuỗi và kết nối thành công.

  • Các client phụ thuộc vào máy chủ để cung cấp intermediate sẽ thất bại khi bắt tay với camera.

Nếu mọi client có thể đều phải thành công, đừng kết thúc TLS công cộng trực tiếp trên camera. Đặt một gateway / reverse proxy ở phía trước để phục vụ toàn bộ chuỗi cho thế giới bên ngoài, và để proxy tiếp cận camera qua luồng tự ký đã mô tả ở trên.