Người ta mô tả VPN là „thứ dùng mã hóa khóa công khai“ rồi hình dung mỗi gói tin bị khóa bằng chứng chỉ của máy chủ. Hình dung đó sai theo cách có ý nghĩa khi bạn đọc tệp cấu hình hoặc bản chụp gói tin. Nửa khóa công khai của VPN lo việc chứng minh đối phương là ai và thống nhất vật liệu bí mật; nửa đối xứng mới là phần thật sự bảo vệ lưu lượng, từng gói một, suốt vòng đời phiên.

Hai nửa có vòng đời, cách hỏng và những gì được công bố an toàn khác nhau. Khi tách chúng ra, câu hỏi như „RSA 2048 có yếu hơn AES-128 không“ thôi gây nhầm lẫn, vì chúng chưa bao giờ so sánh được.

Ba thao tác thường bị gộp làm một

Mật mã khóa công khai là chiếc ô che ít nhất ba thao tác khác nhau. Chữ ký chứng minh chủ khóa riêng đã phê duyệt một thông điệp cụ thể. Thỏa thuận khóa cho phép hai bên dẫn xuất bí mật chung từ các giá trị trao đổi công khai. Mã hóa khóa công khai giấu dữ liệu dưới khóa công khai của ai đó, nên chỉ khóa riêng mở được.

Các lần bắt tay VPN chủ yếu dùng hai thao tác đầu. Chứng chỉ không phải khóa mã hóa; nó là tuyên bố có chữ ký ràng buộc một tên với khóa công khai và cho phía kia quyết định có tin khóa vừa nhận hay không. Ví dụ, việc thiết lập khóa trong TLS 1.3 dựa trên thỏa thuận khóa (EC)DHE và chữ ký chứng chỉ, không dựa trên mã hóa phiên bằng khóa công khai của máy chủ.

Bắt tay thực sự tạo ra gì

Trong bắt tay hiện đại, mỗi bên tạo một cặp khóa tạm, trao đổi nửa công khai và tính một bí mật chung không bao giờ đi qua dây. Bí mật đó đi qua hàm dẫn xuất khóa để tạo khóa riêng cho từng chiều, cùng nonce và vật liệu IV mà tầng bản ghi cần. WireGuard làm điều này bằng cấu trúc dựa trên Noise; TLS 1.3 làm bằng HKDF trên bản ghi bắt tay.

Chứng thư dài hạn — chứng chỉ và khóa riêng, hoặc khóa WireGuard tĩnh — xác thực lần trao đổi đó. Nó ký hoặc trộn vào bản ghi để người lạ không thể hoàn tất bắt tay thay đối phương. Sau đó chứng thư không làm việc trên từng gói. Nếu có, mỗi gói cần một thao tác khóa riêng, và đường hầm bận sẽ bị giới hạn bởi thao tác chậm nhất trong ngăn xếp.

Hai tác dụng phụ kéo theo. Thứ nhất, khóa phiên mới mỗi lần, nên kẻ tấn công sau này đánh cắp khóa dài hạn không thể giải mã các phiên đã ghi trước đó, miễn thỏa thuận là tạm thời. Thứ hai, khóa phiên bị lộ chỉ ảnh hưởng một phiên, không ảnh hưởng danh tính.

Vì sao lưu lượng lớn dùng khóa đối xứng

Mật mã đối xứng chịu khối lượng tốt: AES-GCM hoặc ChaCha20-Poly1305 xử lý từng gói bằng khóa đã có trong bộ nhớ, xác thực phần đầu và tăng bộ đếm. Bên nhận kiểm tra nonce và thẻ xác thực rồi bỏ mọi thứ thất bại hoặc lặp lại. Cách này đủ rẻ để chạy ở tốc độ đường truyền trên phần cứng thường, và cùng cấu trúc cho cả bí mật lẫn toàn vẹn trong một lượt.

Cấu trúc này cũng là nơi phần lớn lỗi triển khai sinh sống. Nonce lặp trong GCM phá bí mật và tính xác thực cùng lúc, nên giao thức dẫn xuất khóa theo chiều và giữ bộ đếm hoặc kỷ nguyên rõ ràng. Nếu bạn đọc bản chụp gói và độ dài bản mã khớp với bản rõ cộng phần phụ cố định, thì tầng đối xứng đang làm việc, không phải thao tác khóa công khai trên từng gói.

Vòng đời, xoay khóa và bí mật về trước

Khóa phiên được thiết kế để hết hạn. TLS 1.3 cho phép thông điệp KeyUpdate cuộn khóa lưu lượng; WireGuard làm mới phiên sau thời gian hoặc số thông điệp đã đặt và giữ khóa cũ một lúc cho gói đang trên đường. OpenVPN đàm phán lại khóa kênh dữ liệu của nó theo lịch, với reneg-sec điều khiển khoảng cách.

Không lần xoay nào trong số đó giống việc làm mới chứng chỉ. Chứng chỉ có thể hiệu lực một năm trong khi khóa phiên đổi vài phút một lần, và có thể thay chứng chỉ mà không chạm vào khóa của đường hầm đang chạy. Khi lập kế hoạch hết hạn, hãy hỏi bạn đang xoay đối tượng nào; câu trả lời quyết định việc máy khách kết nối lại hay chỉ làm mới khóa.

Đọc cấu hình và chẩn đoán mà không trộn đối tượng

Trên thực tế bạn chọn một giao thức đầy đủ và các nguyên thủy nó hỗ trợ, không tự lắp một bộ. Khóa --tls-crypt của OpenVPN bảo vệ kênh điều khiển; kênh dữ liệu dùng mật mã đối xứng đã thương lượng. Các mục PrivateKey và PublicKey của WireGuard là vật liệu danh tính, còn khóa vận chuyển được dẫn xuất bên trong. Đọc những trường đó như cùng một loại bí mật dẫn đến lỗi như dán khóa công khai vào chỗ phải là khóa riêng.

Giữ vật liệu công khai tách khỏi vật liệu riêng. Chứng chỉ, khóa công khai WireGuard và dấu vân tay thì an toàn để chia sẻ trong phiếu hỗ trợ. Khóa riêng, khóa chia sẻ trước và khóa phiên xuất ra thì không. Khi so sánh độ mạnh, hãy so trong cùng một loại: định danh đường cong elliptic, kích thước modulus RSA và kích thước khóa AES đo những thứ khác nhau dưới những giả định khác nhau. Đặc tả TLS 1.3 là tài liệu tham khảo hữu ích về cách hai tầng khớp nhau, kể cả khi đường hầm của bạn không phải TLS.

Bài viết liên quan