Sửa lỗi "Type: unauthorized" của Let's Encrypt — Certbot Renewal thất bại

intermediate🔒 SSL/TLS2026-03-18| Linux (Ubuntu 20.04/22.04, Debian 11/12, CentOS 7/8), Nginx hoặc Apache, Certbot 1.x/2.x

Error Message

Certbot failed to authenticate some domains. The following errors were reported: Domain: example.com Type: unauthorized
#ssl#letsencrypt#certbot#renewal

TL;DRLỗi Type: unauthorized có nghĩa là HTTP-01 challenge của Certbot đã thất bại — Let's Encrypt không thể lấy file token tạm thời từ http://yourdomain.com/.well-known/acme-challenge/. Chạy lệnh này trước:

curl -I http://yourdomain.com/.well-known/acme-challenge/test

Kết nối bị từ chối? Web server của bạn không chạy hoặc port 80 bị chặn. Nhận được 404? Server đang chạy nhưng có gì đó đang chặn đường dẫn request. 404 hay timeout sẽ cho bạn biết ngay hướng cần xử lý.

Điều Gì Đang Xảy RaLet's Encrypt xác minh bạn sở hữu domain thông qua HTTP-01 challenge: Certbot ghi một file token ngắn vào /.well-known/acme-challenge/, và máy chủ Let's Encrypt sẽ kết nối qua HTTP thuần để đọc lại file đó. Quá trình trao đổi này xảy ra phía Let's Encrypt — bạn không kiểm soát được sau khi renewal bắt đầu. Nếu việc lấy file thất bại vì bất kỳ lý do gì, bạn sẽ gặp lỗi Type: unauthorized.

Sáu nguyên nhân phổ biến gây ra lỗi này:

  • Port 80 bị chặn — tường lửa hoặc cloud security group chặn HTTP inbound- Web server không chạy — Nginx/Apache bị crash, hoặc thay đổi config gần đây khiến nó dừng lại- DNS không khớp — domain trỏ đến IP khác với server này- Cấu hình server chặn .well-known — redirect HTTPS toàn cục bắt request challenge trước khi đến được file- Cloudflare proxy — chế độ proxy orange-cloud đôi khi chấm dứt kết nối HTTP trước khi challenge token được phục vụ- Bản ghi DNS CAA — giới hạn rõ ràng các Certificate Authority nào được phép cấp chứng chỉ cho domain của bạn## Các Bước Khắc Phục### Bước 1 — Xác nhận port 80 có thể truy cậpChạy lệnh này từ máy khác (hoặc dùng công cụ kiểm tra port online như portchecker.co):
nc -zv yourdomain.com 80

Nếu timeout hoặc bị từ chối, hãy mở port:

# UFW (Ubuntu/Debian)
sudo ufw allow 80/tcp
sudo ufw reload

# firewalld (CentOS/RHEL)
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload

# iptables trực tiếp
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Đang chạy trên AWS, GCP, hoặc Azure? Cloud security group nằm bên ngoài OS hoàn toàn. Hãy mở port 80 ở đó nữa — console có thể không hiển thị là đang bị chặn, nhưng thực tế là vậy.

Bước 2 — Đảm bảo web server đang chạy```

Nginx

sudo systemctl status nginx sudo systemctl start nginx

Apache

sudo systemctl status apache2 sudo systemctl start apache2


Kiểm tra `journalctl -u nginx -n 50` nếu service không khởi động được — lỗi cú pháp config từ lần chỉnh sửa gần đây là nguyên nhân thường gặp.
### Bước 3 — Kiểm tra DNS trỏ đến server này```
dig +short yourdomain.com
curl -s ifconfig.me

Cả hai phải trả về cùng một IP. Nếu không khớp, hãy cập nhật A record tại nhà cung cấp DNS và chờ. Với TTL 300 giây, quá trình propagation mất 5–10 phút. Với TTL 3600, hãy tính khoảng 1 giờ. Đừng thử lại Certbot cho đến khi chúng khớp nhau.

Bước 4 — Sửa Nginx chặn đường dẫn challengeRedirect HTTP→HTTPS toàn cục sẽ chặn challenge trước khi nó đến được file. Cách khắc phục là thêm block location để bỏ qua redirect chỉ cho đường dẫn challenge:

server {
    listen 80;
    server_name yourdomain.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/html;
        allow all;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}
sudo nginx -t && sudo systemctl reload nginx

Bước 4b — Sửa Apache chặn đường dẫn challenge```

<VirtualHost *:80> ServerName yourdomain.com

Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
<Directory /var/www/html/.well-known/acme-challenge/>
    Options None
    AllowOverride None
    Require all granted
</Directory>

Redirect permanent / https://yourdomain.com/
sudo apachectl configtest && sudo systemctl reload apache2

Bước 5 — Kiểm tra bản ghi DNS CAA```

dig CAA yourdomain.com


Không có output? Bạn ổn — không có bản ghi CAA nghĩa là bất kỳ CA nào cũng có thể cấp chứng chỉ. Nếu bạn có bản ghi CAA và `letsencrypt.org` không có trong danh sách, hãy thêm vào:

yourdomain.com. 3600 IN CAA 0 issue "letsencrypt.org"


### Bước 6 — Người dùng CloudflareChế độ proxy orange-cloud của Cloudflare có thể chấm dứt kết nối HTTP trước khi server của bạn phục vụ challenge token. Cách nhanh nhất: chuyển bản ghi DNS sang grey-cloud (DNS only) trong Cloudflare dashboard, đợi 60 giây, gia hạn, rồi chuyển lại.
Không muốn đụng vào proxy? Hãy dùng DNS-01 challenge với Cloudflare API — không cần HTTP chút nào:

sudo apt install python3-certbot-dns-cloudflare sudo certbot certonly
--dns-cloudflare
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini
-d yourdomain.com


### Bước 7 — Chạy dry run với output chi tiếtĐừng thực hiện renewal thật ngay lập tức. Let's Encrypt giới hạn số lần thất bại (5 lần thất bại mỗi domain mỗi giờ), vì vậy hãy chạy dry run trước:

sudo certbot renew --dry-run --verbose


Output verbose hiển thị URL chính xác mà Certbot cố xác thực và HTTP response nhận được — hữu ích hơn nhiều so với thông báo lỗi mặc định. Sau khi dry run thành công, hãy chạy thật:

sudo certbot renew


### Bonus — Dùng standalone mode để cô lập vấn đềMuốn loại trừ hoàn toàn cấu hình server của bạn? Dừng server và để Certbot tự khởi động HTTP listener tạm thời trên port 80:

sudo systemctl stop nginx sudo certbot certonly --standalone -d yourdomain.com sudo systemctl start nginx


Hoạt động với standalone nhưng thất bại bình thường? Cấu hình server của bạn là vấn đề, dứt khoát. DNS và tường lửa đều ổn.
## Xác Nhận Đã Khắc Phục```
# Liệt kê tất cả chứng chỉ và ngày hết hạn
sudo certbot certificates

# Kiểm tra chứng chỉ trực tiếp qua OpenSSL
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null \
  | openssl x509 -noout -dates

# Xác nhận HTTPS phản hồi
curl -I https://yourdomain.com

Ngày notAfter phải cách khoảng 90 ngày từ hôm nay. Nếu certbot certificates hiển thị ngày hết hạn trong tương lai, bạn đã xong.

Ngăn Lỗi Xảy Ra LạiPort 80 phải luôn mở — ngay cả trên các trang redirect tất cả sang HTTPS. Let's Encrypt sẽ kết nối vào đó mỗi 60–90 ngày để renewal. Chặn nó và bạn sẽ gặp lại lỗi này.

Tiếp theo, xác nhận auto-renewal đã được lên lịch:

# Kiểm tra systemd timer (cài đặt Certbot hiện đại)
systemctl list-timers | grep certbot

# Hoặc kiểm tra cron
crontab -l | grep certbot

Không có gì hiển thị? Thêm cron job thủ công:

sudo crontab -e
# Thêm:
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

--post-hook đáng chú ý: nó chỉ chạy khi chứng chỉ thực sự được gia hạn, không phải mỗi lần chạy. Server của bạn sẽ không bị reload không cần thiết lúc 3 giờ sáng vào 364 ngày trong năm khi không có gì thay đổi.

Related Error Notes