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

2 năm trước

Giới thiệu

Let's Encrypt là một Cơ quan Chứng nhận Mới cung cấp một cách dễ dàng để cài đặt các chứng chỉ TLS / SSL miễn phí, qua đó cho phép HTTPS được mã hóa trên máy chủ web. Nó đơn giản hóa quá trình bằng cách cung cấp một phần mềm khách hàng, Certbot, cái mà cố gắng để tự động hóa hầu hết (nếu không phải tất cả) các bước cần thiết. Hiện tại, toàn bộ quá trình lấy và cài đặt chứng chỉ được tự động hoàn toàn trên cả máy chủ web Apache và Nginx

Trong bài viết này chúng ta sẽ hướng dẫn cho bạn cách sử dụng certbot, client Let's Encrypt để sở hữu chứng chỉ SSL miễn phí và sử dụng nó với Nginx trên CentOS 7. Đồng thời chúng tôi cũng chỉ cho bạn cách tự động làm mới chứng chỉ SSL.

 

Điều kiện cần

Trước khi làm theo bài hướng dẫn này , bạn sẽ cần một vài thứ:

  • Một server CentOS 7 với người dùng sudo không root.
  • Bạn phải sở hữu hoặc kiểm soát một tên miền đã đăng kí mà bạn muốn dùng chứng chỉ. Nếu bạn chưa đăng kí tên miền thì bạn có thể đăng kí một cái cùng với một trong nhiều tên miền bên ngoài( ví dụ như Namecheap, GoDaddy vv).
  • Một bản ghi DNS chỉ tên miền của bạn tới IP công cộng của server bạn. Điều này là cần thiết vì  Let's Encrypt xác nhận rằng bạn sở hữu miền mà nó đang cấp chứng chỉ cho. Ví dụ: nếu bạn muốn lấy giấy chứng nhận cho example.com, tên miền đó phải giải quyết đến máy chủ của bạn để quy trình xác nhận hoạt động. Thiết lập của chúng tôi sẽ sử dụng example.comexample.com như tên miền, vì vậy cả hai bản ghi DNS đều được yêu cầu

Khi bạn đã có tất cả những điều kiện cần trên thì chúng ta sẽ bắt đầu cài đặt Let's Encrypt

 

Bước 1 — Cài đặt Certbot Let's Encrypt Client

Bước đầu tiên là dùng Let's Encrypt để sở hữu chứng chỉ SSL là cài đặt software certbot trên server của bạn. Hiện tại thì cách tốt nhất để cài đặt là thông qua kho EPEL.

Kích hoạt truy cập đến kho EPEL trên server của bạn bằng cách gõ:

$ sudo yum install epel-release 

Khi kho đã được kích hoạt bạn có thể sở hữu gói certbot-nginx bằng cách gõ:

$ sudo yum install certbot-nginx 

certbot Let's Encrypt client bây giờ đã được cài đặt và sẵn sàng để sử dụng.

 

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

Nếu bạn vẫn chưa cài đặt Nginx thì bạn có thể làm như sau. Kho EPEL nên được mở từ phần trước nên bạn có thể cài đặt Nginx bằng cách gõ:

$ sudo yum install nginx 

Sau đó bắt đầu Nginx sử dụng systemctl:

$ sudo systemctl start nginx 

Certbot có thể tự động cấu hình SSL cho Nginx, nhưng nó cần để có thể tìm đúng khối server trong cấu hình của bạn. Nó thực hiện việc này bằng cách tìm kiếm một chỉ thị server_name phù hợp với tên miền bạn đang yêu cầu cấp chứng chỉ. Nếu bạn đang tìm với một cài đặt Nginx tươi, bạn có thể cập nhật tập tin cấu hình mặc định:

$ sudo vi /etc/nginx/nginx.conf 

Tìm dòng server_name:

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

Thay thế  dấu gạch dưới _với tên miền của bạn:

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

Lưu file và thoát trình chỉnh sửa văn bản. Xác minh cú pháp của những chỉnh sửa cấu hình của bạn với:

$ sudo nginx -t 

Nếu nó chạy mà không có lỗi, load lại Nginx để load cấu hình mới:

$ sudo systemctl reload nginx 

Bây giờ Certbot có thể tìm khối  server chính xác và update nó. Bây giờ chúng ta sẽ update tường lửa để cho phép lưu lượng truy cập HTTPS.

 

Bước 3 — Update tường lửa

Nếu bạn đã mở tường lửa, chắc chắn rằng cổng 80 và 443 đang mở cho lưu lượng truy cập đang tới. Nếu bạn không chạy tường lửa thì bạn có thể bỏ qua.

Nếu bạn đang chạy tường lửa thì bạn có thể mở những cổng sau bằng cách gõ: 

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

Nếu có một tường lửa iptables đang chạy, các lệnh bạn cần chạy phụ thuộc rất nhiều vào bộ quy tắc hiện tại của bạn. Đối với bộ quy tắc cơ bản, bạn có thể thêm quyền truy cập HTTP và HTTPS bằng cách nhập

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

Bây giờ bạn đã sẵn sàng chạy Certbot và lấy chứng chỉ của bạn.

 

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

Certbot cung cấp rất nhiều cách lấy chứng chỉ SSL thông qua nhiều plugin. Nginx plugin sẽ phụ trách việc cấu hình lại Nginx và load lại cấu hình bất cứ khi nào cần thiết:

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

Nó sẽ chạy certbot với plugin --nginx, sử dụng -d để xác định tên hợp lệ của chứng chỉ.

Nếu đây là lần đầu tiên bạn chạy certbot, bạn sẽ được nhắc nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi làm như vậy, certbot sẽ liên lạc với máy chủ Let's Encrypt, sau đó chạy thử thách để xác minh rằng bạn kiểm soát tên miền mà bạn đang yêu cầu cấp chứng chỉ

Nếu thành công, certbot sẽ hỏi bạn sẽ cấu hình 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): 

Chọn cái bạn muốn rồi sau đó nhấn ENTER. Cấu hình sẽ được update và Nginx sẽ load để tiếp nhận các cài đặt mới. certbot sẽ bao gồm một tin nhắn báo cho bạn là quy trình đã thành công và nơi lưu trữ chứng chỉ của bạn:

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ủa bạn được tải xuống, cài đặt và nạp. Hãy thử tải lại trang web của bạn bằng cách sử dụng https:// và chú ý đến chỉ báo bảo mật của trình duyệt của bạn. Nó phải đại diện cho rằng trang web được đảm bảo đúng, thường có biểu tượng khóa màu xanh lá cây.

 

Bước 5 — Update tham số Diffie-Hellman

Nếu bạn kiểm tra máy chủ của mình bây giờ, nó sẽ chỉ nhận được  B do thông số Diffie-Hellman yếu. Điều này ảnh hưởng đến tính bảo mật của việc trao đổi khóa ban đầu giữa máy chủ của chúng tôi và người dùng của nó. Chúng tôi có thể khắc phục sự cố này bằng cách tạo tệp tin dhparam.pem mới và thêm nó vào khối server của chúng tôi.

Tạo file sử dụng openssl:

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

Điều này sẽ mất một vài phút. Khi xong, mở file cấu hình Nginx chứa khối server của bạn.Trong ví dụ này thì nó là file cấu hình mặc định:

$ sudo vi /etc/nginx/nginx.conf 

Dán dòng sau ở bất cứ đâu trong khối  server:

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

Lưu file và thoát trình chỉnh sửa văn bản của bạn sau đó xác mình cấu hình:

$ sudo nginx -t 

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

$ sudo systemctl reload nginx 

Trang của bạn đã an toàn hơn và bây giờ nên được nhận điểm A.

 

Bước 6 — Cài đặt tự động làm mới

Giấy chứng nhận của Encrypt chỉ có giá trị trong 90 ngày. Đây là để khuyến khích người dùng tự động hóa quá trình gia hạn chứng chỉ của họ. Chúng tôi sẽ cần phải thiết lập một lệnh chạy thường xuyên để kiểm tra giấy phép hết hạn và tự động gia hạn chúng.

Để chạy kiểm tra gia hạn hàng ngày, chúng tôi sẽ sử dụng cron, một dịch vụ hệ thống tiêu chuẩn để chạy các công việc định kỳ. Chúng ta bảo cron phải làm gì bằng cách mở và chỉnh sửa một tệp tin được gọi làcrontab

$ sudo crontab -e 

Trình biên tập văn bản của bạn sẽ mở crontab mặc định là một tập tin văn bản rỗng vào thời điểm này. Dán vào dòng sau, sau đó lưu và đóng nó:

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

Phần 15 3 * * * của dòng này nghĩa là " chạy command sau vào lúc 3:15 sáng mỗi ngày". Bạn có thể chọn bất cứ thời gian nào.

Command renew cho sẽ kiểm tra tất cả chứng chỉ được cài đặt trên hệ thống và update bất cứ thiết lập nào đã hết hạn ít nhất 30 ngày. --quiet bảo Certbot không được suất ra thông tin hoặc là đợi để người dùng nhập thông tin vào.

cron sẽ chạy command này hàng ngày. Tất cả chứng chỉ được cài đặt sẽ được tự động gia hạn và load lại khi chúng còn 30 ngày hoặc ít hơn trước khi chúng hết hạn.

Kết luận

Trong hướng dẫn này, chúng tôi đã cài đặt certbot của Let's Encrypt, download các chứng chỉ SSL cho miền của chúng ta, cấu hình Nginx để sử dụng các chứng chỉ này và thiết lập gia hạn chứng chỉ tự động. Nếu bạn có thêm câu hỏi về việc sử dụng Certbot, tài liệu của họ là một nơi tốt để bắt đầu