TLS (Transport Layer Security) và tiền thân của nó, SSL (Secure Sockets Layer), là những giao thức bảo mật được thiết kế để mã hóa dữ liệu truyền qua internet, giúp bảo vệ thông tin khỏi các cuộc tấn công đánh cắp hoặc nghe lén.
Bằng cách sử dụng TLS/SSL, máy chủ có thể thiết lập các kết nối an toàn với máy khách, đảm bảo rằng dữ liệu được truyền đi không bị giả mạo hay truy cập trái phép. Ngoài ra, hệ thống chứng chỉ số giúp xác thực danh tính của các trang web, giúp người dùng nhận biết họ đang truy cập vào các nền tảng đáng tin cậy, tránh nguy cơ bị tấn công giả mạo.
DataOnline sẽ hướng dẫn bạn thiết lập một chứng chỉ SSL tự ký để sử dụng với máy chủ web Nginx trên Ubuntu 18.04.
Lưu ý: Một chứng chỉ tự ký sẽ mã hóa liên lạc giữa máy chủ của bạn và bất kỳ máy khách nào. Tuy nhiên, vì chứng chỉ này không được ký bởi bất kỳ Cơ quan Chứng thực (CA) đáng tin cậy nào được tích hợp sẵn trong các trình duyệt web, nên người dùng sẽ không thể tự động xác thực danh tính của máy chủ bạn.
Việc bảo mật website ngày càng quan trọng, đặc biệt khi sử dụng VPS Việt Nam. Tạo chứng chỉ SSL tự ký trên Nginx giúp tăng cường an toàn mà không tốn chi phí. Với VPS Việt Nam, bạn dễ dàng triển khai các giải pháp bảo mật hiệu quả, đảm bảo website hoạt động mượt mà.
Chứng chỉ tự ký có thể phù hợp nếu bạn không có tên miền liên kết với máy chủ hoặc trong các trường hợp giao diện web mã hóa không hướng tới người dùng cuối. Nếu bạn có tên miền, trong nhiều trường hợp tốt hơn là nên sử dụng chứng chỉ được CA ký. Bạn có thể tìm hiểu cách cài đặt chứng chỉ miễn phí từ dự án Let’s Encrypt tại đây.
Yêu cầu
Để theo dõi hướng dẫn này, bạn cần:
● Một máy chủ Ubuntu 18.04 đã được thiết lập với một tài khoản không phải root, được cấp quyền sudo và đã cấu hình tường lửa. Bạn có thể tìm hiểu cách tạo tài khoản người dùng này theo hướng dẫn Hướng dẫn Thiết Lập Máy Chủ Ubuntu 18.04 .
● Bạn cũng cần cài đặt sẵn máy chủ web Nginx. Nếu bạn muốn cài đặt toàn bộ bộ LEMP (Linux, Nginx, MySQL, PHP) trên máy chủ, hãy theo dõi hướng dẫn Thiết lập LEMP trên Ubuntu 18.04.
● Nếu bạn chỉ cần máy chủ Nginx, hãy tham khảo hướng dẫn Cách cài đặt Nginx trên Ubuntu 18.04.
Khi đã hoàn thành các yêu cầu trên, hãy tiếp tục đến bước đầu tiên.
Bước 1 – Tạo chứng chỉ SSL
TLS/SSL hoạt động dựa trên sự kết hợp của chứng chỉ công khai và Private Key. Private Key được giữ bí mật trên máy chủ và dùng để mã hóa nội dung gửi đến máy khách. Chứng chỉ SSL được chia sẻ công khai với bất cứ ai yêu cầu nội dung, và có thể dùng để giải mã nội dung được ký bởi Private Key tương ứng.
Bạn có thể tạo một cặp Private Key và chứng chỉ tự ký bằng OpenSSL chỉ với một lệnh:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Dưới đây là phân tích chi tiết từng phần của lệnh:
● sudo
: Lệnh sudo cho phép thành viên của nhóm sudo
tạm thời nâng quyền lên tài khoản khác (mặc định là root). Điều này cần thiết vì chúng ta tạo chứng chỉ và Private Key trong thư mục /etc/
, chỉ có tài khoản root hoặc các tài khoản đặc quyền mới có thể truy cập.
● openssl
: Đây là công cụ dòng lệnh cơ bản để tạo và quản lý các chứng chỉ, key và các tập tin khác của OpenSSL.
● req
: Phần phụ lệnh này chỉ định rằng chúng ta muốn sử dụng quản lý yêu cầu ký chứng chỉ X.509 (CSR). X.509 là tiêu chuẩn hạ tầng khóa công khai mà SSL và TLS tuân theo trong việc quản lý key và chứng chỉ. Chúng ta muốn tạo một chứng chỉ X.509 mới, do đó sử dụng subcommand này.
● -x509
: Tùy chọn này bổ sung cho subcommand phía trên, báo cho OpenSSL biết rằng chúng ta muốn tạo chứng chỉ tự ký thay vì tạo một yêu cầu ký chứng chỉ như thông thường.
● -nodes
: Tùy chọn này yêu cầu OpenSSL bỏ qua bước bảo mật Private Key bằng passphrase. Chúng ta cần Nginx đọc tập tin này khi máy chủ khởi động mà không cần nhập mật khẩu, nên passphrase sẽ gây cản trở vì phải nhập sau mỗi lần khởi động.
● -days 365
: Tùy chọn này đặt thời gian chứng chỉ có hiệu lực, ở đây là 1 năm.
● –newkey rsa:2048
: Chỉ định rằng chúng ta muốn tạo một cặp Private Key và chứng chỉ mới cùng lúc. Vì trước đó chưa có Private Key để ký chứng chỉ, nên cần tạo nó ngay lúc này. Phần rsa:2048
báo cho OpenSSL tạo một Private Key kiểu RSA với độ dài 2048 bit.
● -keyout
: Chỉ định đường dẫn lưu tập tin Private Key vừa tạo.
● -out
: Chỉ định đường dẫn lưu chứng chỉ vừa tạo.
Như đã nói, các tùy chọn này sẽ tạo ra một tập tin key và một tập tin chứng chỉ. Sau khi chạy lệnh trên, bạn sẽ được yêu cầu trả lời một số câu hỏi liên quan đến thông tin của máy chủ để nhúng vào chứng chỉ.
Hãy điền thông tin vào các câu hỏi một cách phù hợp. Dòng quan trọng nhất là yêu cầu nhập “Common Name” (ví dụ: FQDN của máy chủ hoặc tên của bạn). Bạn cần nhập tên miền liên kết với máy chủ hoặc, thường thì, địa chỉ IP công khai của máy chủ.
Toàn bộ các yêu cầu nhập sẽ trông giống như sau:
Output Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:server_IP_address Email Address []:admin@your_domain.com
Cả hai tập tin bạn tạo sẽ được đặt vào các thư mục con thích hợp của thư mục /etc/ssl.
Trong khi sử dụng OpenSSL, bạn cũng nên tạo một nhóm Diffie-Hellman mạnh, dùng trong việc đàm phán Perfect Forward Secrecy với máy khách.
Bạn có thể làm điều này bằng cách chạy lệnh sau:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Lệnh trên sẽ mất một khoảng thời gian, nhưng khi hoàn thành, bạn sẽ có một nhóm DH mạnh tại /etc/nginx/dhparam.pem
được sử dụng trong cấu hình.
Bước 2 – Cấu hình Nginx sử dụng SSL
Sau khi các tập tin key và chứng chỉ dưới thư mục /etc/ssl
đã được tạo, bạn cần điều chỉnh cấu hình Nginx để sử dụng chúng.
Trước tiên, bạn sẽ tạo một đoạn cấu hình (configuration snippet) chứa thông tin về đường dẫn của tập tin Private Key và chứng chỉ. Sau đó, bạn sẽ tạo một đoạn cấu hình chứa các cài đặt SSL mạnh mẽ, có thể tái sử dụng cho bất kỳ chứng chỉ nào trong tương lai. Cuối cùng, bạn sẽ điều chỉnh các khối máy chủ (server block) của Nginx bằng cách sử dụng 2 đoạn cấu hình đã tạo để xử lý các yêu cầu SSL một cách phù hợp.
Phương pháp cấu hình Nginx theo cách này giúp bạn giữ cho các khối máy chủ luôn gọn gàng và đưa các phần cấu hình chung vào các module có thể tái sử dụng.
Tạo đoạn cấu hình trỏ đến Private Key và chứng chỉ SSL
Đầu tiên, hãy sử dụng trình soạn thảo văn bản ưa thích của bạn để tạo một đoạn cấu hình Nginx mới trong thư mục /etc/nginx/snippets
. Ví dụ dưới đây dùng nano
:
Để phân biệt rõ mục đích của tập tin này, hãy đặt tên là self-signed.conf
:
sudo nano /etc/nginx/snippets/self-signed.conf
Bên trong tập tin này, thiết lập directive ssl_certificate
trỏ đến tập tin chứng chỉ và ssl_certificate_key
trỏ đến Private Key tương ứng. Nội dung sẽ như sau:
/etc/nginx/snippets/self-signed.conf ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Lưu tập tin và thoát khỏi trình soạn thảo. Nếu bạn dùng nano
, nhấn CTRL + X
, sau đó Y
và ENTER
.
Tạo đoạn cấu hình với các cài đặt mã hóa mạnh
Tiếp theo, bạn sẽ tạo một đoạn cấu hình khác định nghĩa một số cài đặt SSL. Đoạn này sẽ thiết lập Nginx với bộ mã hóa (cipher suite) mạnh và kích hoạt một số tính năng nâng cao giúp bảo vệ máy chủ của bạn.
Các tham số bạn thiết lập có thể được tái sử dụng trong các cấu hình Nginx khác, do đó bạn có thể đặt tên tập tin một cách chung chung, ví dụ:
sudo nano /etc/nginx/snippets/ssl-params.conf
Để thiết lập SSL an toàn cho Nginx, chúng ta sẽ dựa theo khuyến nghị từ Cipherlist.eu.
Cipherlist.eu là một nguồn tài nguyên hữu ích và dễ hiểu giúp bạn nắm bắt các cài đặt mã hóa được sử dụng phổ biến trong phần mềm.
Lưu ý: Các cài đặt được đề xuất từ Cipherlist.eu đảm bảo an ninh mạnh mẽ. Đôi khi điều này có thể ảnh hưởng đến khả năng tương thích với một số máy khách cũ. Nếu cần hỗ trợ các máy khách cũ, có thể sử dụng danh sách thay thế được truy cập qua đường link trên trang có nhãn “Yes, give me a ciphersuite that works with legacy / old software.” Nếu cần, bạn có thể thay thế danh sách đó bằng nội dung của khối mã ví dụ dưới đây.
Việc lựa chọn cấu hình nào phụ thuộc chủ yếu vào nhu cầu hỗ trợ của bạn. Cả hai đều cung cấp sự bảo mật tuyệt vời.
Với mục đích của chúng ta, hãy sao chép toàn bộ các cài đặt dưới đây, nhưng trước tiên cần thực hiện một vài chỉnh sửa nhỏ.
Đầu tiên, thêm DNS resolver ưa thích cho các yêu cầu upstream. Trong hướng dẫn này, chúng ta sẽ sử dụng của Google (8.8.8.8
và 8.8.4.4
).
Thứ hai, chú thích dòng cài đặt header strict transport security. Trước khi bỏ chú thích dòng này, bạn nên đọc kỹ về HTTP Strict Transport Security (HSTS), đặc biệt là về chức năng “preload”. Preloading HSTS cung cấp bảo mật cao hơn nhưng cũng có thể gây ra hậu quả nghiêm trọng nếu vô tình kích hoạt hoặc cấu hình sai.
Thêm các nội dung sau vào tập tin ssl-params.conf
:
/etc/nginx/snippets/ssl-params.conf ssl_protocols TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ciphers EECDH+AESGCM:EDH+AESGCM; ssl_ecdh_curve secp384r1; ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Disable strict transport security for now. You can uncomment the following # line if you understand the implications. #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";
Vì bạn đang sử dụng chứng chỉ tự ký, nên SSL stapling sẽ không được sử dụng. Nginx sẽ đưa ra cảnh báo, vô hiệu hóa stapling cho chứng chỉ tự ký nhưng vẫn hoạt động đúng chức năng mã hóa kết nối.
Lưu và đóng tập tin sau khi hoàn tất chỉnh sửa.
Điều chỉnh cấu hình Nginx sử dụng SSL
Bây giờ bạn đã có các snippet, hãy điều chỉnh cấu hình Nginx để bật SSL.
Hướng dẫn này giả định rằng bạn đang sử dụng tập tin cấu hình server block tùy chỉnh trong thư mục /etc/nginx/sites-available
. Hướng dẫn cũng theo chuẩn từ bài “Initial Server Setup for Ubuntu 18.04” và sử dụng tập tin /etc/nginx/sites-available/your_domain
làm ví dụ. Hãy thay thế tên tập tin cấu hình theo thực tế.
Trước tiên, hãy sao lưu tập tin cấu hình hiện tại:
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak
Mở tập tin cấu hình để chỉnh sửa:
sudo nano /etc/nginx/sites-available/your_domain
Bên trong, khối server của bạn có thể bắt đầu như sau:
/etc/nginx/sites-available/your_domain.com server { listen 80; listen [::]:80; server_name your_domain www.your_domain.com; root /var/www/your_domain.com/html; index index.html index.htm index.nginx-debian.html; . . . }
Tập tin của bạn có thể sắp xếp khác, và thay vì các directive root
và index
có thể có các cấu hình location
, proxy_pass
hay các cài đặt tùy chỉnh khác. Điều này không sao, bạn chỉ cần cập nhật lại các directive listen
và chèn các snippet SSL vào.
Sau đó, cập nhật khối server hiện tại để phục vụ lưu lượng SSL trên cổng 443
và tạo thêm khối server mới để lắng nghe trên cổng 80 và tự động chuyển hướng (redirect) lưu lượng đến cổng 443
.
Lưu ý: Sử dụng chuyển hướng
302
cho đến khi bạn xác nhận mọi thứ hoạt động bình thường. Sau đó, chuyển sang chuyển hướng vĩnh viễn (301
).
Trong tập tin cấu hình hiện có, cập nhật hai câu lệnh listen để sử dụng cổng 443 và bật ssl, sau đó chèn hai tập tin snippet đã tạo:
/etc/nginx/sites-available/your_domain.com server { listen 443 ssl; listen [::]:443 ssl; include snippets/self-signed.conf; include snippets/ssl-params.conf; server_name your_domain.com www.your_domain.com; root /var/www/your_domain.com/html; index index.html index.htm index.nginx-debian.html; . . . }
Tiếp theo, thêm một khối server thứ hai vào tập tin cấu hình, sau dấu đóng ngoặc }
của khối đầu tiên:
/etc/nginx/sites-available/your_domain.com . . . server { listen 80; listen [::]:80; server_name your_domain.com www.your_domain.com; return 302 https://$server_name$request_uri; }
Đây là cấu hình cơ bản chỉ lắng nghe trên cổng 80 và thực hiện chuyển hướng đến HTTPS. Lưu và đóng tập tin sau khi chỉnh sửa xong.
Bước 3 – Điều chỉnh tường lửa
Nếu bạn đã kích hoạt tường lửa ufw như khuyến nghị trong các hướng dẫn trước, bạn cần điều chỉnh các cài đặt để cho phép lưu lượng SSL. May mắn thay, Nginx đã đăng ký một vài profile với ufw khi cài đặt.
Bạn có thể xem các profile hiện có bằng lệnh:
sudo ufw app list
Danh sách kết quả sẽ hiển thị như sau:
Output Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
Bạn cũng có thể kiểm tra trạng thái hiện tại bằng lệnh:
sudo ufw status
Lệnh này có thể trả về kết quả như sau, nghĩa là hiện tại chỉ cho phép lưu lượng HTTP đến máy chủ web:
Output Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
Để cho phép lưu lượng HTTPS, hãy cập nhật quyền cho profile “Nginx Full”:
sudo ufw allow 'Nginx Full'
Sau đó, xóa bỏ quyền của profile “Nginx HTTP” vì nó không cần thiết:
sudo ufw delete allow 'Nginx HTTP'
Kiểm tra lại trạng thái ufw:
sudo ufw status
Kết quả nên hiển thị như sau:
Output Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
Kết quả này xác nhận rằng các thay đổi cho tường lửa đã thành công và bạn đã sẵn sàng kích hoạt cấu hình Nginx mới.
Bước 4 – Kích hoạt cấu hình mới của Nginx
Sau khi đã điều chỉnh tường lửa và cấu hình, bạn cần khởi động lại Nginx để áp dụng các thay đổi.
Đầu tiên, kiểm tra xem có lỗi cú pháp nào trong các tập tin cấu hình không bằng lệnh:
sudo nginx -t
Nếu mọi thứ đều ổn, bạn sẽ thấy thông báo như sau:
Output nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt" nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Lưu ý cảnh báo ở đầu: như đã đề cập, cài đặt này tạo ra cảnh báo vì chứng chỉ tự ký không thể sử dụng SSL stapling. Điều này là bình thường và máy chủ vẫn mã hóa kết nối đúng cách.
Nếu cấu hình không có lỗi, hãy khởi động lại Nginx để áp dụng thay đổi:
sudo systemctl restart nginx
Bước 5 – Kiểm tra mã hóa
Bây giờ, bạn đã sẵn sàng kiểm tra máy chủ SSL.
Mở trình duyệt web và gõ vào thanh địa chỉ: https://
theo sau là tên miền hoặc địa chỉ IP công khai của máy chủ:
https://server_domain_or_IP
Tùy vào trình duyệt, bạn có thể nhận được cảnh báo vì chứng chỉ bạn tạo không được ký bởi một trong các Cơ quan Chứng thực đáng tin cậy của trình duyệt:
Điều này là bình thường vì chúng ta chỉ quan tâm đến khía cạnh mã hóa của chứng chỉ, không phải xác thực danh tính máy chủ qua bên thứ ba. Nhấp “ADVANCED” và sau đó nhấp vào liên kết cung cấp để tiếp tục truy cập máy chủ.
Tại thời điểm này, bạn sẽ được chuyển đến trang web của mình. Trong ví dụ này, biểu tượng ổ khóa trên thanh địa chỉ trình duyệt sẽ có dấu “x”, cho biết chứng chỉ không thể xác thực. Tuy nhiên, kết nối vẫn được mã hóa. Lưu ý rằng biểu tượng này có thể khác nhau tùy thuộc vào trình duyệt.
Nếu bạn đã cấu hình Nginx với 2 khối server, tự động chuyển hướng nội dung HTTP sang HTTPS, hãy kiểm tra chuyển hướng hoạt động đúng không bằng cách truy cập:
http://server_domain_or_IP
Nếu nhận được cùng biểu tượng, điều đó có nghĩa là chuyển hướng đã hoạt động đúng.
Bước 6 – Chuyển hướng sang chế độ vĩnh viễn
Nếu bạn đã xác nhận chuyển hướng hoạt động và muốn chỉ cho phép lưu lượng mã hóa, hãy chỉnh sửa cấu hình Nginx để chuyển hướng trở nên vĩnh viễn.
Mở lại tập tin cấu hình server block:
sudo nano /etc/nginx/sites-available/your_domain.com
Tìm dòng chứa return 302
và thay đổi thành return 301
:
/etc/nginx/sites-available/your_domain.com return 301 https://$server_name$request_uri;
Lưu và đóng tập tin.
Kiểm tra lại cấu hình cú pháp:
sudo nginx -t
Khi đã sẵn sàng, khởi động lại Nginx để áp dụng chuyển hướng vĩnh viễn:
sudo systemctl restart nginx
Sau khi khởi động lại, các thay đổi sẽ có hiệu lực và chuyển hướng của bạn đã trở thành vĩnh viễn.
Kết luận
Ngoài ra, bạn cũng có thể lựa chọn sử dụng chứng chỉ SSL tự ký hoặc sử dụng Let’s Encrypt – một Cơ quan Chứng thực cung cấp chứng chỉ TLS/SSL miễn phí, giúp bật HTTPS mã hóa cho máy chủ web. Tìm hiểu thêm qua hướng dẫn Cách bảo mật Nginx với Let’s Encrypt trên Ubuntu 18.04.