Một phía của đường hầm ký kênh điều khiển bằng một khe khóa mà phía kia không bao giờ kiểm tra, và kết nối chết với lỗi xác thực trước khi một chứng chỉ nào được trao đổi. Đó là hình dạng của sự lệch hướng trong tls-auth, và nó mang tính tất định: cùng hai tệp đó thất bại ở mọi lần thử, từ mọi mạng. Không có gì trong nhật ký nêu tên tùy chọn bạn đang tìm, vì thế người ta tạo lại khóa và cấp lại chứng chỉ vốn chưa từng hỏng. Cách sửa là làm hai đầu bù trừ cho nhau, hoặc để cả hai song hướng, chứ không phải làm yếu việc xác minh.

Lỗi xảy ra trước khi tới chứng chỉ

Với tls-auth, cả hai đầu giữ cùng một khóa chia sẻ và mỗi bên dùng một trong hai khe dẫn xuất từ nó: một khe ký các gói điều khiển đi ra, khe kia xác minh các gói đi vào. Hướng 0 và hướng 1 gán các vai trò đó theo thứ tự ngược lại, nên cặp phải bù trừ nhau để các kiểm tra HMAC khớp. Khi việc gán bị đảo ở một phía, bên nhận tìm chữ ký ở khe sai và từ chối gói. Phiên kết thúc ở đó, vì thế lỗi liên quan tới xác thực gói chứ không phải thứ gì đó kho chứng chỉ sẽ tạo ra.

Tính tất định quan trọng cho chẩn đoán, vì một vấn đề thời gian hay đường đi để lại dấu vết khác: ngắt quãng không đều, một hướng hỏng, hoặc một phiên chỉ chết trên một mạng cụ thể. Lệch hướng thất bại ngay lần bắt tay đầu tiên mỗi lần, và nó thất bại y hệt trên một máy khác giữ cùng hai tệp. Đọc nhật ký ở --verb 4 và tìm gói bị từ chối đầu tiên thay vì dòng cuối. Nếu sự từ chối đó xảy ra trước mọi lần trao đổi chứng chỉ, khóa chia sẻ và hướng của nó là hai thứ đáng kiểm tra.

What you seeWhat it rules outNext check
Authentication error before any certificate is sentThe data channel is irrelevant; the control channel never authenticatedCompare tls-auth and its direction on both ends
Certificate or handshake failure after the control channel authenticatesThe shared key and its direction already agreeCheck the CA, the certificate dates and the hostname
Session completes but throughput or cipher warnings appearDirection was never the problemCompare the data-channel cipher settings
Startup stops on an options errorThe number itself is not the issueRe-read the inline versus external directive syntax

Con số sống ở đâu

Sách hướng dẫn OpenVPN 2.6 ghi lại hai nơi cho hướng: đối số thứ hai của tls-auth khi khóa nằm trong tệp riêng, và một dòng key-direction độc lập khi khóa được nhúng trong hồ sơ. Cả hai đặt cùng một giá trị, nên hồ sơ phải dùng một dạng hoặc dạng kia, không bao giờ cả hai. Bỏ qua cũng là một lựa chọn, và nó đặt cả hai đầu vào một cách bố trí song hướng vốn hoạt động khi không bên nào nêu hướng. Hai đầu mang cùng một số không nằm trong cách bố trí đó: mỗi bên chờ ký ở một khe và xác minh ở khe kia, và cả hai làm điều đó theo cùng một cách.

# server.conf, external key
tls-auth ta.key 0

# client.ovpn, external key
tls-auth ta.key 1

# client.ovpn, inline key
key-direction 1

Dạng nhúng là một chỉ thị trên dòng riêng của nó, không phải thuộc tính trên thẻ mở của khối khóa, và thêm đối số vào thẻ đó là lỗi, không phải thay đổi hướng. Vị trí cũng quan trọng: chỉ thị nằm ngoài khối mà nó thuộc về, nên một giá trị viết bên trong khối được đọc như vật liệu khóa. Hãy sao chép cách bố trí mà người phân phối hồ sơ đã định thay vì tự nghĩ ra một cặp, vì một hồ sơ chạy được với một máy chủ có thể đã được phản chiếu ở phía bên kia.

Tùy chọn này không đụng tới điều gì

Nó không mã hóa lưu lượng ứng dụng. tls-auth đặt một HMAC quanh các gói của kênh điều khiển, còn kênh dữ liệu được bảo vệ bằng các khóa phiên thương lượng trong lúc bắt tay, nên câu hỏi về thông lượng hay mật mã không liên quan gì tới con số hướng. Thiết lập này cũng không thêm lớp mã hóa thứ hai, và chính giả định đó khiến người ta đi tìm một khóa dài hơn.

Nó không áp dụng cho tls-crypt, một cơ chế kênh điều khiển khác với tùy chọn và cách xử lý khóa riêng, và nó không nói gì về danh tính chứng chỉ của bất kỳ bên nào. Vì thế một sự khớp hướng đang hoạt động chỉ chứng minh hai đầu đồng ý cách xác thực kênh điều khiển, chứ không phải chuỗi tin cậy đã được kiểm chứng.

Căn chỉnh cặp rồi kết nối lại

So sánh hai cấu hình trước khi đổi bất kỳ cấu hình nào, vì sửa phía vốn đã đúng sẽ nhân đôi công việc. Lệnh grep bên dưới cho thấy mỗi tệp chọn cơ chế nào; lần chạy chi tiết cho thấy kênh điều khiển có được xác thực hay không. Giữ cả hai đầu ra, để thay đổi tiếp theo có thể so với một trạng thái đã biết.

grep -n -E 'tls-auth|tls-crypt|key-direction' server.conf client.ovpn
openvpn --config client.ovpn --verb 4 2>&1 | grep -i -E 'hmac|tls error|control channel'

Khởi động lại cả hai đầu sau mọi thay đổi, vì các tùy chọn này được đọc một lần lúc khởi động và việc nạp lại một phía để cặp không nhất quán suốt đời phiên cũ. Nếu việc triển khai hiện đang chạy mà không cấu hình hướng, thêm thiết lập vào một đầu sẽ tái tạo đúng lỗi bạn đã bắt đầu; hoặc để cả hai yên, hoặc cấu hình cả hai. Đổi một đầu mỗi lần và giữ tệp trước đó, để một hồi quy là hai phút hoàn tác chứ không phải dựng lại.

Ghi lại cơ chế, tệp khóa và hướng cho từng đầu trong ghi chú triển khai, vì nếu không người tiếp theo sẽ đọc hai tệp giống nhau và cho rằng các con số phải khớp với nhau. Hướng là một chi tiết phối hợp, không phải nâng cấp bảo mật: nó tách hai hướng của kênh điều khiển và không làm gì khác.

Bài viết liên quan