Hướng dẫn này sẽ chỉ cho bạn cách cài đặt và bảo mật máy chủ web Nginx trên Debian 9 với chứng chỉ TLS do Let’s Encrypt Certificate Authority cấp miễn phí. Hơn nữa, chúng tôi sẽ cấu hình gia hạn tự động chứng chỉ Let’s Encrypt TLS bằng cách sử dụng cron job trước khi chứng chỉ hết hạn.
TLS, còn được gọi là Transport Layer Security, là một giao thức mạng sử dụng chứng chỉ SSL để mã hóa lưu lượng mạng chảy giữa máy chủ và máy khách hoặc giữa máy chủ web, chẳng hạn như máy chủ Nginx và trình duyệt. Mọi dữ liệu được trao đổi giữa hai thực thể này đều được bảo mật và kết nối không thể bị giải mã ngay cả khi bị chặn bằng một kỹ thuật như tấn công man in the middle hoặc packet sniffing. Phần mềm gói certbot là tiện ích máy khách chính thức do Let’s Encrypt CA cung cấp, có thể được sử dụng trong quá trình tạo và tải xuống chứng chỉ Let’s Encrypt miễn phí trong Debian.
Yêu cầu
Tiện ích apt của Debian, là giao diện dòng lệnh của Trình quản lý gói chính của Debian, sẽ hỏi bạn, sau một số lần kiểm tra sơ bộ, xem bạn có đồng ý tiếp tục cài đặt gói certbot và tất cả các gói phụ thuộc bắt buộc của gói này hay không. Để chấp nhận quy trình cài đặt phần mềm, hãy trả lời có
trong lời nhắc của bảng điều khiển máy chủ.
Nếu máy chủ chưa chạy, hãy khởi động daemon Nginx bằng lệnh bên dưới.
Trong trường hợp bạn đã cài đặt tường lửa phổ biến trong Debian, chẳng hạn như tường lửa UFW, chặn mọi kết nối đến trên cổng 80 và 443, hãy đưa ra các lệnh bên dưới để mở cổng HTTP và HTTPS trong hệ thống.
Để lấy chứng chỉ cho tên miền của bạn, hãy thực hiện lệnh cerbot trong bảng điều khiển với các tham số và cờ sau như giải thích bên dưới. Chạy lệnh với quyền root và cung cấp tên miền của bạn và tất cả các tên miền phụ khác mà bạn muốn lấy chứng chỉ bằng cách sử dụng cờ –d. Ngoài ra, hãy cung cấp tùy chọn --standalone để certbot không can thiệp vào các tệp cấu hình Nginx. Máy chủ Nginx phải được dừng trong khi cấp chứng chỉ bằng tùy chọn này.
Cú pháp lệnh cerbot:
Khi bạn chạy lệnh certbot lần đầu tiên và lấy chứng chỉ, bạn sẽ được nhắc thêm địa chỉ email của mình và đồng ý với các điều khoản dịch vụ của Let's Encrypt. Viết 'a' để đồng ý với các điều khoản dịch vụ 'no' để không chia sẻ địa chỉ email của bạn với các đối tác của Let's Encrypt. Cuối cùng, sau khi bạn đã có được chứng chỉ cho tên miền của mình, hãy đọc các ghi chú ở phần chân trang để xác định đường dẫn hệ thống chứng chỉ và ngày hết hạn của chúng.
Tùy chọn--webrotcho cerbot cũng sẽ yêu cầu bạn thêm địa chỉ email của mình để gia hạn chứng chỉ và thông báo bảo mật.Máy khách Certbotcó mã tích hợp có thể phát hiện địa chỉ email giả. Bạn phải cung cấp địa chỉ email công khai để tiếp tục nhận chứng chỉ.
Mẫu tệp
/etc/nginx/sites-enabled/default-ssl:
Các dòng mã để xử lý tập lệnh PHP thông qua FastCGI Process Manager cũng có thể được tìm thấy trong đoạn trích này và được biểu thị bằng các dòng sau.
Để cài đặt chứng chỉ Let’s Encrypt trong tệp cấu hình TLS của máy chủ web Nginx, hãy mở tệp default-ssl của Nginx và cập nhật các dòng bên dưới để phản ánh đường dẫn tệp chứng chỉ Let’s Encrypt cho miền của bạn, như được hiển thị trong đoạn trích bên dưới.
Thay đổi các dòng sau như sau:
Ngoài ra, nếu câu lệnh ssl_dhparam có trong cấu hình Nginx SSL, bạn phải tạo khóa Diffie–Hellman 2048 bit mới bằng cách phát hành lệnh sau. Việc tạo tham số khóa Diffie–Hellman có thể mất một thời gian tùy thuộc vào tính ngẫu nhiên hoặc entropy của hệ thống.
Cuối cùng, trước khi kích hoạt cấu hình Nginx TLS bằng cách khởi động lại daemon Nginx để phản ánh các thay đổi, trước tiên hãy kiểm tra cấu hình Nginx để tìm lỗi cú pháp tiềm ẩn. Sau đó, nếu thử nghiệm tệp cấu hình Nginx thành công, hãy khởi động lại daemon Nginx để tải cấu hình mới cùng với chứng chỉ Let’s Encrypt bằng cách phát hành các lệnh bên dưới.
Để xác minh xem dịch vụ nginx có sở hữu một socket đã mở ở trạng thái lắng nghe trên cổng 443 hay không, hãy thực hiện lệnh netstat như được hiển thị trong đoạn trích bên dưới.
Bạn cũng nên mở trình duyệt và điều hướng đến tên miền của mình thông qua giao thức HTTPS. Nếu chứng chỉ Let’s Encrypt được áp dụng thành công trong Nginx, quá trình bắt tay SSL sẽ hoạt động trơn tru mà không phát sinh bất kỳ lỗi nào.
Câu lệnh chuyển hướng sẽ trông giống như trong đoạn trích bên dưới.
Sau đó, khởi động lại trình nền Nginx để áp dụng thay đổi bằng cách đưa ra lệnh bên dưới.
Một tiện ích hữu ích khác trong việc tìm hiểu về chứng chỉ SSL là tiện ích dòng lệnh openssl. Để hiển thị thông tin bổ sung cho chứng chỉ Let’s Encrypt CA, hãy thực hiện lệnh bên dưới trong bảng điều khiển Linux.
Cron job để gia hạn chứng chỉ.
Vậy là xong! Để biết các cấu hình nâng cao khác liên quan đến chứng chỉ và tiện ích Let’s Encrypt, hãy truy cập tài liệu chính thức tại địa chỉ internet sau https://certbot.eff.org/docs/.
TLS, còn được gọi là Transport Layer Security, là một giao thức mạng sử dụng chứng chỉ SSL để mã hóa lưu lượng mạng chảy giữa máy chủ và máy khách hoặc giữa máy chủ web, chẳng hạn như máy chủ Nginx và trình duyệt. Mọi dữ liệu được trao đổi giữa hai thực thể này đều được bảo mật và kết nối không thể bị giải mã ngay cả khi bị chặn bằng một kỹ thuật như tấn công man in the middle hoặc packet sniffing. Phần mềm gói certbot là tiện ích máy khách chính thức do Let’s Encrypt CA cung cấp, có thể được sử dụng trong quá trình tạo và tải xuống chứng chỉ Let’s Encrypt miễn phí trong Debian.
Yêu cầu
- Cài đặt LEMP Stack trong Debian 9.
- Tên miền đã đăng ký công khai với bản ghi DNS phù hợp (bản ghi A hoặc bản ghi CNAME cho tên miền phụ).
- Truy cập trực tiếp vào bảng điều khiển của máy chủ hoặc truy cập SSH từ xa vào máy chủ.
- Tài khoản người dùng có quyền root hoặc quyền truy cập trực tiếp vào tài khoản root.
Cài đặt Certbot Client Utility
Để cài đặt tiện ích máy khách cerbot Let’s Encrypt trong Debian 9 từ kho lưu trữ chính thức của Debian, hãy mở thiết bị đầu cuối và đưa ra lệnh sau với quyền root, như minh họa trong ảnh chụp màn hình sau.
Mã:
apt-get install certbot
Tiện ích apt của Debian, là giao diện dòng lệnh của Trình quản lý gói chính của Debian, sẽ hỏi bạn, sau một số lần kiểm tra sơ bộ, xem bạn có đồng ý tiếp tục cài đặt gói certbot và tất cả các gói phụ thuộc bắt buộc của gói này hay không. Để chấp nhận quy trình cài đặt phần mềm, hãy trả lời có
Nhận chứng chỉ Let's Encrypt
Để tạo và tải xuống chứng chỉ Let's Encrypt cho một tên miền, trước tiên hãy đảm bảo máy chủ web Nginx đang hoạt động và ít nhất có thể truy cập được cổng 80 từ internet. Để xác minh xem Nginx có đang chạy hay không, hãy thực hiện các lệnh sau với quyền root.
Mã:
sudo systemctl status nginx
Mã:
sudo systemctl start nginx
Mã:
sudo ufw allow 80/tcp
Mã:
sudo ufw allow 443/tcp
Cú pháp lệnh cerbot:
Mã:
sudo certbot certonly --standalone –d yourdomain.com –d www.yourdomain.com
Cách thay thế để có được chứng chỉ SSL Let's Encrypt
Để có được chứng chỉ Let's Encrypt thông qua plugin "webroot", hãy sử dụng cú pháp bên dưới. Thêm thư mục gốc web Nginx, theo mặc định nằm trong đường dẫn hệ thống /var/www/html/, đồng thời phát lệnh certbot với các cờ --webroot và –w. Ngoài ra, hãy đảm bảo rằng Nginx có toàn quyền ghi vào thư mục gốc web để tạo thư mục /.well-known.Tùy chọn--webrotcho cerbot cũng sẽ yêu cầu bạn thêm địa chỉ email của mình để gia hạn chứng chỉ và thông báo bảo mật.Máy khách Certbotcó mã tích hợp có thể phát hiện địa chỉ email giả. Bạn phải cung cấp địa chỉ email công khai để tiếp tục nhận chứng chỉ.
Mã:
certbot certonly --webroot –w /var/www/html/ -d yourdomain.com –d [URL=http://www.yourdomain.com?utm_source=diendancongnghe.com]www.yourdomain.com[/URL]
Mã:
[I]Đang lưu nhật ký gỡ lỗi vào /var/log/letsencrypt/letsencrypt.log[/I]
Mã:
[I]Nhập địa chỉ email (dùng để gia hạn khẩn cấp và thông báo bảo mật) (Nhập 'c' để[/I]
Mã:
[I]hủy):[emailprotected] #[B]Một địa chỉ email giả sẽ được phát hiện[/b][/I]
Mã:
[B][I]Có vẻ như có vấn đề với địa chỉ đó[/I][/b][I]. Nhập địa chỉ email (dùng cho[/I]
Mã:
[I]thông báo bảo mật và gia hạn khẩn cấp) Nếu bạn thực sự muốn bỏ qua bước này, bạn có thể[/I]
Mã:
[I]chạy ứng dụng khách với --register-unsafely-without-email nhưng hãy đảm bảo rằng sau đó[/I]
Mã:
[I]sao lưu khóa tài khoản của bạn từ /etc/letsencrypt/accounts (Nhập 'c' để hủy):[emailprotected][/I]
Mã:
[I][/I]
Mã:
[I]----------------------------------------------------------------------------------[/I]
Mã:
[I]Vui lòng đọc Điều khoản dịch vụ tại[/I]
Mã:
[I]https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. Bạn phải đồng ý[/I]
Mã:
[I]để có thể đăng ký với máy chủ ACME tại[/I]
Mã:
[I]https://acme-v01.api.letsencrypt.org/directory[/I]
Mã:
[I]----------------------------------------------------------------------------------[/I]
Mã:
[I](Đồng ý/(Hủy bỏ): [B]một[/b][/I]
Mã:
[I][/I]
Mã:
[I]----------------------------------------------------------------------------------[/I]
Mã:
[I]Bạn có đồng ý chia sẻ địa chỉ email của mình với Electronic Frontier[/I]
Mã:
[I]Foundation, đối tác sáng lập của dự án Let's Encrypt và là[/I]
Mã:
[I]tổ chức phi lợi nhuận phát triển Certbot không? Chúng tôi muốn gửi cho bạn email về EFF và[/I]
Mã:
[I]công việc của chúng tôi trong việc mã hóa web, bảo vệ người dùng và bảo vệ các quyền kỹ thuật số.[/I]
Mã:
[I]---------------------------------------------------------------------------------[/I]
Mã:
[I](C)es/(K)o: [B]n[/b][/I]
Mã:
[I]Nhận chứng chỉ mới[/I]
Mã:
[I]Thực hiện các thử thách sau:[/I]
Mã:
[I]Thử thách http-01 cho www.domain.com[/I]
Mã:
[I]Sử dụng đường dẫn gốc web /var/www/html/ cho tất cả các miền không khớp.[/I]
Mã:
[I]Đang chờ xác minh...[/I]
Mã:
[I]Dọn dẹp các thử thách[/I]
Mã:
[I][/I]
Mã:
[I]LƯU Ý QUAN TRỌNG:[/I]
Mã:
[I]- Xin chúc mừng! Chứng chỉ và chuỗi của bạn đã được lưu tại[/I]
Mã:
[I] /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Chứng chỉ[/I]
Mã:
[I] của bạn sẽ hết hạn vào ngày 28-12-2017. Để có phiên bản mới hoặc đã chỉnh sửa[/I]
Mã:
[I] của chứng chỉ này trong tương lai, chỉ cần chạy lại certbot. Để[/I]
Mã:
[I] gia hạn không tương tác *tất cả* các chứng chỉ của bạn, hãy chạy "certbot[/I]
Mã:
[I] gia hạn"[/I]
Mã:
[I]- Thông tin đăng nhập tài khoản của bạn đã được lưu trong thư mục cấu hình Certbot[/I]
Mã:
[I] của bạn tại /etc/letsencrypt. Bạn nên[/I]
Mã:
[I] sao lưu an toàn thư mục này ngay bây giờ. Thư mục cấu hình này[/I]
Mã:
[I] cũng sẽ chứa các chứng chỉ và khóa riêng tư được[/I]
Mã:
[I] thu được bởi Certbot nên việc sao lưu thường xuyên thư mục này là lý tưởng.[/I]
Mã:
[I]- Nếu bạn thích Certbot, vui lòng cân nhắc hỗ trợ công việc của chúng tôi bằng cách:[/I]
Mã:
[I][/I]
Mã:
[I] Quyên góp cho ISRG / Let's Encrypt: https://letsencrypt.org/donate[/I]
Mã:
[I] Quyên góp cho EFF: [/I][URL=https://eff.org/donate-le?utm_source=diendancongnghe.com][I]https://eff.org/donate-le[/I][/URL]
Cấu hình Nginx cho TLS (SSL)
Tệp cấu hình TLS mặc định đầy đủ của Nginx cho một miền sẽ trông giống như trong đoạn trích tệp bên dưới.Mẫu tệp
/etc/nginx/sites-enabled/default-ssl:
Mã:
[I] máy chủ {
[/I][I] listen 443 ssl default_server;
[/I][I] listen [::]:443 ssl default_server;
[/I][I]
[/I][I] server_name www.yourdomain.com yourdomain.com;
[/I][I] #server_name _;
[/I][I]
[/I][I]root /var/www/html;
[/I][I]
[/I][I] access_log /var/log/nginx/access.log;
[/I][I] error_log /var/log/nginx/error.log;
[/I][I]
[/I][I] #SSL Chứng chỉ
[/I][I] ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
[/I][I] khóa_certificate ssl "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
[/I][I] ssl_dhparam /etc/nginx/dhparam.pem;
[/I][I]
[/I][I] giao thức ssl TLSv1 TLSv1.1 TLSv1.2;
[/I][I] #mã_mã_ssl EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
[/I][I]
[/I][I] bộ đệm_phiên_phiên_phiên đã chia sẻ:SSL:1 phút;
[/I][I] ssl_session_timeout 10 phút;
[/I][I] ssl_ciphers HIGH:!aNULL:!MD5;
[/I][I] ssl_prefer_server_ciphers bật;
[/I][I]
[/I][I] add_header Strict-Transport-Security "max-age=31536000;
[/I][I] #includeSubDomains" luôn luôn;
[/I][I]
[/I][I] vị trí / {
[/I][I] index index.php index.html index.htm;
[/I][I] try_files $uri $uri/ /index.php?$args $uri/ =404;
[/I][I]
[/I][I]
[/I][I]
[/I][I] đặt $cache_uri $request_uri;
[/I][I]
[/I][I] vị trí ~ /.well-known {
[/I][I] allow all;
[/I][I] >
[/I][I]
[/I][I] #
[/I][I] # # Với php-fpm (hoặc các ổ cắm unix khác):
[/I][I] fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
[/I][I] # # Với php-cgi (hoặc các socket tcp khác):
[/I][I] # fastcgi_pass 127.0.0.1:9000;
[/I][I] >
[/I][I]
# từ chối quyền truy cập vào các tệp .htaccess, nếu root tài liệu của Apache
[/I][I] # đồng tình với nginx's one
[/I][I] #
[/I][I] #location ~ /\.ht {
[/I][I] # deny all;
[/I][I] #}
[/I][I]
[/I][I] }[/I]
Mã:
[I]location ~ \.php$ {
[/I][I] include snippets/fastcgi-php.conf;
[/I][I]fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
[/I][I] }
[/I]
Cài đặt chứng chỉ Let’s Encrypt trong Nginx
Chứng chỉ và khóa Let’s Encrypt được lưu trữ trong thư mục /etc/letsencrypt/live/www.yourdomain.com/ trong Debian. Lệnh ls đối với thư mục trên sẽ hiển thị tất cả các thành phần chứng chỉ, chẳng hạn như tệp chuỗi, tệp fullchain, khóa riêng và tệp chứng chỉ.
Mã:
ls /etc/letsencrypt/live/www.yourdomain.com/
Mã:
nano /etc/nginx/sites-enabled/default-ssl
Mã:
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem ";
ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com /privkey.pem";
Ngoài ra, nếu câu lệnh ssl_dhparam có trong cấu hình Nginx SSL, bạn phải tạo khóa Diffie–Hellman 2048 bit mới bằng cách phát hành lệnh sau. Việc tạo tham số khóa Diffie–Hellman có thể mất một thời gian tùy thuộc vào tính ngẫu nhiên hoặc entropy của hệ thống.
Mã:
openssl dhparam –out /etc/nginx/dhparam.pem 2048
Mã:
nginx -t
Mã:
service nginx restart
Để xác minh xem dịch vụ nginx có sở hữu một socket đã mở ở trạng thái lắng nghe trên cổng 443 hay không, hãy thực hiện lệnh netstat như được hiển thị trong đoạn trích bên dưới.
Mã:
netstat –tulpn | grep -e 443 -e LISTEN
Buộc lưu lượng truy cập web sang HTTPS
Để buộc khách truy cập tên miền của bạn chỉ duyệt trang web của bạn qua giao thức HTTPS, hãy mở tệp cấu hình mặc định Nginx sites-enabled và thêm dòng sau, buộc tất cả các yêu cầu truy cập cổng 80 phải được chuyển hướng với mã trạng thái 301 (đã di chuyển vĩnh viễn) đến cổng 443.
Mã:
nano /etc/nginx/sites-enabled/default
Mã:
[I]server_name [URL=http://www.yourdomain.com?utm_source=diendancongnghe.com]www.yourdomain.com[/URL] yourdomain.com;
[/I][I]return 301 https://$server_name$request_uri;[/I]
Sau đó, khởi động lại trình nền Nginx để áp dụng thay đổi bằng cách đưa ra lệnh bên dưới.
Mã:
service nginx restart
Kiểm tra cuối cùng
Để tìm hiểu thêm về các chứng chỉ do Let’s Encrypt CA tạo ra, bạn có thể sử dụng trình duyệt web hiện đại, chẳng hạn như Chrome. Truy cập miền của bạn từ trình duyệt Chrome và nhấn phím chức năng F12 để mở Công cụ dành cho nhà phát triển. Điều hướng đến tab Bảo mật và nhấn vào nút Xem chứng chỉ để mở chứng chỉ, như được hiển thị trong các ảnh chụp màn hình sau.Một tiện ích hữu ích khác trong việc tìm hiểu về chứng chỉ SSL là tiện ích dòng lệnh openssl. Để hiển thị thông tin bổ sung cho chứng chỉ Let’s Encrypt CA, hãy thực hiện lệnh bên dưới trong bảng điều khiển Linux.
Mã:
openssl s_client –connect [URL=http://www.yourdomain.com?utm_source=diendancongnghe.com]www.yourdomain.com:443[/URL]
Tự động gia hạn chứng chỉ Let’s Encrypt
Để tự động gia hạn chứng chỉ do Let’s Encrypt CA cấp trước ngày hết hạn, hãy lên lịch chạy tác vụ crontab một lần một ngày vào lúc 2:00 sáng bằng cách đưa ra lệnh sau. Đầu ra của cron job đã thực thi sẽ được chuyển hướng đến một tệp nhật ký, được lưu trữ trong /var/log/letsencrypt.log
Mã:
crontab –e
Mã:
[B]0 2 * * *[/b][B] certbot renew >> /var/log/letsencrypt.log[/b]