Hướng dẫn bảo mật Nginx với Let's Encrypt trên CentOS 7
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
:
server_name _;
Thay ký tự _
bằng tên miền của bạn:
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
đó:
. . .
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.
. . .
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ỉ.