Vì sao openssl rand không thể tạo khóa mà tls-crypt muốn
OpenSSL tạo ra các byte ngẫu nhiên; tls-crypt cần một tệp khóa tĩnh có cấu trúc, và tls-crypt-v2 cần một khóa mà chỉ máy chủ mới có thể bọc. Hãy dùng openvpn --genkey.
OpenSSL đã được cài đặt, máy chủ có entropy, và tạo khóa bằng nó có vẻ là lối tắt hiển nhiên. Đầu ra sẽ ngẫu nhiên và bí mật và hoàn toàn không dùng được, và lỗi đến dưới dạng lỗi kênh điều khiển thay vì một thứ gì đó nhắc đến định dạng khóa. Sự đánh lạc hướng đó chính là phần tốn kém, vì nó khiến người ta đi kiểm tra các bộ mã của họ. Thứ VPN đọc là một cấu trúc tệp cụ thể, không phải một khối byte tùy ý, và một biến thể của tính năng này hoàn toàn không thể được tạo ra bên ngoài máy chủ.
Tệp trên đĩa thực sự phải là gì
Tệp khóa tĩnh của OpenVPN là văn bản. Nó bắt đầu bằng một dòng chú thích khai báo nó là gì, mang dữ liệu hex trong các hàng có độ rộng cố định, và tổng cộng 256 byte vật liệu khóa. OpenVPN đọc nó như bí mật chia sẻ của kênh điều khiển, không phải chứng chỉ, không phải cụm mật khẩu và không phải thứ mà thư viện TLS sẽ nhận ra.
Cùng một loại đối tượng phục vụ cả hai tính năng của kênh điều khiển. Với tls-auth, mỗi bên cũng cần một hướng để các gói của một phía không thể bị phản xạ ngược lại nó. Với tls-crypt, một bí mật chia sẻ duy nhất mã hóa và xác thực kênh điều khiển theo cả hai hướng, điều này vừa che giấu vừa bảo vệ bắt tay.
Không điều nào trong số đó là kiến thức bí mật, và định dạng không phải là vấn đề. Vấn đề là tệp phải khớp chính xác với điều người đọc mong đợi: tiêu đề, độ rộng hàng, dòng mới cuối và tổng độ dài. Một tệp lệch một hàng sẽ tải như rác hoặc hỏng hoàn toàn. Vì vậy so sánh hai bên theo từng byte là một phép thử đầu tiên hợp lý, và nó nhanh hơn việc đọc một trong hai tệp cấu hình.
Cách được hỗ trợ để tạo một tệp
Tạo khóa tĩnh đơn giản bằng công cụ sẽ sử dụng nó, rồi tham chiếu nó từ cả hai đầu:
openvpn --genkey secret /etc/openvpn/tc-shared.key
tls-crypt /etc/openvpn/tc-shared.key
Cách viết của tùy chọn đã thay đổi theo thời gian: các bản cài đặt cũ thời 2.4 dùng dạng có cờ riêng trước tên tệp, trong khi các bản dựng hiện tại chấp nhận dạng ngắn hơn. Dù thế nào, tệp tạo ra vẫn là cùng loại đối tượng, nên phép kiểm tra là liệu hai bên có các byte giống hệt nhau không.
Thế hệ thứ hai thêm một cấu trúc mà không bộ tạo bên ngoài nào có thể phát minh. Khóa máy chủ được tạo một lần, và mỗi máy khách nhận một khóa được bọc dẫn xuất từ nó:
openvpn --genkey tls-crypt-v2-server /etc/openvpn/tc-v2-server.key
openvpn --genkey tls-crypt-v2-client /etc/openvpn/laptop1.key --tls-crypt-v2 /etc/openvpn/tc-v2-server.key
Thứ máy khách nhận không phải là bản sao khóa của chính máy chủ. Đó là một đối tượng được bọc mang siêu dữ liệu mà chỉ máy chủ mới có thể mở, và chính cách bọc đó là lý do một tệp cho từng thiết bị có thể bị thu hồi mà không chạm vào bất kỳ thiết bị nào khác. Giữ khóa máy chủ trên máy chủ và coi nó là gốc của sự tin cậy theo từng thiết bị đó.
Nơi các byte làm bằng tay sụp đổ
In 256 byte ngẫu nhiên dưới dạng hex bên dưới một tiêu đề đúng về lý thuyết sẽ tạo ra một tệp khóa tĩnh tải được. Đó vẫn là một ý tồi. Mỗi chi tiết định dạng trở thành cơ hội tạo ra vật liệu hỏng khi tải hoặc, tệ hơn, để hai bên giữ các giá trị khác nhau mà chỉ lộ ra như một lỗi xác thực.
Không có gì tương đương là khả thi với biến thể v2. Một khóa máy khách được bọc chỉ tồn tại như đầu ra của tiến trình khóa máy chủ, và máy chủ giữ vật liệu cần thiết để mở nó. Một khối ngẫu nhiên sẽ bị từ chối hoặc đơn giản là không giải mã được, và cả hai thông báo đều không nhắc đến tính ngẫu nhiên.
Khả năng tương thích phiên bản nằm trên tất cả những điều này. Thế hệ đầu tiên cần một bản phát hành hỗ trợ nó ở cả hai đầu, và thế hệ thứ hai lại cần một bản phát hành mới hơn. Một máy khách được xây dựng trước khi tính năng tồn tại không thể hoàn tất bắt tay với máy chủ chỉ chấp nhận vật liệu được bọc, và lỗi mà nó báo cáo chỉ vào kênh điều khiển thay vì phiên bản.
Xoay vòng mà không khóa mọi người ra ngoài
Xoay vòng một bí mật chia sẻ duy nhất là một bài tập phối hợp chứ không phải kỹ thuật. Mỗi máy khách cần có tệp thay thế trong tay trước khi máy chủ thu hồi tệp trước, và bất kỳ máy nào còn giữ giá trị cũ sẽ hỏng ngay tại thời điểm đó. Đừng bắt đầu việc xoay vòng đó giữa một ngày làm việc.
Với cách bố trí v2, việc xoay vòng là theo từng thiết bị: phát hành một khóa được bọc mới cho một máy và cho khóa cũ nghỉ hưu chỉ cho máy đó. Đó là lập luận chính để chuyển đổi một khi mọi máy khách đều ở bản phát hành hỗ trợ nó.
Quyền của tệp thuộc về cùng cuộc trò chuyện. Khóa chỉ nên được đọc bởi tài khoản chạy dịch vụ, và nó không nên sống trong cùng kho lưu trữ với các hồ sơ mà nó bảo vệ. Tài liệu tham khảo OpenVPN 2.6 ghi lại các hình thức tạo và các phần vật liệu khóa, đây là nguồn tốt hơn một lệnh sao chép từ bài đăng diễn đàn.