Certbot báo gia hạn thành công, các tệp trên đĩa mang ngày mới, và máy khách vẫn gặp danh tính cũ. SoftEther giữ chứng chỉ SSL máy chủ trong cấu hình cấp máy chủ của riêng nó, nên một tệp mới trên đĩa không đổi gì cho đến khi lá và khóa của nó được nhập. Chuỗi bên dưới bao gồm một lần nhập thủ công, một trình bao chạy sau mỗi lần gia hạn, và một kiểm tra đọc những gì trình lắng nghe thực sự trình bày. Mỗi bước để lại bằng chứng bạn có thể so sánh sau lần gia hạn tiếp theo.

Tệp đã gia hạn không đổi danh tính máy chủ

Cấp phát và triển khai là hai sự kiện riêng với các kiểu hỏng riêng. Ứng dụng ACME ghi tệp vào một thư mục dòng dõi và ghi nhận thành công; SoftEther tiếp tục dùng chứng chỉ được nạp lần cuối vào cấu hình. Vì vậy mã thoát bằng không mô tả các tệp, không phải dịch vụ, và hai thứ đó có thể lệch nhau chừng nào chưa ai nhìn. Hãy coi việc nhập là bước triển khai và việc gia hạn là đầu vào của nó.

Sự phân biệt đó cũng giải thích kiểu hỏng một nửa khó hiểu: chứng chỉ cũ vẫn chạy cho đến khi hết hạn, nên ban đầu không có gì trông hỏng. Khi nó hết hạn, mọi máy khách hỏng cùng lúc, trông như một sự cố chứ không như một bước triển khai bị bỏ sót. Kiểm tra danh tính được trình bày sau mỗi lần gia hạn biến bất ngờ đó thành quan sát thường nhật.

Chọn thách thức phù hợp với trình lắng nghe

Chứng chỉ phải nêu tên máy chủ mà máy khách xác minh, nên hãy dùng tên DNS công khai thay vì nhãn nội bộ hay địa chỉ. HTTP-01 cần thách thức được trả lời trên cổng 80 trong chốc lát, đó là trình lắng nghe tạm thời và không bao giờ là lý do để dời cổng riêng của SoftEther. DNS-01 chứng minh quyền kiểm soát bằng một bản ghi và hoàn toàn không cần HTTP vào.

Gia hạn không giám sát nghĩa là tích hợp DNS tự động với thông tin đăng nhập giới hạn trong một vùng, không phải bản ghi TXT gõ tay hai tháng một lần. Ký tự đại diện đổi loại thách thức, không đổi nhu cầu về tự động hóa đó. Hãy quyết định điều này trước khi có chứng chỉ đầu tiên, vì đổi loại thách thức sau này nghĩa là cùng lúc chạm vào cấu hình máy khách và tường lửa.

Giữ các thành phần gọn gàng khi còn ở đây. Lá và các chứng chỉ trung gian đến dưới dạng tệp riêng và dưới dạng một tệp chuỗi kết hợp, khóa riêng lại tách ra, và việc nhập cần chuỗi cùng khóa khớp, không phải chỉ chứng chỉ công khai.

Nhập chuỗi ở cấp máy chủ

Sao lưu cấu hình máy chủ và xác nhận bạn vẫn tới được giao diện quản trị trước khi chạm vào chứng chỉ. Kết nối với tư cách quản trị máy chủ chứ không phải quản trị Virtual Hub, vì chứng chỉ thuộc đối tượng máy chủ. Sau đó nạp chuỗi và khóa theo đường dẫn tuyệt đối, từ những tệp mà tài khoản chạy lệnh có thể đọc. Lưu ý các đường dẫn là tuyệt đối vì lệnh phân giải chúng từ thư mục làm việc của tiến trình đã chạy vpncmd:

ServerCertSet /LOADCERT:/etc/letsencrypt/live/vpn.example.com/fullchain.pem /LOADKEY:/etc/letsencrypt/live/vpn.example.com/privkey.pem

Đọc đầu ra của lệnh thay vì giả định thành công, rồi đọc lại chuỗi thay vì tin vào tệp bạn đã đưa. Ranh giới giữa các bản dựng nhập cả gói PEM và các bản dựng chỉ lấy chứng chỉ đầu tiên không được tài liệu hóa ở một chỗ, nên chính kiểm tra là thứ quyết định cho bản dựng trước mặt. Đếm số chứng chỉ mà trình lắng nghe trình bày; lá không có trung gian là dấu hiệu của một trình nhập chỉ tiêu thụ khối đầu tiên.

Giữ khóa đã nhập chỉ cho tài khoản chạy máy chủ đọc được, và giữ mật khẩu quản trị ra ngoài lịch sử shell. Với lần nhập đầu tiên này, hãy gõ mật khẩu tại dấu nhắc thay vì truyền nó như tham số lệnh. Hai thói quen đó không tốn gì và loại bỏ cách phổ biến nhất mà một lần triển khai chứng chỉ làm lộ thứ nó phải bảo vệ. Làm điều đó trước lần nhập đầu tiên, không phải sau.

Móc bước triển khai, không móc việc gia hạn

Khi nhập thủ công chạy được, đặt đúng những bước đó vào một trình bao nhỏ và gọi nó từ ứng dụng ACME sau khi gia hạn thành công. Certbot đặt RENEWED_LINEAGE và RENEWED_DOMAINS cho hook, nên trình bao có thể tác động lên một chứng chỉ trên máy quản lý nhiều chứng chỉ. Lọc theo dòng dõi thay vì phản ứng với mọi lần gia hạn trên máy chủ. Trình bao là mã triển khai chạy với quyền của máy chủ, nên hãy rà soát nó như mọi script khác ở vị trí đó.

certbot renew --deploy-hook /usr/local/sbin/softether-deploy.sh

Một hook chạy không giám sát cần kho thông tin đăng nhập được bảo vệ riêng và tín hiệu hỏng đến được người. Nếu cấp phát thành công mà nhập hỏng, hãy thử lại việc nhập thay vì yêu cầu chứng chỉ khác, vì yêu cầu thứ hai giấu khiếm khuyết triển khai sau một tệp mới. Tài liệu gia hạn của Certbot nói rõ rằng một lần chạy không cập nhật gì là kết quả bình thường, nên chính hook là thứ phân biệt hai trường hợp.

So sánh chuỗi được trình bày với tệp

Đọc trình lắng nghe, không đọc đĩa. Kết nối tới cổng hướng máy khách với tên máy chủ mà máy khách dùng, rồi so sánh dấu vân tay và chuỗi được giao với dòng dõi mà hook đã cài. Hai lệnh bao trùm điều đó, và lệnh đầu tiên cũng cho biết các chứng chỉ trung gian có đến hay không:

openssl s_client -connect vpn.example.com:443 -servername vpn.example.com -showcerts </dev/null 2>/dev/null | grep -c 'BEGIN CERTIFICATE'
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates -fingerprint -sha256

Sau đó tạo một kết nối máy khách mới, vì các phiên lập trước khi nhập đã được xác thực theo danh tính trước và không chứng minh gì về danh tính mới. Nếu máy khách ghim lá cũ, chúng cần cập nhật phối hợp ngay cả khi chuỗi công khai hợp lệ, và việc đó thuộc cùng một runbook với gia hạn. Một proxy ngược trước dịch vụ có thể trình bày chứng chỉ tốt trong khi trình lắng nghe VPN vẫn giữ cái cũ, và đó là lý do kiểm tra phải nêu tên cổng mà máy khách thực sự tới. Ghi dấu vân tay bên cạnh ngày gia hạn, để lần so sánh sau là một kiểm tra chứ không phải việc nhớ.

Bài viết liên quan