Mục đích của chứng chỉ máy chủ trông có vẻ đúng, khóa khớp, ngày tháng cũng ổn, vậy mà kết nối vẫn thất bại với unsupported certificate purpose. Chi tiết giúp giải quyết việc này thường nằm ngay trên dòng báo lỗi: một giá trị độ sâu và một chủ thể chỉ ra chứng chỉ ở tầng cao hơn trong chuỗi. Ở đây đang diễn ra hai phép kiểm tra khác nhau, và chỉ một trong số đó liên quan đến lá chứng chỉ. So sánh hai phép kiểm tra ấy sẽ giải thích vì sao thay chứng chỉ máy chủ chẳng thay đổi được gì.

Trình xác minh thực sự đã từ chối chứng chỉ nào

Một chuỗi không phải là một đối tượng được lặp lại ba lần. Lá chứng chỉ mang tên và khóa của máy chủ, các chứng chỉ trung gian nối nó với gốc, và mỗi chứng chỉ có thời hạn, ràng buộc cùng mục đích sử dụng riêng. Khi lỗi nêu một độ sâu, con số đó chỉ ra một vị trí trong chuỗi mà trình xác minh đã dựng, và vị trí ấy có thể không như bạn tưởng nếu máy chủ gửi một chuỗi bất thường.

Hãy đọc các trường của chứng chỉ ở đúng độ sâu đó, chứ không phải chứng chỉ mà bạn cho là có lỗi. Chỉ yêu cầu hai phần mở rộng ràng buộc việc cấp phát thay vì đổ ra toàn bộ trường, vì câu trả lời gần như luôn nằm ở một trong hai. Kết quả xuất của phần mở rộng thì chia sẻ được; khóa riêng thì không bao giờ.

openssl x509 -in issuing-ca.pem -noout -subject -issuer -ext basicConstraints -ext extendedKeyUsage

Nếu chứng chỉ được nêu tên là một CA trung gian có phần mở rộng mục đích khóa nhắc tới thứ gì đó không liên quan đến xác thực máy chủ TLS, phần còn lại của lỗi sẽ đến một cách máy móc. Chuỗi này không dùng được cho mục đích mà OpenVPN yêu cầu.

Mục đích của lá và chính sách chuỗi là hai phép kiểm tra

Phép kiểm tra lá đặt một câu hỏi hẹp: chứng chỉ đầu cuối này có cho phép xác thực máy chủ cho tên này không? Phép kiểm tra chuỗi đặt câu hỏi rộng hơn: liệu mọi chứng chỉ trên đường dẫn có được phục vụ mục đích đó không? Một tổ chức cấp chứng chỉ chỉ được phép phát hành chứng chỉ máy khách sẽ vượt qua kiểm tra chữ ký của chính nó và vẫn trượt phép kiểm tra thứ hai, vì đường dẫn mà nó cho phép không bao gồm mục đích mà ứng dụng cần. Hai phép kiểm tra thất bại bằng cùng những từ ngữ và có cách sửa hoàn toàn khác nhau.

Đó là lý do một lá chứng chỉ vừa được cấp, đúng ở mọi trường nhìn thấy được, vẫn có thể thất bại ngay lập tức. Cũng vì thế mà cách sửa thường nằm ở hồ sơ của tổ chức cấp chứng chỉ chứ không phải ở cấu hình VPN.

Không có EKU không phải là EKU bị hạn chế

RFC 5280 để phần mở rộng mục đích khóa ở dạng tùy chọn và, khi có mặt, nó mang tính ràng buộc. Vì vậy một chứng chỉ CA không có phần mở rộng đó chưa hề nói “không” với xác thực máy chủ, trong khi một chứng chỉ chỉ liệt kê một mục đích không liên quan thì đã nói điều gì đó khá cụ thể. Coi hai trạng thái ấy là tương đương sẽ dẫn tới chẩn đoán sai và, tệ hơn, cách sửa sai. Sự khác biệt này cũng giải thích vì sao hai tổ chức trông giống nhau trên bảng điều khiển lại hành xử khác hẳn nhau trong một chuỗi.

Hành vi của thư viện ở đây cũng không đồng nhất. Tài liệu tùy chọn xác minh của OpenSSL mô tả cách nó tự xử lý các phép kiểm tra mục đích trên chứng chỉ CA, và cách xử lý đó là một chính sách triển khai chứ không phải quy tắc mà mọi ngăn xếp TLS đều tuân theo y hệt. Hãy mô tả trình xác minh của bạn làm gì, rồi đối chiếu với phiên bản mà bạn thực sự chạy.

Tái hiện lỗi ngoại tuyến trước khi cấp lại

Xác minh ngoại tuyến loại ứng dụng ra khỏi câu hỏi. Nếu chuỗi thất bại theo đúng cách đó dưới cùng một mục đích, thì chứng chỉ là vấn đề và cấu hình máy chủ có sửa bao nhiêu cũng không che được. Nếu chuỗi vượt qua ngoại tuyến mà dịch vụ vẫn từ chối, thì ứng dụng đang yêu cầu một mục đích khác hoặc đang dùng một chuỗi khác với chuỗi bạn đã kiểm tra.

openssl verify -purpose sslserver -show_chain -CAfile root-ca.pem -untrusted issuing-ca.pem vpn-server.pem

-show_chain quan trọng vì nó in ra đường dẫn mà công cụ đã dựng, thứ thường không trùng với thứ tự tệp bạn đưa vào. Kết quả đó là cách nhanh nhất để phát hiện rằng một CA trung gian thứ hai đang được lấy từ kho tin cậy, rằng máy chủ gửi một biến thể ký chéo mà bạn không định dùng, hoặc rằng cờ mục đích bạn sao từ một bài hướng dẫn thuộc về vai trò khác với vai trò đang được phục vụ.

Sửa chính sách cấp phát, không sửa lời gọi xác minh

Cách sửa bền vững là một CA trung gian được cấp dưới một chính sách cho phép những mục đích mà nó phải phục vụ, kèm theo ràng buộc được ghi lại và rà soát. Thêm mọi mục đích cho mọi tổ chức không phải là chính sách; nó xóa đi chính ràng buộc đã khiến phần mở rộng này có ý nghĩa, và thường tồn tại lâu hơn sự cố đã khơi ra nó. Một ghi chú ngắn trong hồ sơ mô tả tổ chức được phép chứng nhận những vai trò nào sẽ giúp lần cấp lại sau không phải tranh luận lại.

Tắt xác minh là một lối tắt hấp dẫn khác, và nó biến một vấn đề chứng chỉ thành vấn đề tin cậy. Hãy giữ nguyên phép kiểm tra mục đích, sửa lại chuỗi, rồi chạy lại đúng phép xác minh ngoại tuyến đó để xác nhận rằng đường dẫn giờ đã phục vụ vai trò dự định trước khi động vào dịch vụ lần nữa.

Bài viết liên quan