Ở đây hai niềm tin gây thiệt hại nhiều nhất: rằng chứng chỉ VPN tự ký nghĩa là đường hầm không được mã hóa, và rằng cài đặt bất cứ thứ gì ứng dụng VPN yêu cầu chỉ ảnh hưởng đến VPN. Không cái nào sống sót khi tiếp xúc với một triển khai thực tế. Chứng chỉ tự ký mô tả một quan hệ chữ ký, không phải một phán quyết bảo mật, và phạm vi của sự tin cậy bạn thêm vào phụ thuộc vào kho nó rơi vào. Tôi đã thấy một bộ phận hỗ trợ nhập gốc của nhà cung cấp vào một máy Windows để dập tắt một cảnh báo, rồi dành cả buổi chiều giải thích vì sao trình duyệt thôi phàn nàn về một cổng thông tin không liên quan. Hai nửa của câu hỏi này gắn với nhau, nên hãy coi chúng là một.

Chứng chỉ không phải kho tin cậy

Tệp máy chủ trình bày mang một khóa công khai, tên chủ thể, tên nhà phát hành, ngày hiệu lực và các phần mở rộng. Tự ký nghĩa là chủ thể và nhà phát hành là cùng một thực thể và chữ ký được xác minh bằng chính khóa của chứng chỉ. Không điều gì trong định nghĩa đó nói kết nối yếu, và không điều gì nói ứng dụng khách sẽ chấp nhận nó.

Sự chấp nhận đến từ nơi khác: một tệp CA mà bạn trỏ ứng dụng khách tới, một dấu vân tay bạn so sánh bằng tay, hoặc một gốc đã nằm trong kho mà ứng dụng khách đọc. Một triển khai có thể hoàn toàn lành mạnh trong khi chứng chỉ của nó sẽ trượt mọi bài kiểm tra công khai. openssl verify đối chiếu gói hệ thống sẽ báo một nhà phát hành không xác định, và báo cáo đó đúng chứ không phải lỗi.

Tùy chọn ca của OpenVPN là trường hợp rõ nhất của sự tin cậy giới hạn trong ứng dụng. Tệp đó nêu tên các neo mà ứng dụng khách sẽ chấp nhận, và nó có thể chứa một CA riêng hoặc trong một triển khai nhỏ, chính chứng chỉ tự ký của máy chủ. Phiên bản 2.6 cũng chấp nhận --peer-fingerprint để ghim dấu vân tay SHA-256 thay vì phân phối tệp CA. WireGuard còn xa hơn: nó không có chứng chỉ nào cả, chỉ một khóa công khai tĩnh cho mỗi đối tác, nên câu hỏi tự ký không áp dụng cho nó.

Nơi bạn cài đặt sự tin cậy quyết định ai sẽ thừa kế nó

Đặt cùng một chứng chỉ ở ba nơi và bạn nhận được ba bán kính ảnh hưởng khác nhau. Một gói chỉ ứng dụng VPN đọc ảnh hưởng đến ứng dụng đó. Một gốc trong kho của hệ điều hành ảnh hưởng đến mọi chương trình tham vấn kho đó. Một trình duyệt có cơ sở dữ liệu tin cậy riêng có thể phớt lờ cả hai, đó là lý do một cảnh báo có thể sống sót sau một lần nhập có vẻ đã hoạt động.

Trên Debian hoặc Ubuntu, thả một tệp vào /usr/local/share/ca-certificates/ và chạy update-ca-certificates sẽ thay đổi gói toàn hệ thống. Trên Windows, certutil -addstore -f Root ghi vào kho máy và cần dấu nhắc nâng quyền, trong khi thêm -user nhắm vào kho của người dùng hiện tại; hai thứ này không thể thay thế cho nhau. Firefox giữ cơ sở dữ liệu NSS riêng, nên một lần nhập ở cấp hệ điều hành có thể không bao giờ xuất hiện ở đó.

Phạm vi quan trọng vì những gì một nhà chức trách có thể làm. Một CA phát hành có thể ký cho những tên không có quan hệ gì với nó, nên bất cứ thứ gì tin kho đó sẽ chấp nhận những chữ ký ấy. Một chiếc lá được ghim duy nhất không làm được điều đó; nó xác thực đúng một danh tính đối tác. Nếu mục tiêu là làm cho một VPN kết nối, một CA giới hạn trong ứng dụng hoặc một chiếc lá được ghim đạt được điều đó, trong khi một gốc toàn máy là nhượng bộ lớn hơn nhiều so với những gì triệu chứng đòi hỏi.

Bạn vẫn đang mã hóa mà không có CA công khai

Bắt tay TLS dẫn xuất khóa phiên bất kể chứng chỉ của đối tác có nối chuỗi tới thứ bạn đã tin hay không. Tự ký không có nghĩa là văn bản thuần, và không có nghĩa lưu lượng đọc được khi đang bay. Nó có nghĩa là ứng dụng khách không có lý do tiên nghiệm nào để tin rằng khóa thuộc về máy chủ mà nó đã yêu cầu.

Chính trong khoảng trống đó các cuộc tấn công thật sống. Một ứng dụng khách được cấu hình chấp nhận mọi chứng chỉ, dù qua cài đặt xác minh bị vô hiệu hay qua một nút tin-cứ-như-vậy được bấm một lần rồi quên, sẽ vui vẻ mã hóa cho bất kỳ ai trả lời. Việc chặn xảy ra ở bước xác thực, trước khi dữ liệu ứng dụng di chuyển. Mã hóa không kiểm tra danh tính giữ một quan sát viên thụ động ở ngoài và làm ít việc khác.

Tin nhà phát hành không bỏ qua kiểm tra tên

Xác thực chuỗi, khớp tên và mục đích chứng chỉ là những quyết định riêng. Chuỗi có thể hợp lệ trong khi tên sai, và tên có thể khớp trong khi chứng chỉ được phát hành cho một vai trò khác. RFC 5280 định nghĩa các trường mang những ràng buộc đó, và mức độ chặt chẽ ứng dụng khách thực thi chúng là việc của từng ứng dụng.

OpenVPN làm cho sự tách biệt trở nên hữu hình. verify-x509-name ghim chủ thể mong đợi qua khớp name, name-prefix hoặc subject. remote-cert-tls server yêu cầu chứng chỉ đối tác dùng được như chứng chỉ máy chủ, điều này từ chối chứng chỉ chỉ-dành-cho-ứng dụng-khách ngay cả khi nhà phát hành được tin. Không cài đặt nào trong hai được thay thế bằng việc gửi một tệp CA.

Hãy kiểm tra chứng chỉ trước khi quyết định bất cứ điều gì:

  • openssl x509 -in server.crt -noout -subject -issuer -dates -ext subjectAltName cho biết ai đã phát hành, cho những tên nào và đến khi nào.
  • openssl verify -CAfile ca.crt server.crt kiểm tra xem chuỗi bạn định gửi có thực sự xác thực chiếc lá không.
  • openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -CAfile ca.crt -verify_return_error hoạt động với các điểm cuối TLS như cổng web; giao thức OpenVPN trên cổng 1194 không phải một luồng TLS thông thường, nên bài kiểm tra đó không áp dụng ở đó.

Một chứng chỉ có ngày hết hạn, không có subjectAltName cho tên bạn kết nối tới, hoặc thiếu mục đích sử dụng serverAuth sẽ thất bại bất kể neo được cài đặt cẩn thận đến đâu.

Năm kiểm tra trước khi bạn chấp nhận một cái

So sánh dấu vân tay qua một kênh không phải kết nối bạn đang cố sửa: một bảng điều khiển, một bộ cài bạn đã có, một tệp cấu hình đã ký. openssl x509 -in server.crt -noout -fingerprint -sha256 trên máy chủ và cùng giá trị đó trong nhật ký ứng dụng khách là đủ để biết bạn đang nhìn một đối tượng duy nhất.

Tiếp theo, quyết định bạn đang cài cái gì: một chiếc lá hay một nhà chức trách có thể đúc thêm. Sau đó quyết định nó đi đâu, và nêu tên các ứng dụng đọc kho đó. Ghi lại đường dỡ bỏ khi bạn vẫn còn nhớ nó, vì tin-rồi-đi-tiếp là cách một lần nhập tạm thời trở thành vĩnh viễn.

Cuối cùng, lập kế hoạch thay đổi. Một chứng chỉ hoặc dấu vân tay được ghim phải được cập nhật qua cùng kênh tin cậy khi chứng chỉ xoay vòng, và một CA riêng có vòng đời phát hành và thu hồi của riêng nó. Nếu khóa riêng rò rỉ, tin lại vào một bản sao của cùng chứng chỉ không sửa được gì; danh tính phải được thay thế.

Nếu một cảnh báo sống sót qua cả năm kiểm tra, câu hỏi hữu ích không phải là nút nào dập tắt nó mà là kho nào ứng dụng khách thực sự đọc và gốc đó đến từ đâu. Trả lời điều đó, và lần nhập bạn sắp làm trở thành một quyết định thay vì một phản xạ.

Bài viết liên quan