Lỗi không kích hoạt systemd timer khiến certbot không tự động gia hạn chứng chỉ
Ngày cập nhật: 2023-01-31
Lượt xem: 3779
Số từ: 693
Phân loại: Nginx
Tìm kiếm
Vào dịp Tết Nguyên đán, tôi nhận được một email thông báo rằng chứng chỉ SSL của một tên miền trên máy chủ công ty sắp hết hạn. Ngày đầu tiên đi làm sau kỳ nghỉ, tôi quyết định xử lý ngay vấn đề này.
Một điều khá lạ là chứng chỉ miễn phí do Let’s Encrypt cấp trên máy chủ này dường như không bao giờ tự động gia hạn.
1
|
ls /var/log/letsencrypt
|
Tôi kiểm tra và thấy toàn bộ log đều đến từ các lần gia hạn thủ công, không có bất kỳ log nào liên quan đến việc gia hạn tự động. Điều đó cho thấy tác vụ lịch trình chưa từng được chạy. Trên một máy chủ khác đang hoạt động bình thường, tôi thấy rõ ràng có log gia hạn tự động được tạo ra. Như vậy, nguyên nhân chính vẫn là lệnh gia hạn không được thực hiện định kỳ.
Gia hạn bằng tay trước đã, sau đó mới tìm nguyên nhân
1
2
3
4
5
6
7
8
9
10
|
> certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
--------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.sunzhongwei.com.conf
--------------------------------------------------------------------------------
Renewing an existing certificate for www.sunzhongwei.com
Reloading nginx server after certificate renewal
--------------------------------------------------------------------------------
Congratulations, all renewals succeeded:
/etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem (success)
|
Cần lưu ý rằng khi gia hạn bằng tay, bạn không nên sử dụng tham số --dry-run
. Bạn có thể so sánh kết quả giữa hai trường hợp có và không dùng --dry-run
để thấy rằng trong trường hợp dùng --dry-run
, hệ thống sẽ không thực sự gia hạn hay reload lại Nginx.
1
2
3
4
5
6
7
8
9
|
> certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
--------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.sunzhongwei.com.conf
--------------------------------------------------------------------------------
Simulating renewal of an existing certificate for www.sunzhongwei.com
--------------------------------------------------------------------------------
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem (success)
|
Kiểm tra lại xem chứng chỉ đã được gia hạn thành công chưa:
1
2
|
> ls -lah /etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem
lrwxrwxrwx 1 root root 44 Jan 29 12:19 /etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem -> ../../archive/www.sunzhongwei.com/fullchain4.pem
|
Truy cập website qua trình duyệt và xác minh rằng chứng chỉ đã được cập nhật.
Cơ chế gia hạn tự động diễn ra như thế nào?
Trên một máy chủ hoạt động bình thường, tôi cũng không tìm thấy bất kỳ cấu hình cron nào liên quan. Sau khi tra cứu thêm, tôi biết rằng Certbot sử dụng cơ chế systemd timer
thay vì crontab
.
Ví dụ, trên máy chủ hoạt động tốt, ta có thể thấy một entry tên là certbot.timer
:
1
2
3
4
|
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2023-01-30 00:00:00 CST 10h left Sun 2023-01-29 00:00:01 CST 13h ago logrotate.timer logrotate.service
Mon 2023-01-30 01:28:27 CST 12h left Sun 2023-01-29 12:49:53 CST 13min ago certbot.timer certbot.service
|
Trong khi đó, trên máy chủ bị lỗi, không hề xuất hiện certbot.timer
:
1
2
3
|
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2023-01-29 13:10:00 CST 6min left Sun 2023-01-29 13:00:20 CST 2min 54s ago sysstat-collect.timer sysstat-collect.service
|
Kiểm tra cấu hình của systemd timer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
~ ls /lib/systemd/system/ | grep certbot
certbot-renew.service
certbot-renew.timer
> cd /lib/systemd/system
> cat certbot-renew.timer
[Unit]
Description=This is the timer to set the schedule for automated renewals
[Timer]
OnCalendar=--* 00/12:00:00
RandomizedDelaySec=12hours
Persistent=true
[Install]
WantedBy=timers.target
> cat certbot-renew.service
[Unit]
Description=This service automatically renews any certbot certificates found
[Service]
EnvironmentFile=/etc/sysconfig/certbot
Type=oneshot
ExecStart=/usr/bin/certbot renew --noninteractive --no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
|
Tôi không hoàn toàn hiểu rõ cách cấu hình của certbot-renew.timer
, nhưng đoán rằng nó sẽ kích hoạt một service cùng tên. Có lẽ timer này chưa được bật?
1
2
3
|
> systemctl start certbot-renew.timer
> systemctl enable certbot-renew.timer
Created symlink /etc/systemd/system/timers.target.wants/certbot-renew.timer → /usr/lib/systemd/system/certbot-renew.timer.
|
Thật vậy, sau khi kích hoạt, chúng ta có thể thấy timer đã xuất hiện:
1
2
3
|
> systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2023-01-30 03:32:56 CST 12h left n/a n/a certbot-renew.timer certbot-renew.service
|
Tài liệu
- Các thao tác cơ bản với systemd timer
Hy vọng bài viết này hữu ích với những ai gặp phải tình trạng tương tự! Nếu bạn có bất kỳ câu hỏi nào, hãy để lại comment bên dưới nhé!