Published on

Nhận chứng chỉ Let's Encrypt không cần trỏ tên miền

Authors

HTTPS không còn quá xa lạ mà gần như là yêu cầu bắt buộc khi xây dựng một website. Let's Encrypt đóng góp một phần không nhỏ vào sự tăng trưởng này: miễn phí và dễ issue (đăng ký) một chứng chỉ là những ưu điểm giúp người dùng và các lập trình viên ưa chuộng và tin dùng Let's Encrypt.

Với Let's Encrypt thì mọi việc gần như đều đã được tự động hóa hoàn toàn. Bạn không cần phải làm những bước phức tạp như tạo CSR, hay phải đợi key từ bên phát hành (issuer) sau khi đã submit,... Toàn bộ việc bạn cần làm là trỏ IP về máy chủ/hosting mới, vậy là xong, vừa có website để sử dụng, vừa có HTTPS cho thêm đẹp. Tuy nhiên, cũng chính vì phải trỏ tên miền về máy chủ/hosting mới mà sẽ có downtime xuất hiện, dù ít dù nhiều. Bài viết này mình sẽ chia sẻ với các bạn trải nghiệm của mình cũng như cách hạn chế được 100% downtime khi chuyển máy chủ.

Bài viết này hiện tại chỉ dành cho những ai sử dụng VPS/server. Lí do là mình đã lâu không sử dụng hosting nên cũng không rõ cách áp dụng như thế nào, nhưng có tìm kiếm thử thì cPanel đã hỗ trợ 🔗 rồi.

Vấn đề downtime khi chuyển website sử dụng SSL Let's Encrypt

Như mình đã nói, để tạo được chứng chỉ từ Let's Encrypt, bạn phải trỏ tên miền về IP của máy chủ mới, sau đó mới có thể thực hiện bước chứng thực và issue chứng chỉ của tên miền. Vì vậy, dù có cố gắng thế nào đi nữa, bạn sẽ phải đợi bên DNS provider (bên quản lý DNS của tên miền) cập nhật bản ghi DNS thành công, đợi các worker của Let's Encrypt cập nhật DNS mới của tên miền, từ đó mới có thể chứng thực và phát hành chứng chỉ mới cho bạn.

Lúc này chúng ta hoàn toàn tiến thoái lưỡng nan, bật trang maintenance lên cũng không được vì chứng chỉ đâu mà dùng, bật Cloudflare trung gian cũng không xong vì worker không thể xác thực tên miền thông qua proxy Cloudflare, chỉ có nước chịu trận giữ nguyên đó cho tới khi Let's Encrypt chứng thực được tên miền.

true

Timeline trên sẽ cho bạn thấy thời gian downtime ở đây phụ thuộc rất nhiều hoàn toàn vào Let's Encrypt. Nếu thời gian cập nhật DNS của worker nhanh thì may mắn, còn lỡ "xui" thì không biết bao giờ mới có thể live trang. Đối với một số trường hợp như sử dụng HSTS preload, sử dụng tên miền .dev thì càng bó tay hơn khi không thể truy cập vào trong thời gian này bởi vì không có chứng chỉ hợp lệ. Mặc dù có những cách bypass như tạm thời trust (tin tưởng) chứng chỉ tự ký, nhưng mình thấy như vậy là không nên vì là một bad practice không nên làm theo.

Và team Let's Encrypt cũng đã nhận biết được vấn đề này và đưa ra một giải pháp mới giúp thời gian downtime trở về 0, hoàn toàn là chứng chỉ đầy đủ để chúng ta có thể vào test một vòng trước khi để khách hàng thật sự vào website.

Khi DNS Challenge là vị cứu tinh

Chính vì lẽ trên, team Let's Encrypt đã đưa ra một cách xác thực tên miền và máy chủ cực kì thông minh dựa vào các DNS record thay vì dùng bot truy cập trực tiếp vào website. Cách này cũng thường được Google sử dụng để xác thực tên miền khi thêm vào Search Tools đó.

Thay vì trỏ IP như thông thường, Let's Encrypt sẽ cho bạn một DNS TXT record có giá trị là một dãy các kí tự ngẫu nhiên để bạn thêm ở trang quản lý DNS, từ đó worker của LE có thể xác thực tên miền và máy chủ ngay tức khắc (hoặc tùy thuộc vào độ "nhanh" của bên quản lý tên miền). Nhờ cơ chế xác thực thông qua DNS record, team LE có thể nâng cấp certbot 🔗 lên một tầm cao mới để giúp tự động luôn việc thêm DNS record này bằng DNS API đối với một số bên quản lý tên miền xịn ví dụ như Cloudflare, Route53, Google, Digital Ocean, Linode,...

Tóm lại, việc xác thực tên miền thông qua DNS Challenge giúp bạn tự động hóa hoàn toàn quy trình như đã từng, đồng thời cũng giúp bạn có được chứng chỉ trước khi deploy (triển khai) giúp các bạn có thể testing với một chứng chỉ xịn hoặc có được chứng chỉ trước khi migrate (dời) website giúp giảm được downtime thay vì phải đợi quá trình cập nhật IP hoàn tất như trước kia.

Tạo chứng chỉ Let's Encrypt xác thực bằng DNS challenge

Nói dông dài là vậy để các bạn hiểu cách hoạt động của tính năng này vì thật ra đa số các script quản lý VPS như WordOps 🔗, EasyEngine v4 🔗 đều đã được hỗ trợ sẵn rồi, các bạn chỉ việc dùng thôi. Tuy vậy có những lúc hệ thống chúng ta xây dựng không phải từ những script có sẵn nên mình giới thiệu mọi người cách cài đặt và sử dụng một cách hợp lý nhé.

Đầu tiên, bạn phải cài đặt Certbot có hướng dẫn rất chi tiết và đơn giản tại đây 🔗, mục đích là để tự động hóa các quy trình issue chứng chỉ của domain, đồng thời cũng hỗ trợ các DNS plugin là danh sách các bên quản lý tên miền có hỗ trợ DNS API, ví dụ như Cloudflare mà anh em hay dùng.

true

Hướng dẫn cài đặt của Certbot đã rất rõ ràng. Anh em cứ vậy mà cài đặt theo. Nếu không sử dụng Ubuntu, bạn có thể chọn hướng dẫn theo hệ điều hành khác.

Sau khi cài đặt xong, mời các bạn đi đến một trong hai cách lấy chứng chỉ tên miền. Nếu bạn đang quản lý DNS của tên miền tại những nhà cung cấp dưới đây, mời bạn qua cách thứ 2 cho tiện. Còn lại, mời các bạn sử dụng cách chứng thực bằng cách thêm TXT record thủ công:

  • Cloudflare
  • Cloudxns
  • Digitalocean
  • DNSimple
  • dnsmadeeasy
  • Google
  • Linode
  • Luadns
  • NSOne
  • OVH
  • Route53

1. Lấy chứng chỉ thủ công

Bước này đòi hỏi bạn phải đăng nhập vào trang quản lý DNS của tên miền để có thể tạo TXT record. Trang quản lý này bạn có thể hỏi bên hỗ trợ hoặc chính là trang để bạn trỏ tên miền về IP của máy chủ sau này đó.

Hãy sử dụng câu lệnh dưới đây và thay tenmien.com thành tên miền mà bạn muốn xác thực với Let's Encrypt nhé.

root@ubuntu:~# certbot -d tenmien.com --manual --preferred-challenges dns certonly Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for tenmien.com

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged?

(Y)es/(N)o: Y

Please deploy a DNS TXT record under the name _acme-challenge.tenmien.com with the following value: HinRHASGdTVyTEA9SJTiK1Ye3GPfqUdFfSn1TaIGZ3c Before continuing, verify the record is deployed.

Press Enter to Continue

Khi đã có đoạn DNS TXT record mà mình đã in đậm phía trên, các bạn có thể truy cập vào trang quản lý tên miền và thêm record này vào. Nếu bạn không rành về kĩ thuật, hãy gửi câu "Please deploy a DNS ..." đến cho bên hỗ trợ của nhà cung cấp, họ sẽ hỗ trợ được.

true

Khi đã thêm record xong, các bạn nên đợi khoảng 30s - 1 phút để thay đổi có hiệu lực, sau đó quay trở về màn hình SSH và nhấn Enter để xác nhận là bạn đã thêm DNS record thành công. Sau bước này bạn không cần làm thêm bước nào cả, chỉ cần đợi Let's Encrypt thông báo đã xác thực thành công thôi :D

2. Lấy chứng chỉ tự động

Đoạn hướng dẫn này mình chỉ tạm thời hướng dẫn với bên quản lý là Cloudflare, tuy nhiên các nhà cung cấp khác cũng tương tự như nhau, bạn chỉ cần cung cấp API key là được. Vui lòng xem hướng dẫn chi tiết của mỗi bên quản lý tại User guide 🔗 để biết thêm chi tiết.

Khi đã cài đặt Certbot xong, chúng ta sẽ cài đặt thêm plugin DNS Challenge của Cloudflare với lệnh bên dưới. Nếu bạn không sử dụng Cloudflare mà là các nhà cung cấp khác thì có thể tìm trong bài viết này 🔗.

$ apt install python3-certbot-dns-cloudflare

Sau đó, bạn tạo một tập tin cấu hình Cloudflare để lưu 2 thông tin, bao gồm API key lấy tại đây 🔗 và địa chỉ email tài khoản Cloudflare dưới mẫu như sau. Mình thường lưu ở đường dẫn /root/.cloudflare/tenemail.ini. Vì Certbot có thể quản lý nhiều tên miền nằm trên nhiều tài khoản Cloudflare khác nhau, mình khuyên các bạn tạo tập tin cấu hình theo tên email để dễ quản lý sau này.

dns_cloudflare_email = [email protected] dns_cloudflare_api_key = d86d7d1f423f6c137

Sau đây là màn vui vẻ nhất, lấy chứng chỉ Let's Encrypt tự động hoàn toàn dựa vào DNS challenge. Khác với bước lấy chứng chỉ bằng cách cập nhật DNS thủ công, cách này bạn không cần phải làm gì cả, chứng chỉ sẽ được tạo ra ngay khi chứng thực xong và bạn cũng không cần làm gì nữa.

$ certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.cloudflare/tenemail.ini -d datuan.dev

Vậy là xong.

Nên chmod các tập tin cấu hình này về 400 để đảm bảo an toàn theo lời khuyên của Certbot bằng câu lệnh chmod 400 -R /root/.cloudflare/

Tổng kết

Có thể thấy việc chứng thực tên miền/máy chủ thông qua DNS challenge là tiện lợi và mang lại rất nhiều lợi ích. Nếu cần lấy chứng chỉ ở một server mới, ví dụ bạn chạy kiến trúc Load balacing bằng DNS round robin thì chỉ việc copy tập tin cấu hình qua và chạy câu lệnh một lần nữa là xong. Bạn cũng có thể sao lưu lại tập tin này dưới máy tính để sử dụng sau này.

Ngoài ra mình thấy lợi ích khi trỏ NS quản lý tên miền về Cloudflare là rất hợp lý, được ứng dụng nhiều công cụ hỗ trợ do tính phổ biến của Cloudflare hiện tại. Còn bạn nghĩ sao, cho mình biết suy nghĩ của bạn về DNS challenge và việc quản lý tên miền tại Cloudflare nhé.