Thiết lập chứng chỉ SSL/TLS với Let’s Encrypt: Hướng dẫn triển khai cho môi trường sản xuất

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Bối cảnh & Lý do: Cuộc gọi lúc 2 giờ sáng

Đó là 2 giờ sáng. Điện thoại của bạn rung lên. Một cảnh báo nghiêm trọng xuất hiện: ‘Trang web không an toàn.’ Trình duyệt gắn cờ trang web của bạn, người dùng thấy cảnh báo, và sự hoảng loạn bắt đầu. Đây không chỉ là một sự bất tiện. Đó là một kẻ hủy hoại danh tiếng, một kẻ phá vỡ niềm tin và có khả năng là một vụ rò rỉ dữ liệu sắp xảy ra. Thủ phạm? Một chứng chỉ SSL/TLS đã hết hạn hoặc bị thiếu, xương sống của HTTPS.

Trong những khoảnh khắc hỗn loạn của một sự cố, việc hiểu ‘tại sao’ trở nên thứ yếu so với việc tìm ra ‘cách khắc phục ngay bây giờ.’ Nhưng hãy tua lại một chút. SSL (Secure Sockets Layer) và phiên bản kế nhiệm của nó, TLS (Transport Layer Security), là các giao thức mã hóa giúp giữ an toàn cho giao tiếp trên mạng máy tính.

Chữ ‘S’ trong ‘HTTPS’ biểu thị một kết nối được mã hóa, xác thực và an toàn. Điều này bảo vệ dữ liệu nhạy cảm—như thông tin đăng nhập, thông tin thanh toán và chi tiết cá nhân—khỏi việc nghe lén và giả mạo.

Trong nhiều năm, việc có được các chứng chỉ này là một quá trình tốn kém và thủ công. Nó thường gây đau đầu, liên quan đến các công cụ dòng lệnh phức tạp và quy trình xác thực chậm chạp, quan liêu. Sau đó, Let’s Encrypt xuất hiện. Được thành lập dựa trên các nguyên tắc miễn phí, tự động, mở và dễ sử dụng, Let’s Encrypt đã thay đổi bảo mật web. Hiện tại, nó cung cấp các chứng chỉ SSL/TLS đáng tin cậy cho hàng triệu trang web trên toàn cầu, biến HTTPS thành tiêu chuẩn, chứ không phải ngoại lệ.

Là một kỹ sư, tôi đã tận mắt chứng kiến sự khác biệt mà một trang web được bảo mật đúng cách mang lại. Đó không chỉ là về tuân thủ; đó là về sự tin tưởng của người dùng và SEO. Làm đúng điều này không phải là tùy chọn—mà là điều cơ bản. Ngay cả trước khi tôi chạm vào bất cứ thứ gì liên quan đến chứng chỉ trên một máy chủ mới, tôi sẽ củng cố các biện pháp phòng thủ của nó.

Mọi mật khẩu, từ đăng nhập quản trị đến truy cập cơ sở dữ liệu, đều được tạo bằng một công cụ phía máy khách mạnh mẽ. Cá nhân tôi tin dùng trình tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator. Đây là một công cụ dựa trên trình duyệt tuyệt vời. Điều này có nghĩa là không có dữ liệu nhạy cảm nào rời khỏi máy của tôi—một chi tiết quan trọng khi bạn xử lý thông tin xác thực sản xuất, đặc biệt là lúc 2 giờ sáng.

Cài đặt: Chuẩn bị Certbot

Certbot tự động hóa việc lấy và gia hạn chứng chỉ Let’s Encrypt. Công cụ mã nguồn mở, miễn phí này giúp bạn tự động sử dụng chứng chỉ Let’s Encrypt với các máy chủ web HTTPS được cấu hình thủ công.

Tùy chọn 1: Snap trên Ubuntu/Debian

Cách được khuyến nghị để cài đặt Certbot trên hầu hết các bản phân phối Linux hiện đại, đặc biệt là Ubuntu và Debian, là thông qua Snap. Snap đảm bảo bạn luôn có phiên bản mới nhất, điều này rất quan trọng đối với cả bảo mật và khả năng tương thích.


sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Lệnh sudo ln -s /snap/bin/certbot /usr/bin/certbot tạo một liên kết tượng trưng. Điều này cho phép bạn chạy certbot bằng cách chỉ cần gõ `certbot`, thay vì đường dẫn đầy đủ /snap/bin/certbot.

Tùy chọn 2: Yum/Dnf trên CentOS/RHEL

Đối với các hệ thống dựa trên CentOS hoặc RHEL, bạn thường sẽ sử dụng yum hoặc dnf. Đầu tiên, bạn có thể cần bật kho lưu trữ EPEL:


sudo yum install epel-release # Dành cho CentOS 7
sudo dnf install epel-release # Dành cho CentOS 8 / RHEL 8+
sudo yum install certbot      # Dành cho CentOS 7, thường không có plugin máy chủ web trực tiếp
sudo dnf install certbot      # Dành cho CentOS 8 / RHEL 8+, thường không có plugin máy chủ web trực tiếp

Tùy thuộc vào máy chủ web của bạn, bạn cũng sẽ cần cài đặt plugin Certbot tương ứng. Ví dụ bao gồm python-certbot-nginx hoặc python-certbot-apache.

Cấu hình: Tự động hóa việc lấy chứng chỉ

Khi Certbot đã được cài đặt, việc lấy và cấu hình chứng chỉ của bạn đơn giản một cách đáng ngạc nhiên. Certbot đi kèm với các plugin có thể tự động cấu hình các máy chủ web phổ biến như Nginx và Apache.

Đối với Máy chủ Web Apache

Nếu bạn đang chạy Apache, Certbot thường có thể xử lý toàn bộ quá trình. Điều này bao gồm việc sửa đổi cấu hình Apache của bạn để sử dụng các chứng chỉ mới và thiết lập chuyển hướng HTTP sang HTTPS.


sudo certbot --apache

Certbot sẽ hướng dẫn bạn qua một loạt các lời nhắc:

  • Nhập địa chỉ email của bạn (để nhận thông báo gia hạn khẩn cấp và cảnh báo bảo mật).
  • Đồng ý với Điều khoản dịch vụ của Let’s Encrypt.
  • Chọn có muốn chia sẻ email của bạn với Electronic Frontier Foundation hay không (tùy chọn này là không bắt buộc).
  • Chọn tên miền mà bạn muốn bật HTTPS. Certbot sẽ tự động phát hiện các tên miền được cấu hình trong Apache virtual hosts của bạn.

Certbot sau đó sẽ lấy và cài đặt chứng chỉ. Nó cũng sẽ hỏi bạn có muốn chuyển hướng lưu lượng HTTP sang HTTPS hay không; luôn chọn chuyển hướng.

Đối với Máy chủ Web Nginx

Đối với Nginx, Certbot cung cấp một plugin chuyên dụng giúp đơn giản hóa việc thiết lập tương tự:


sudo certbot --nginx

Các lời nhắc sẽ tương tự như thiết lập Apache:

  • Địa chỉ email.
  • Thỏa thuận Điều khoản dịch vụ.
  • Chia sẻ email với EFF (tùy chọn).
  • Lựa chọn tên miền (Certbot sẽ phát hiện các tên miền từ Nginx server blocks của bạn).

Certbot sau đó sẽ lấy và cài đặt chứng chỉ. Nó cũng sẽ cấu hình Nginx để sử dụng chứng chỉ đó, bao gồm cả việc thiết lập chuyển hướng HTTP sang HTTPS.

Thủ công (Standalone) hoặc Thử thách DNS

Đôi khi, các plugin Apache hoặc Nginx không phải là một lựa chọn. Điều này có thể là do máy chủ web của bạn không trực tiếp tiếp xúc với internet (ví dụ: nó nằm sau bộ cân bằng tải) hoặc bạn chỉ đơn giản là đang sử dụng một máy chủ web khác. Đối với những trường hợp này, bạn có thể sử dụng lệnh `certonly` với trình xác thực `–standalone` hoặc `–dns`.

Standalone: Phương pháp này tạm thời khởi động một máy chủ web nhỏ trên cổng 80 để chứng minh bạn sở hữu tên miền. Máy chủ web chính của bạn phải được dừng trong quá trình này, hoặc được cấu hình để không lắng nghe trên cổng 80 trong suốt thử thách.


sudo certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

Thử thách DNS: Phương pháp này hoàn hảo nếu máy chủ của bạn không thể truy cập công khai trên các cổng 80/443, hoặc nếu bạn đang quản lý nhiều tên miền phụ. Bạn sẽ cần thêm một bản ghi TXT đặc biệt vào cài đặt DNS của miền để chứng minh quyền sở hữu. Một số plugin DNS tồn tại (ví dụ: `certbot-dns-cloudflare`) có thể tự động hóa việc này bằng cách sử dụng khóa API.


sudo certbot certonly --dns-cloudflare -d yourdomain.com -d www.yourdomain.com

Bạn sẽ cần cài đặt plugin DNS cụ thể (ví dụ: pip install certbot-dns-cloudflare) và cấu hình thông tin xác thực API của nó.

Sau khi lấy chứng chỉ bằng certonly, bạn sẽ cần cấu hình máy chủ web của mình theo cách thủ công. Các tệp chứng chỉ thường nằm trong /etc/letsencrypt/live/yourdomain.com/.

Xác minh & Giám sát: Đảm bảo bảo mật liên tục

Cài đặt chứng chỉ chỉ là một nửa cuộc chiến. Bạn cần xác minh nó đang hoạt động và đảm bảo nó luôn được gia hạn.

Xác minh cài đặt

  1. Kiểm tra trình duyệt: Mở trang web của bạn trong trình duyệt. Tìm biểu tượng ổ khóa trên thanh địa chỉ. Nhấp vào nó để kiểm tra chi tiết chứng chỉ. Đảm bảo nó được cấp bởi Let’s Encrypt và hợp lệ cho miền của bạn.
  2. Kiểm tra SSL Labs: Sử dụng một công cụ của bên thứ ba như SSL Labs SSL Test. Nhập tên miền của bạn. Công cụ này cung cấp phân tích toàn diện về cấu hình SSL/TLS của bạn, bao gồm chuỗi chứng chỉ, giao thức và bộ mã hóa. Hãy nhắm đến xếp hạng A hoặc A+.
  3. Dòng lệnh: Bạn cũng có thể nhanh chóng kiểm tra chứng chỉ từ máy chủ của mình bằng cách sử dụng openssl:
  4. 
    echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
    

    Lệnh này sẽ hiển thị ngày notBeforenotAfter, xác nhận thời gian hiệu lực của chứng chỉ.

Gia hạn tự động

Chứng chỉ Let’s Encrypt có thời hạn 90 ngày. Thời gian hiệu lực ngắn này thực sự khuyến khích tự động hóa. May mắn thay, Certbot sẽ thiết lập tính năng gia hạn tự động cho bạn. Bạn có thể kiểm tra quá trình gia hạn mà không cần thực sự gia hạn:


sudo certbot renew --dry-run

Nếu chạy thử nghiệm thành công, chứng chỉ của bạn sẽ tự động được gia hạn. Certbot thường thiết lập một cron job hoặc systemd timer. Điều này chạy hai lần mỗi ngày, kiểm tra các chứng chỉ sắp hết hạn và gia hạn chúng một cách âm thầm trong nền.

Bạn có thể kiểm tra cơ chế gia hạn đang hoạt động bằng cách kiểm tra cron job (đối với các hệ thống cũ hơn hoặc thiết lập thủ công) hoặc systemd timer:


sudo systemctl list-timers | grep certbot # Dành cho các hệ thống dựa trên systemd
crontab -l | grep certbot                 # Dành cho các hệ thống dựa trên cron

Đảm bảo các lệnh này xác nhận một quy trình gia hạn đang hoạt động.

Khắc phục sự cố gia hạn thất bại

Đôi khi, việc gia hạn có thể thất bại. Khi điều đó xảy ra, thường là do một trong những lý do sau:

  • Tường lửa: Cổng 80 (cho thử thách HTTP-01) hoặc cổng 443 (nếu sử dụng TLS-ALPN-01) có thể bị chặn.
  • Thay đổi cấu hình máy chủ web: Nếu cấu hình Nginx hoặc Apache của bạn thay đổi theo cách mà Certbot không thể tìm thấy các khối máy chủ của miền của bạn, nó không thể gia hạn.
  • Sự cố DNS: Nếu bạn đang sử dụng thử thách DNS và thông tin xác thực API DNS của bạn không chính xác hoặc đã hết hạn.
  • Giới hạn tốc độ: Đạt giới hạn tốc độ của Let’s Encrypt do cố gắng cấp lại quá mức (ít phổ biến hơn với gia hạn tự động).

Nơi đầu tiên để tìm manh mối là nhật ký Certbot:


sudo less /var/log/letsencrypt/letsencrypt.log

Tệp nhật ký này cung cấp thông tin chi tiết về lý do tại sao việc gia hạn có thể đã thất bại. Nó cung cấp những manh mối quan trọng để giải quyết vấn đề. Hãy hành động nhanh chóng, vì bạn chỉ có 90 ngày trước khi hết hạn kích hoạt một cuộc gọi báo động khác lúc 2 giờ sáng.

Share: