Hướng dẫn bảo mật Nginx với Let's Encrypt trên CentOS 7

6 năm trước

                    

Giới thiệu

Let's Encrypt là một nhà cung cấp chứng thực số mới ra đời (CA) .Với Let's Encrypt, bạn có thể dễ dàng lấy cũng như cài đặt chứng chỉ TLS/SSL miễn phí, qua đó ta có thể mã hóa HTTPS trên web server.  Nó cũng cung cấp công cụ Certbot để tự động xử lý các công việc đó làm cho quá trình xử lý trở nên đơn giản hơn. Hiện tại quá trình lấy và cài đặt chứng chỉ đều có thể tự động thực hiện được trên các webserver như Apache và Nginx.

Trong phần này chúng tôi sẽ hướng dẫn cách sử dụng certbot Let's Encrypt Client để lấy chứng chỉ  SSL sử dụng miễn phí với Nginx trên CentOS 7 cũng như cách tự gia hạn chứng chỉ SSL.

 

Yêu cầu căn bản

Công cụ cần có.

  • Một máy chủ CentOS 7 với người dùng giả định sudo.
  • Bạn phải có một tên miền đã đăng ký để sử dụng chứng chỉ này, nếu không có thì bạn có thể đăng ký trên các ứng dụng cung cấp dịch vụ tên miền như BCTech tại website: http://bctech.vn....
  • Một DNS A Record trỏ tên miền tới địa chỉ IP công khai trên máy chủ của bạn để Let's Encrypt xác nhận rằng bạn đang sử dụng chứng chỉ mà nó cung cấp. Ví dụ , nếu bạn muốn lấy một chứng chỉ cho miền example.com, thì miền đó phải xác nhận với máy chủ  là còn hiệu lực để tiếp tục làm việc. Chúng ta sẽ sử dụng 2 tên miền là example.com và www.example.com, nên bạn cần có 2 tên miền.

Lúc này chúng ta sẽ chuyển sang cài đặt phần mềm Let's Encrypt Client.

Bước 1 - Cài Certbot Let's Encrypt Client

Bước đầu tiên để lấy chứng chỉ SSL là cài công cụ certbot  trên máy chủ thông qua kho lưu trữ EPEL .

Truy cập kho lưu trữ EPEL bằng cách nhập:

sudo yum install epel-release 

Sau đó lấy gói certbot-nginx bằng cách nhập:

sudo yum install certbot-nginx 

Giờ thì certbot Let's Encrypt client đã sẵn sàng để sử dụng.

 

Bước 2 - Cài đặt Nginx

Nếu bạn chưa cài Nginx thì bạn có thể cài ngay bây giờ tận dụng kho lưu trữ EPEL đang sẵn có:

sudo yum install nginx 

Sau đó khởi động sử dụng lệnh systemctl:

sudo systemctl start nginx 

Certbot có thể tự động định cấu hình SSL cho Nginx, nhưng nó cần phải tìm khối server  trong mục    server_name  sao cho phù hợp với tên miền mà bạn yêu cầu chứng chỉ để định cấu hình cho bạn. Nếu bây giờ bạn mới bắt đầu dùng Nginx thì bạn nên update cấu hình file mặc định cho nó:

sudo vi /etc/nginx/nginx.conf 

Tìm dòng server_name :

/etc/nginx/sites-available/default
server_name _;

Thay ký tự _ bằng tên miền của bạn:

/etc/nginx/nginx.conf
server_name example.comwww.example.com;

Lưu và thoát. Bạn có thể xác minh cú pháp với lệnh:

sudo nginx -t 

Nếu không có lỗi thì tải lại Nginx để tải cấu hình mới:

sudo systemctl reload nginx 

Certbot sẽ tìm chính xác khối server và update nó, giờ thì ta sẽ update Firewall để cho phép lưu thông luồng dữ liệu HTTPS.

 

Bước 3 - Update Firewall

Nếu có Firewall rồi thì phải mở cổng số 80 và 443 để cho phép luồng dữ liệu lưu thông. Nếu bạn không chạy Firewall thì có thể bỏ qua bước đầu.

Nếu có  firewalld thì mở các cổng này ra:

sudo firewall-cmd --add-service=http 
sudo firewall-cmd --add-service=https 
sudo firewall-cmd --runtime-to-permanent 

Nếu bạn có một firewall iptables đang hoạt động thì những lệnh cần chạy phụ thuộc khá nhiều vào quy định mà bạn cài đặt. Một cách cài đặt căn bản là  thêm công cụ truy cập HTTP và HTTPS:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT 

Giờ thì ta đã có thể chạy Certbot và lấy chứng chỉ rồi.

 

Bước 4 - Lấy chứng chỉ Certificate

Certbot cung cấp rất nhiều cách lấy chứng chỉ SSL thông qua nhiều plugins khác nhau. Plugin  Nginx sẽ đảm nhiệm chức năng định cấu hình Nginx cũng như tải lại cấu hình khi cần thiết:

sudo certbot --nginx -d example.com -d www.example.com

Chạy  certbot với --nginx plugin sử dụng -d  để xác định tên mà chúng ta muốn chứng chỉ có hiệu lực ở miền đó:

Nếu lần đầu chạy certbot thì bạn sẽ bị yêu cầu nhập email và đồng ý tuân thủ những quy định của phần mềm từ nhà cung cấp. Sau khi xong thì certbot sẽ kết nối với Let's Encrypt server rồi chạy thêm một bước nữa để xác minh rằng bạn đang quản lý tên miền mà bạn yêu cầu cấp chứng chỉ.

Nếu thành công thì certbot sẽ hỏi bạn muốn cài đặt HTTPS như thế nào:

Output
Please choose whether HTTPS access is required or optional. ------------------------------------------------------------------------------- 1: Easy - Allow both HTTP and HTTPS access to these sites 2: Secure - Make all requests redirect to secure HTTPS access ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

Lựa chọn sau đó nhấn ENTER. Cấu hình sẽ được update và Nginx sẽ được tải lại để lưu thay đổi mới.   certbot  sẽ phản hồi tin nhắn rằng quá trình cài đặt đã hoàn thành cùng vị trí chứng chỉ được lưu:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-10-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 

Chứng chỉ được download , được cài đặt và tải. Khi muốn tải lại website  https://  nên chú ý ký hiệu bảo mật của trình duyệt. Với trình duyệt an toàn sẽ xuất hiện icon khóa màu xanh.

 

Bước 5 - Update thông số Diffie-Hellman 

Để kiểm tra máy chủ thì cần sử dụng tính năng SSL Labs Server Test , thường thì kết quả chỉ ở mức độ B do thông số Diffie-Hellman khá yếu. Điều này ảnh hưởng tới khóa trao đổi giữa máy chủ và người dùng. Để khắc phục vấn đề thì chúng ta có thể tạo một file mới dhparam.pem  và thêm vào khối    server .

Tạo file mới sử dụng openssl:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 

Mất chừng một vài phút, khi xong thì mở file cấu hình nginx chứa khối server .Trong ví dụ này thì nó là file cấu hình mặc định:

sudo vi /etc/nginx/nginx.conf 

Dán những dòng dưới đây vào khối server đó:

/etc/nginx/nginx.conf
. . .
ssl_dhparam /etc/ssl/certs/dhparam.pem;

Lưu và thoát sau đó xác minh lại:

sudo nginx -t 

Nếu không có lỗi thì tải lại Nginx:

sudo systemctl reload nginx 

Site của bạn giờ đã được bảo mật hơn và sẽ lên mức độ A .

 

Bước 6 - Cài đặt tính năng tự động gia hạn

Chứng chỉ Let's Encrypt's chỉ có hiệu lực trong.Thế nên ta cần tự động gia hạn chứng chỉ đó bằng cách sử dụng một lệnh nào đó để kiểm tra khi chứng chỉ hết hạn và tự động gia hạn chứng chỉ đó.

Để kiểm tra hằng ngày thì sử dụng command cron, một chương trình hệ thống chuẩn hoạt động theo chu kỳ. Ta sẽ thông báo lệnh cho cron bằng cách mở và sửa file crontab.

sudo crontab -e 

Khi bạn mở thì file Crontab mặc định là một file trống thế nên bạn cần dán những dòng dưới đây vào file đó. Sau đó lưu và đóng file.

crontab
. . .
15 3 * * * /usr/bin/certbot renew --quiet

Phần 15 3 * * * có nghĩa là "chạy lệnh lúc 3: 15 AM hàng ngày". Bạn có thể thay đổi.

Lệnh renew dành cho Certbot sẽ kiểm tra tất cả các chứng chỉ có trên hệ thống và tự động update khi thời hạn của chúng chỉ còn dưới 30 ngày. --quiet thông báo Certbot để không xuất thông tin ra ngoài hoặc đợi người dùng nhập thông tin vào.

cron sẽ thực hiện lệnh này hằng ngày. Tất cả các chứng chỉ sẽ tự động được gia hạn và tải lại khi thời hạn chỉ còn dưới 30 ngày trước khi hết hạn.

 

 

Kết luận

Trong phần này chúng ta đã cài đặt Let's Encrypt client certbot, Tải chứng chỉ SSL cho tên miền và định cấu hình Nginx để sử dụng chứng chỉ đó cũng như cài đặt tính năng tự động gia hạn chứng chỉ.