openssl ca: ngày hết hạn không hợp lệ trong index.txt và cách sửa
CA từ chối cấp vì một dòng trong index.txt không phân tích được. Hãy sao chép trạng thái của CA, giải mã bản ghi, rồi đối chiếu nó với chứng chỉ đã ký.
Một lượt cấp phát dừng lại ở entry 22: invalid expiry date, trong khi yêu cầu trước mặt bạn hoàn toàn ổn. Khiếu nại đến từ bộ phân tích cơ sở dữ liệu của CA, không phải từ CSR và cũng không phải từ máy khách VPN mà cuối cùng sẽ trình chứng chỉ. Sự khác biệt đó quyết định mọi thứ về sau: một bản ghi bị hỏng định dạng, nên việc sửa chữa thuộc về trạng thái của CA chứ không thuộc về yêu cầu hay cấu hình của đối tác. Hãy coi bản ghi được đánh số đó như một dòng trong index.txt, và vấn đề thu hẹp thành một câu hỏi dữ liệu có giới hạn với câu trả lời kiểm chứng được.
Đọc lỗi như một khiếu nại về cơ sở dữ liệu
Mỗi openssl ca lời gọi đều duyệt qua cơ sở dữ liệu văn bản của nó trước khi ký bất cứ thứ gì. Mỗi dòng chứa một chữ cái trạng thái, một dấu thời gian hết hạn, một dấu thời gian thu hồi tùy chọn, một số sê-ri ở dạng thập lục phân, một tên tệp và chủ thể. Khi một trường không phân tích được, lệnh báo số dòng và dừng lại thay vì đoán phần còn lại của bản ghi.
Việc dừng đó mang tính bảo vệ chứ không phải câu nệ. Một bản ghi mà công cụ không đọc được khiến nó không thể quyết định liệu chủ thể được yêu cầu đã tồn tại chưa, liệu một số sê-ri đã được cấp chưa, hay CRL tiếp theo nên chứa gì. Đi tiếp qua một dòng hỏng sẽ tạo ra đúng kiểu không nhất quán âm thầm ấy, thứ chỉ lộ ra sau nhiều tháng, thường là trong một lần thu hồi mà không ai giải thích được. Hãy đọc thông báo như một khiếu nại về dữ liệu, và cuộc điều tra sẽ nằm trong thư mục của CA.
Sao chép trạng thái của CA trước khi chạm vào bất cứ thứ gì
Hãy chụp ảnh toàn bộ thư mục CA, không chỉ tệp cơ sở dữ liệu. Chỉ mục, tệp thuộc tính của nó, các tệp số sê-ri và số CRL, khóa riêng tư và các chứng chỉ đã cấp đều tham gia vào các thao tác sau này, và một lần sửa chữa chỉ khôi phục một thứ mà bỏ qua những thứ khác sẽ tạo ra sự cố thứ hai. Ở đâu có quy trình sao lưu riêng của CA thì hãy dùng nó, và tạm dừng việc cấp phát theo lịch trong suốt thời gian làm việc.
Ghi lại bản dựng OpenSSL và tệp cấu hình mà lệnh thất bại thực sự đã nạp. Các bản cài đặt thường giữ nhiều hơn một thư mục CA, và lỗi chỉ có ý nghĩa so với cơ sở dữ liệu mà cấu hình được chọn chỉ định.
Tìm bản ghi và giải mã trường ngày của nó
Số dòng được báo tính từ bản ghi đầu tiên, nên sed -n '22p' index.txt rơi đúng vào bản ghi có vấn đề sau khi bạn xác nhận không có dòng trống hay chú thích nào ở phía trên. Hãy in dòng đó với các dấu phân cách nhìn thấy được, vì tab và khoảng trắng cuối dòng rất phổ biến và vô hình trong một cửa sổ trình soạn thảo thông thường.
Trường hết hạn là một dấu thời gian có độ rộng phụ thuộc vào năm. Các giá trị đến năm 2049 được ghi ở dạng UTCTime là YYMMDDHHMMSSZ, còn các giá trị muộn hơn chuyển sang GeneralizedTime với năm bốn chữ số. Một bản ghi trộn hai dạng, hoặc mang năm hai chữ số ở chỗ bộ phân tích giờ đây mong đợi bốn chữ số, sẽ thất bại đúng tại điểm này. Một trường bị cắt cụt do lần ghi bị ngắt cũng vậy.
Hãy so bản ghi với chứng chỉ mà nó tham chiếu chứ không phải với tệp của một CA khác. Chứng chỉ đã ký là nguồn có thẩm quyền về điều mà hiệu lực phải nói, và nó đã tồn tại như một đối tượng có thể phân tích.
Sửa bản ghi theo chứng chỉ đã ký
Đọc ngày thực bằng openssl x509 -in issued.pem -noout -dates -serial -subject. Chuyển notAfter sang độ rộng dấu thời gian mà bản dựng của bạn ghi cho năm đó, và trước khi đổi một ký tự hãy xác nhận số sê-ri khớp với bản ghi bạn sắp sửa.
Chỉ sửa trường bị hỏng, giữ nguyên chữ cái trạng thái và số sê-ri, và để yên phần còn lại của dòng. Nếu không thể đối chiếu bản ghi với bất kỳ chứng chỉ đã ký nào, hãy coi đó là bản ghi lạc và cho nó nghỉ hưu qua đường thu hồi riêng của CA thay vì xóa dòng bằng tay.
Đừng sửa bằng cách cắt bớt ngày cho vừa với một phỏng đoán về năm. Một vết cắt hai ký tự không thể chuyển giữa các bản dựng, và nó âm thầm thay đổi hiệu lực mà cơ sở dữ liệu báo cho các lần kiểm tra chủ thể trùng lặp và CRL về sau. Khi giá trị gốc không thể khôi phục, hãy cấp lại dưới một số sê-ri mới và ghi lại vì sao cái cũ bị bỏ. Dấu vết kiểm toán là một phần của việc sửa chữa, không phải giấy tờ bao quanh nó.
Xác minh việc cấp phát và tạo CRL trước khi rời đi
Chạy một lượt cấp phát với cùng cấu hình và xác nhận nó hoàn tất mà không có khiếu nại về số dòng. Sau đó tạo một CRL bằng openssl ca -gencrl -config openssl.cnf và kiểm tra rằng nó phân tích được, vì bản ghi bị hỏng thường lộ ra ở đó chứ không phải trong lúc ký.
Kiểm tra chứng chỉ mới bằng openssl x509 -noout -dates -serial và so nó với dòng mà CA vừa ghi. Xác nhận chữ cái trạng thái và ngày hết hạn khớp với chứng chỉ, và xác nhận rằng openssl verify -CAfile ca.pem issued.pem trả về không lỗi. Sau đó khôi phục việc cấp phát theo lịch và theo dõi lần chạy đầu tiên, vì dòng hỏng thứ hai sẽ tự thông báo ngay lập tức.