Tôi đoán rằng certbot-renew - xem kết quả tỷ số bóng đá

/imgposts/vavljeuh.jpg

Trong dịp Tết Nguyên đán, tôi nhận được một email cảnh báo rằng chứng chỉ tên miền trên máy chủ công ty sắp hết hạn. Hôm nay là ngày đầu tiên làm việc trở lại, tôi quyết định xử lý vấn đề này ngay.

Tôi cảm thấy rất kỳ lạ vì máy chủ này sử dụng chứng chỉ miễn phí từ letsencrypt nhưng luôn không thể tự động gia hạn.

ls /var/log/letsencrypt

Sau khi kiểm tra, tôi nhận thấy tất cả các bản ghi đều là kết quả của các thao tác thủ công, không có bất kỳ nhật ký nào từ quá trình gia hạn tự động. Điều này cho thấy nhiệm vụ lên lịch không được thực thi tự động. Khi tôi kiểm tra trên một máy chủ khác mà quá trình gia hạn diễn ra bình thường, tôi thấy có sự hiện diện của nhật ký tự động. Vì vậy, nguyên nhân gốc rễ vẫn là lệnh chưa được thực thi định kỳ.

Đầu tiên, tôi sẽ giải quyết vấn đề theo cách thủ công trước khi tiến hành điều tra chi tiết.

> certbot renew
Lưu nhật ký gỡ lỗi vào /var/log/letsencrypt/letsencrypt.log
--------------------------------------------------------------------------------
Xử lý /etc/letsencrypt/renewal/www.sunzhongwei.com.conf
--------------------------------------------------------------------------------
Gia hạn chứng chỉ hiện tại cho www.sunzhongwei.com
Tải lại máy chủ nginx sau khi gia hạn chứng chỉ
--------------------------------------------------------------------------------
Chúc mừng, tất cả các lần gia hạn đã thành công:
/etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem (thành công)

Lưu ý rằng khi gia hạn thủ công, không nên thêm tham số dry run (có nghĩa là mô phỏng hoặc tập dượt). So sánh kết quả khi thêm tham số dry run, bạn sẽ thấy rằng không có thao tác gia hạn thực tế hay tải lại nginx.

> certbot renew --dry-run
Lưu nhật ký gỡ lỗi [vn69](/blog/qms-supplier-managemen/)  vào /var/log/letsencrypt/letsencrypt.log
--------------------------------------------------------------------------------
Xử lý /etc/letsencrypt/renewal/www.sunzhongwei.com.conf
--------------------------------------------------------------------------------
Mô phỏng gia hạn chứng chỉ hiện tại cho www.sunzhongwei.com
--------------------------------------------------------------------------------
Chúc mừng, tất cả các lần gia hạn mô phỏng đã thành công:
/etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem (thành công)

Xác nhận rằng chứng chỉ đã được gia hạn thành công:

> ls -lah /etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem
lrwxrwxrwx 1 root root 44 Ngày 29 tháng 1 12:19 /etc/letsencrypt/live/www.sunzhongwei.com/fullchain.pem -> ../../archive/www.sunzhongwei.com/fullchain4.pem

Khi mở trang web trong trình duyệt, tôi xác nhận rằng chứng chỉ đã được cập nhật.

Trên máy chủ khác hoạt động bình thường, tôi không tìm thấy cấu hình crontab liên quan. Sau khi tìm hiểu tỷ số trực tuyến bóng đá 7m.cn trực tuyến, tôi mới biết rằng certbot sử dụng hệ thống task định thời của systemd thay vì crontab.

Ví dụ, trên máy chủ mà chứng chỉ hoạt động bình thường, tôi có thể nhìn thấy mục certbot.timer:

$ systemctl list-timers
TIẾP           CÒN LẠI     CUỐI          ĐÃ QUA    UNIT             KÍCH HOẠT
Thứ Hai 30/1/2023 00:00:00 CST 10h left   Chủ nhật 29/1/2023 00:00:01 CST 13h ago   logrotate.timer       logrotate.service
Thứ Hai 30/1/2023 01:28:27 CST 12h left   Chủ nhật 29/1/2023 12:49:53 CST 13 phút ago  certbot.timer        certbot.service

Trên máy chủ gặp sự cố, không có dấu vết nào của certbot.timer:

$ systemctl list-timers
TIẾP            CÒN LẠI     CUỐI            ĐÃ QUA    UNIT             KÍCH HOẠT
Chủ nhật 29/1/2023 13:10:00 CST 6 phút left   Chủ nhật 29/1/2023 13:00:20 CST 2 phút 54 giây ago sysstat-collect.timer    sysstat-collect.service

Kiểm tra cấu hình systemd timer:

~ ls /lib/systemd/system/ | grep certbot
certbot-renew.service
certbot-renew.timer
> cd /lib/systemd/system
> cat certbot-renew.timer
[Unit]
Mô tả=Đây là bộ hẹn giờ để thiết lập lịch trình cho các lần gia hạn tự động
[Timer]
OnCalendar=--* 00/12:00:00
RandomizedDelaySec=12hours
Persistent=true
[Install]
WantedBy=timers.target
> cat certbot-renew.service
[Unit]
Mô tả=Dịch vụ này tự động gia hạn tất cả các chứng chỉ certbot được tìm thấy
[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 hiểu rõ cấu hình của certbot-renew.timer... Tôi đoán rằng certbot-renew.timer sẽ thực thi dịch vụ cùng tên. Nguyên nhân không thực thi có lẽ là do timer chưa được kích hoạt (enable)?

> systemctl start certbot-renew.timer
> systemctl enable certbot-renew.timer
Đã tạo liên kết tượng trưng /etc/systemd/system/timers.target.wants/certbot-renew.timer → /usr/lib/systemd/system/certbot-renew.timer.

Quả nhiên, sau khi kích hoạt (enable), tôi có thể nhìn thấy certbot timer:

> systemctl list-timers --all
TIẾP            CÒN LẠI     CUỐI            ĐÃ QUA    UNIT             KÍCH HOẠT
Thứ Hai 30/1/2023 03:32:56 CST 12h left   n/a             n/a     certbot-renew.timer     certbot-renew.service

Dưới đây là một số lệnh cơ bản để quản lý systemd timer:

  • Để xem danh sách tất cả các timer: systemctl list-timers --all
  • Để khởi động một timer cụ thể: systemctl start <tên_timer>
  • Để kích hoạt (enable) một timer: systemctl enable <tên_timer>
  • Để vô hiệu hóa (disable) một timer: systemctl disable <tên_timer>
  • Để dừng một timer: systemctl stop <tên_timer>

Hy vọng bài viết này sẽ giúp ích cho những ai đang gặp phải tình huống tương tự!