CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnCách lấy chứng chỉ Let’s Encrypt bằng DNS trên Ubuntu 18.04
Chuyên gia

Cách lấy chứng chỉ Let’s Encrypt bằng DNS trên Ubuntu 18.04

CyStack blog 8 phút để đọc
CyStack blog11/08/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 8 minutes

Hôm nay, chúng ta sẽ cùng nhau đi sâu vào một chủ đề quan trọng trong việc bảo mật website và dịch vụ trực tuyến: cấp phát chứng chỉ TLS (SSL) từ Let’s Encrypt thông qua xác thực DNS.

lấy chứng chỉ Let's Encrypt bằng DNS

Hầu hết chứng chỉ Let’s Encrypt hiện nay cấp phát thông qua phương thức HTTP validation, vốn rất thuận tiện cho việc cài đặt trên một máy chủ đơn lẻ. Tuy nhiên, phương thức này không phải lúc nào cũng phù hợp để cấp chứng chỉ cho các trang web chạy phía sau bộ cân bằng tải (load balancer) và đặc biệt, không thể dùng để cấp phát chứng chỉ wildcard (ví dụ: *.your-domain).

DNS validation cho phép các yêu cầu cấp chứng chỉ được xác minh bằng cách sử dụng bản ghi DNS, thay vì phục vụ nội dung qua HTTP. Điều này có nghĩa là chúng ta có thể đồng thời cấp phát chứng chỉ cho một cụm máy chủ web đang chạy phía sau bộ cân bằng tải, hoặc cho một hệ thống không thể truy cập trực tiếp qua internet. Chứng chỉ wildcard cũng được hỗ trợ khi sử dụng DNS validation.

Công cụ acme-dns-certbot giúp kết nối Certbot với một máy chủ DNS của bên thứ ba, nơi các bản ghi xác minh chứng chỉ được tự động thiết lập thông qua API khi bạn yêu cầu cấp chứng chỉ. Ưu điểm nổi bật của phương pháp này là bạn không cần tích hợp trực tiếp Certbot với tài khoản nhà cung cấp DNS của mình, cũng không cần cấp cho nó quyền truy cập không hạn chế vào toàn bộ cấu hình DNS, mang lại lợi ích đáng kể về bảo mật.

Chúng ta sử dụng các khu vực DNS được ủy quyền (Delegated DNS zones) để chuyển hướng các truy vấn tìm kiếm bản ghi xác minh chứng chỉ đến dịch vụ DNS của bên thứ ba. Nhờ đó, một khi quá trình thiết lập ban đầu hoàn tất, bạn có thể yêu cầu cấp phát bao nhiêu chứng chỉ tùy thích mà không cần thực hiện bất kỳ thao tác xác minh thủ công nào.

Một lợi ích quan trọng khác của acme-dns-certbot là khả năng cấp chứng chỉ cho các máy chủ riêng lẻ, vốn có thể chạy phía sau bộ cân bằng tải hoặc không trực tiếp truy cập được qua HTTP. Phương pháp xác thực chứng chỉ HTTP truyền thống không thể thực hiện trong các trường hợp này, trừ khi bạn tự thiết lập các tệp xác thực trên từng máy chủ. Công cụ acme-dns-certbot cũng rất hữu ích nếu bạn muốn cấp chứng chỉ cho một máy chủ không thể truy cập qua internet, ví dụ như một hệ thống nội bộ hoặc môi trường staging.

Trong bài hướng dẫn này, chúng ta sẽ sử dụng hook acme-dns-certbot cho Certbot để cấp phát chứng chỉ Let’s Encrypt bằng xác thực DNS.

Chuẩn bị

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Một máy chủ Ubuntu 18.04 bao gồm một người dùng không phải root có quyền sudo.
  • Một tên miền mà bạn có thể mua chứng chỉ TLS, kèm theo khả năng thêm các bản ghi DNS.

Bước 1: Cài đặt Certbot

Trong bước này, chúng ta sẽ cài đặt Certbot một chương trình chuyên dùng để cấp phát và quản lý các chứng chỉ Let’s Encrypt.

Certbot có sẵn trong các kho lưu trữ Apt chính thức của Ubuntu, tuy nhiên, chúng tôi khuyên bạn nên sử dụng kho lưu trữ do các nhà phát triển Certbot duy trì, vì nó luôn cung cấp phiên bản phần mềm cập nhật nhất.

Bắt đầu bằng cách thêm kho lưu trữ Certbot:

sudo apt-add-repository ppa:certbot/certbot

Bạn cần nhấn ENTER để chấp nhận lời nhắc và thêm kho lưu trữ mới vào hệ thống của mình.

Tiếp theo, cài đặt gói Certbot:

sudo apt install certbot

Sau khi quá trình cài đặt hoàn tất, bạn có thể kiểm tra xem Certbot đã được cài đặt thành công hay chưa:

certbot --version

Lệnh này sẽ hiển thị một kết quả tương tự như sau:

Outputcertbot 0.31.0

Trong bước này, bạn đã cài đặt Certbot. Tiếp theo, chúng ta sẽ tải xuống và cài đặt hook acme-dns-certbot.

Bước 2: Cài đặt acme-dns-certbot

Sau khi chương trình Certbot cơ bản đã được cài đặt, bạn có thể tải xuống và cài đặt acme-dns-certbot, công cụ này sẽ cho phép Certbot hoạt động ở chế độ xác thực DNS.

Bắt đầu bằng cách tải xuống một bản sao của tập lệnh:

Lưu ý: Để đảm bảo thực hành tốt nhất, vui lòng xem xét kho lưu trữ GitHub này và tập lệnh trước khi chạy nó. Bạn cũng có thể fork (tạo bản sao) kho lưu trữ này trước, sau đó sử dụng tập lệnh acme-dns-certbot.py. Việc fork này cung cấp một lớp bảo mật bổ sung, đảm bảo rằng tập lệnh vẫn nằm trong tầm kiểm soát của bạn và ít bị ảnh hưởng bởi các thay đổi không xác minh.

wget <https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py>

Sau khi tải xuống hoàn tất, đánh dấu tập lệnh là có thể thực thi:

chmod +x acme-dns-auth.py

Sau đó, chỉnh sửa tệp bằng trình soạn thảo văn bản yêu thích của bạn và điều chỉnh dòng đầu tiên để buộc nó sử dụng Python 3:

nano acme-dns-auth.py

Thêm số 3 vào cuối dòng đầu tiên:

#!/usr/bin/env python3
. . .

Điều này là cần thiết để đảm bảo rằng tập lệnh sử dụng phiên bản Python 3 được hỗ trợ mới nhất, thay vì phiên bản Python 2 cũ.

Sau khi hoàn tất, hãy lưu và đóng tệp.

Cuối cùng, di chuyển tập lệnh vào thư mục Let’s Encrypt của Certbot để Certbot có thể tải nó:

sudo mv acme-dns-auth.py /etc/letsencrypt/

Trong bước này, bạn đã tải xuống và cài đặt hook acme-dns-certbot. Tiếp theo, chúng ta có thể bắt đầu quá trình thiết lập và tiến tới việc cấp phát chứng chỉ đầu tiên của mình.

Bước 3: Thiết lập acme-dns-certbot

Để bắt đầu sử dụng acme-dns-certbot, bạn cần hoàn thành quá trình thiết lập ban đầu và cấp phát ít nhất một chứng chỉ.

Bắt đầu bằng cách chạy Certbot để buộc nó cấp phát chứng chỉ bằng xác thực DNS. Thao tác này sẽ chạy tập lệnh acme-dns-certbot và kích hoạt quá trình thiết lập ban đầu:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \\\\*.your-domain -d your-domain

Bạn sử dụng đối số --manual để tắt tất cả các tính năng tích hợp tự động của Certbot. Trong trường hợp này, bạn chỉ cấp phát một chứng chỉ thô, chứ không tự động cài đặt nó trên một dịch vụ nào đó.

Bạn cấu hình Certbot sử dụng hook acme-dns-certbot thông qua đối số --manual-auth-hook. Bạn chạy đối số --preferred-challenges để Certbot ưu tiên xác thực DNS.

Bạn cũng phải yêu cầu Certbot tạm dừng trước khi cố gắng xác thực chứng chỉ, điều này bạn làm bằng đối số --debug-challenges. Mục đích là để bạn có thời gian đặt bản ghi DNS CNAME (hoặc các bản ghi khác) mà acme-dns-certbot yêu cầu, điều này sẽ được đề cập sau trong bước này. Nếu không có đối số --debug-challenges, Certbot sẽ không tạm dừng, vì vậy bạn sẽ không có thời gian để thực hiện thay đổi DNS cần thiết.

Hãy nhớ thay thế mỗi tên miền bạn muốn sử dụng bằng các đối số -d. Nếu bạn muốn cấp chứng chỉ wildcard, hãy đảm bảo thoát ký tự dấu sao (*) bằng dấu gạch chéo ngược (\\\\).

Sau khi thực hiện các bước tiêu chuẩn của Certbot, bạn cuối cùng sẽ được nhắc với một thông báo tương tự như sau:

Output...
Output from acme-dns-auth.py:
Please add the following CNAME record to your main DNS zone:
_acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io.

Waiting for verification...
...

Bạn cần thêm bản ghi DNS CNAME được yêu cầu vào cấu hình DNS cho tên miền của mình. Điều này sẽ ủy quyền kiểm soát subdomain _acme-challenge cho dịch vụ ACME DNS, cho phép acme-dns-certbot tự động thiết lập các bản ghi DNS cần thiết để xác thực yêu cầu chứng chỉ.

Nếu bạn đang sử dụng DigitalOcean làm nhà cung cấp DNS của mình, bạn có thể thiết lập bản ghi DNS trong bảng điều khiển của mình như hình minh họa:

Chúng tôi khuyên bạn nên đặt TTL (time-to-live) khoảng 300 giây để giúp đảm bảo rằng mọi thay đổi đối với bản ghi được lan truyền nhanh chóng.

Sau khi bạn đã cấu hình bản ghi DNS, hãy quay lại Certbot và nhấn ENTER để xác thực yêu cầu chứng chỉ và hoàn tất quá trình cấp phát.

Điều này sẽ mất vài giây và sau đó bạn sẽ thấy một thông báo xác nhận rằng chứng chỉ đã được cấp phát:

Output...
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your-domain/privkey.pem
...

Bạn đã chạy acme-dns-certbot lần đầu tiên, thiết lập các bản ghi DNS cần thiết và cấp phát thành công một chứng chỉ. Tiếp theo, chúng ta sẽ thiết lập việc tự động gia hạn chứng chỉ của bạn.

Bước 4: Sử dụng acme-dns-certbot

Trong bước cuối cùng này, bạn sẽ sử dụng acme-dns-certbot để cấp thêm chứng chỉ và gia hạn các chứng chỉ hiện có.

Đầu tiên, sau khi bạn đã cấp phát thành công ít nhất một chứng chỉ bằng acme-dns-certbot, bạn có thể tiếp tục cấp chứng chỉ cho cùng các tên DNS mà không cần thêm bản ghi CNAME DNS nào khác. Tuy nhiên, nếu bạn muốn có một chứng chỉ cho một subdomain khác hoặc một tên miền hoàn toàn mới, bạn sẽ được nhắc thêm một bản ghi CNAME khác.

Ví dụ, bạn có thể cấp một chứng chỉ wildcard độc lập khác mà không cần thực hiện lại việc xác minh:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \\\\*.your-domain

Tuy nhiên, nếu bạn cố gắng cấp một chứng chỉ cho một subdomain, bạn sẽ được nhắc thêm một bản ghi CNAME cho subdomain đó:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Lệnh này sẽ hiển thị một kết quả tương tự như quá trình thiết lập ban đầu mà bạn đã thực hiện ở Bước 3:

Output...
Please add the following CNAME record to your main DNS zone:
_acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io.

Waiting for verification...
...

Bây giờ bạn đã có thể sử dụng acme-dns-certbot để cấp phát chứng chỉ, chúng ta cũng nên xem xét quy trình gia hạn.

Khi chứng chỉ của bạn gần hết hạn, Certbot có thể tự động gia hạn chúng cho bạn:

sudo certbot renew

Quá trình gia hạn có thể chạy từ đầu đến cuối mà không cần tương tác của người dùng và nó sẽ ghi nhớ tất cả các tùy chọn cấu hình mà bạn đã chỉ định trong quá trình thiết lập ban đầu.

Để kiểm tra xem điều này có hoạt động hay không mà không cần chờ đến gần ngày hết hạn, bạn có thể kích hoạt một lần chạy thử (dry run). Điều này sẽ mô phỏng quá trình gia hạn mà không thực hiện bất kỳ thay đổi thực tế nào đối với cấu hình của bạn.

Bạn có thể kích hoạt một lần chạy thử bằng cách sử dụng lệnh renew tiêu chuẩn, nhưng kèm theo đối số --dry-run:

sudo certbot renew --dry-run

Lệnh này sẽ hiển thị một kết quả tương tự như sau, mang lại sự đảm bảo rằng quá trình gia hạn đang hoạt động chính xác:

Output...
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator manual, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for your-domain
dns-01 challenge for your-domain
Waiting for verification...
Cleaning up challenges
...

Trong bước cuối cùng này, bạn đã cấp thêm một chứng chỉ và sau đó đã kiểm tra quy trình gia hạn tự động trong Certbot.

Kết luận

Trong bài viết này, chúng ta đã thiết lập Certbot cùng với acme-dns-certbot để cấp phát chứng chỉ bằng cách sử dụng xác thực DNS. Phương pháp này mở ra khả năng sử dụng chứng chỉ wildcard cũng như quản lý một số lượng lớn các máy chủ web riêng biệt có thể đang hoạt động phía sau một bộ cân bằng tải.

Hãy đảm bảo bạn luôn theo dõi kho lưu trữ acme-dns-certbot để biết bất kỳ cập nhật nào cho tập lệnh, vì chúng tôi luôn khuyến nghị chạy phiên bản mới nhất được hỗ trợ.

Nếu bạn quan tâm đến việc tìm hiểu sâu hơn về acme-dns-certbot, bạn có thể xem lại tài liệu cho dự án acme-dns, đây là thành phần phía máy chủ của acme-dns-certbot:

Phần mềm acme-dns cũng có thể được tự host (tự triển khai trên máy chủ của bạn), điều này có thể mang lại lợi ích nếu bạn đang hoạt động trong các môi trường có yêu cầu bảo mật cao hoặc phức tạp.

Ngoài ra, bạn có thể tìm hiểu sâu hơn về các chi tiết kỹ thuật của xác thực DNS ACME bằng cách xem lại phần liên quan trong tài liệu RFC chính thức, nơi phác thảo cách thức hoạt động của quy trình này:

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất