TLS, hay transport layer security và SSL tiền thân của nó, viết tắt của secure sockets layer, là các giao thức web được sử dụng để bảo vệ và mã hóa lưu lượng truy cập qua mạng máy tính.
Với TLS/SSL, máy chủ có thể gửi lưu lượng một cách an toàn giữa máy chủ và máy khách mà không có khả năng tin nhắn bị chặn bởi các bên bên ngoài. Hệ thống chứng chỉ cũng hỗ trợ người dùng xác minh danh tính của các trang web mà họ đang kết nối.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách thiết lập chứng chỉ SSL tự ký để sử dụng với máy chủ web Nginx trên máy chủ Ubuntu 20.04.
Lưu ý: Chứng chỉ tự ký sẽ mã hóa giao tiếp giữa máy chủ của bạn và bất kỳ máy khách nào. Tuy nhiên, vì nó không được ký bởi bất kỳ cơ quan cấp chứng chỉ đáng tin cậy nào có trong trình duyệt web nên người dùng không thể sử dụng chứng chỉ để tự động xác thực danh tính máy chủ của bạn.
Chứng chỉ tự ký có thể phù hợp nếu bạn không có tên miền được liên kết với máy chủ của mình và trong trường hợp giao diện web được mã hóa không hướng tới người dùng. Nếu bạn có một tên miền, trong nhiều trường hợp, tốt hơn là sử dụng chứng chỉ do CA ký. Bạn có thể tìm hiểu cách thiết lập chứng chỉ đáng tin cậy miễn phí với dự án Let's Encrypt.
Trước khi bắt đầu, bạn nên cấu hình một non-root user với các đặc quyền sudo
và bật tường lửa. Bạn có thể tìm hiểu cách thiết lập tài khoản người dùng như vậy bằng cách làm theo thiết lập máy chủ ban đầu của chúng tôi cho Ubuntu 20.04.
Bạn cũng sẽ cần cài đặt máy chủ web Nginx. Làm theo hướng dẫn của chúng tôi về cách cài đặt Nginx trên Ubuntu 20.04. Đảm bảo hoàn thành Bước 5 của hướng dẫn này và thiết lập khối máy chủ, vì điều này sẽ cần thiết để kiểm tra xem Nginx có thể mã hóa kết nối bằng chứng chỉ tự ký của bạn hay không.
Nếu bạn muốn cài đặt toàn bộ ngăn xếp LEMP (Linux, Nginx, MySQL, PHP) trên máy chủ của mình, bạn có thể làm theo hướng dẫn của chúng tôi về cách thiết lập LEMP trên Ubuntu 20.04 thay vì hướng dẫn cài đặt Nginx độc lập.
TLS/SSL hoạt động bằng cách kết hợp chứng chỉ công khai và khóa riêng. SSL key được giữ bí mật trên máy chủ và mã hóa nội dung gửi cho khách hàng. Chứng chỉ SSL được chia sẻ công khai với bất kỳ ai yêu cầu nội dung. Nó có thể được sử dụng để giải mã nội dung được ký bởi SSL key được liên kết.
Bạn có thể tạo cặp chứng chỉ và khóa tự ký với OpenSSL bằng một lệnh duy nhất:
- 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à bảng phân tích về chức năng của từng phần của lệnh này:
sudo
: Lệnh sudo
cho phép các thành viên của nhóm sudo
tạm thời nâng các đặc quyền của họ lên đặc quyền của người dùng khác (theo mặc định là superuser, hoặc root user). Điều này là cần thiết trong trường hợp này vì chúng ta đang tạo chứng chỉ và cặp khóa trong thư mục /etc/
, thư mục này chỉ có thể được truy cập bởi root user hoặc các tài khoản đặc quyền khác.openssl
: Đây là công cụ dòng lệnh cơ bản để tạo và quản lý chứng chỉ OpenSSL, khóa và các tệp khác.req
: Lệnh con 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à một tiêu chuẩn cơ sở hạ tầng khóa công khai mà SSL và TLS tuân thủ để quản lý chứng chỉ và khóa của nó. Chúng ta muốn tạo chứng chỉ X.509 mới, vì vậy chúng ta đang sử dụng lệnh con này.-x509
: Lệnh này sửa đổi thêm lệnh phụ trước đó bằng cách thông báo cho tiện ích rằng chúng ta muốn tạo chứng chỉ tự ký thay vì tạo yêu cầu ký chứng chỉ, như thường xảy ra.-nodes
: Điều này yêu cầu OpenSSL bỏ qua tùy chọn bảo mật chứng chỉ của chúng ta bằng cụm mật khẩu. Chúng ta cần Nginx để có thể đọc tệp mà không cần sự can thiệp của người dùng khi máy chủ khởi động. Cụm mật khẩu sẽ ngăn điều này xảy ra vì chúng ta sẽ phải nhập cụm mật khẩu đó sau mỗi lần khởi động lại.-days 365
: Tùy chọn này đặt khoảng thời gian mà chứng chỉ sẽ được coi là hợp lệ. Chúng ta đặt nó trong một năm ở đây.-newkey rsa:2048
: Điều này chỉ định rằng chúng ta muốn tạo chứng chỉ mới và khóa mới cùng một lúc. Chúng ta đã không tạo khóa cần thiết để ký chứng chỉ trong bước trước, vì vậy chúng ta cần tạo khóa cùng với chứng chỉ. Phần rsa:2048
yêu cầu nó tạo một khóa RSA dài 2048 bit.-keyout
: Dòng này cho OpenSSL biết nơi đặt tệp khóa riêng được tạo mà chúng ta đang tạo.-out
: Điều này cho OpenSSL biết nơi đặt chứng chỉ mà chúng ta đang tạo.Như đã nêu trước đây, các tùy chọn này sẽ tạo cả tệp khóa và chứng chỉ. Sau khi chạy lệnh này, bạn sẽ được hỏi một số câu hỏi về máy chủ của mình để nhúng thông tin chính xác vào chứng chỉ.
Điền vào các lời nhắc một cách thích hợp. Dòng quan trọng nhất là dòng yêu cầu Common Name (e.g. server FQDN or YOUR name)
. Bạn cần nhập tên miền được liên kết với máy chủ của mình hoặc nhiều khả năng hơn là địa chỉ IP công khai của máy chủ.
Toàn bộ lời nhắc sẽ giống như sau:
OutputCountry 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 bạn đã tạo sẽ được đặt trong 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 (DH) mạnh, nhóm này được sử dụng để đàm phán Perfect Forward Secrecy với khách hàng.
Bạn có thể làm điều này bằng cách gõ:
- sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Quá trình này sẽ mất một lúc, nhưng khi hoàn tất, bạn sẽ có một nhóm DH mạnh tại /etc/nginx/dhparam.pem
sẽ được sử dụng trong quá trình cấu hình.
Bây giờ, các tệp khóa và chứng chỉ của bạn trong thư mục /etc/ssl
đã được tạo, bạn sẽ cần sửa đổi cấu hình Nginx của mình để tận dụng lợi thế của chúng.
Đầu tiên, bạn sẽ tạo một đoạn mã cấu hình với thông tin về khóa SSL và vị trí tệp chứng chỉ. Sau đó, bạn sẽ tạo đoạn mã cấu hình có cài đặt SSL mạnh có thể được sử dụng với 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ủ Nginx của mình bằng cách sử dụng hai đoạn mã cấu hình mà bạn đã tạo để các yêu cầu SSL có thể được xử lý một cách thích hợp.
Phương pháp thiết lập cấu hình Nginx này sẽ cho phép bạn giữ sạch các khối máy chủ và đặt các phân đoạn cấu hình chung vào các mô-đun có thể tái sử dụng.
Trước 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 đoạn mã cấu hình Nginx mới trong thư mục /etc/nginx/snippets
. Ví dụ sau sử dụng nano
.
Để phân biệt chính xác mục đích của tệp này, hãy đặt tên cho nó là self-signed.conf
:
- sudo nano /etc/nginx/snippets/self-signed.conf
Trong tệp này, bạn cần đặt chỉ thị ssl_certificate
cho tệp chứng chỉ của mình và ssl_certificate_key
cho khóa được liên kết. Điều này sẽ giống như sau:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Khi bạn đã thêm những dòng đó, hãy lưu tệp và thoát khỏi trình chỉnh sửa. Nếu bạn đã sử dụng nano
để chỉnh sửa tệp, bạn có thể làm như vậy bằng cách nhấn CTRL + X
, Y
, rồi ENTER
.
Tiếp theo, bạn sẽ tạo một đoạn mã khác sẽ xác định một số cài đặt SSL. Điều này sẽ thiết lập Nginx với bộ mật mã SSL mạnh và kích hoạt một số tính năng nâng cao giúp giữ an toàn cho máy chủ của bạn.
Các tham số bạn đặt có thể được sử dụng lại trong các cấu hình Nginx trong tương lai, vì vậy bạn có thể đặt tên chung cho tệp:
- sudo nano /etc/nginx/snippets/ssl-params.conf
Để thiết lập Nginx SSL một cách an toàn, chúng ta sẽ điều chỉnh các đề xuất từ Cipherlist.eu. Cipherlist.eu là một tài nguyên hữu ích và dễ hiểu để hiểu các cài đặt mã hóa được sử dụng cho phần mềm phổ biến.
Lưu ý: Các cài đặt được đề xuất này từ Cipherlist.eu cung cấp khả năng bảo mật mạnh mẽ. Đôi khi, điều này phải trả giá bằng khả năng tương thích của khách hàng cao hơn. Nếu bạn cần hỗ trợ các khách hàng cũ hơn, có một danh sách thay thế có thể được truy cập bằng cách nhấp vào liên kết trên trang có nhãn “Yes, give me a ciphersuite that works with legacy / old software.”. Nếu muốn, bạn có thể thay thế danh sách đó bằng nội dung của khối mã ví dụ tiếp theo.
Việc lựa chọn sử dụng cấu hình nào sẽ phụ thuộc phần lớn vào những gì bạn cần hỗ trợ. Cả hai sẽ cung cấp bảo mật tuyệt vời.
Đối với mục đích của bạn, hãy sao chép toàn bộ cài đặt được cung cấp, nhưng trước tiên, bạn sẽ cần thực hiện một số sửa đổi nhỏ.
Trước tiên, hãy thêm trình phân giải DNS ưa thích của bạn cho các yêu cầu ngược dòng. Chúng tôi sẽ sử dụng Google (8.8.8.8
và 8.8.4.4
) cho hướng dẫn này.
Thứ hai, nhận xét dòng đặt tiêu đề bảo mật vận chuyển nghiêm ngặt. Trước khi bỏ chú thích dòng này, bạn nên dành một chút thời gian để đọc về HTTP Strict Transport Security, hoặc HSTS, và cụ thể là về chức năng “preload” (tải trước). Tải trước HSTS giúp tăng cường bảo mật, nhưng cũng có thể gây ra những hậu quả tiêu cực sâu rộng nếu vô tình được bật hoặc bật không đúng cách.
Thêm phần sau vào tệp đoạn trích ssl-params.conf
của bạn:
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 tính năng SSL stapling sẽ không được sử dụng. Nginx sẽ đưa ra cảnh báo và vô hiệu hóa tính năng stapling cho chứng chỉ tự ký của chúng ta, nhưng sau đó sẽ tiếp tục hoạt động bình thường.
Lưu và đóng tệp bằng cách nhấn CTRL + X
rồi nhấn Y
và ENTER
khi bạn hoàn tất.
Bây giờ bạn đã có đoạn trích của mình, bạn có thể điều chỉnh cấu hình Nginx để bật SSL.
Trong hướng dẫn này, chúng tôi sẽ giả định rằng bạn đang sử dụng tệp cấu hình khối máy chủ tùy chỉnh trong thư mục /etc/nginx/sites-available
. Hướng dẫn này cũng tuân theo các quy ước từ hướng dẫn Nginx tiên quyết và sử dụng /etc/nginx/sites-available/your_domain
cho ví dụ này. Thay thế tên tệp cấu hình của bạn nếu cần.
Trước khi tiếp tục, hãy sao lưu tệp cấu hình hiện tại của bạn:
- sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak
Bây giờ, hãy mở tệp cấu hình để thực hiện điều chỉnh:
- sudo nano /etc/nginx/sites-available/your_domain
Bên trong, khối máy chủ của bạn có thể bắt đầu tương tự như sau:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
Tệp của bạn có thể ở một thứ tự khác và thay vì các lệnh root
và index
, bạn có thể có một số câu lệnh location
, proxy_pass
hoặc các câu lệnh cấu hình tùy chỉnh khác. Điều này tốt vì bạn chỉ cần cập nhật các lệnh listen
và bao gồm các đoạn mã SSL. Sau đó sửa đổi khối máy chủ hiện có này để phục vụ lưu lượng SSL trên cổng 443
và tạo một khối máy chủ mới để phản hồi trên cổng 80
và tự động chuyển hướng lưu lượng truy cập đến cổng 443
.
Lưu ý: Sử dụng chuyển hướng 302 cho đến khi bạn xác minh rằng mọi thứ đang hoạt động bình thường. Sau đó, bạn sẽ thay đổi điều này thành chuyển hướng 301 vĩnh viễn.
Trong tệp cấu hình hiện tại của bạn, hãy cập nhật hai câu lệnh listen
để sử dụng port 443
và ssl
, sau đó bao gồm hai tệp đoạn trích mà bạn đã tạo ở các bước trước:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}
Tiếp theo, thêm khối máy chủ thứ hai vào tệp cấu hình sau dấu ngoặc đóng (}
) của khối đầu tiên:
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 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 bằng cách nhấn CTRL + X rồi Y và ENTER khi bạn chỉnh sửa xong.
Nếu bạn đã bật tường lửa ufw
, theo đề xuất của hướng dẫn điều kiện tiên quyết, bạn sẽ cần điều chỉnh cài đặt để cho phép lưu lượng SSL. May mắn thay, Nginx đăng ký một vài cấu hình với ufw
khi cài đặt.
Bạn có thể xem lại các cấu hình có sẵn bằng cách nhập:
- sudo ufw app list
Một danh sách như sau sẽ xuất hiện:
OutputAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Bạn có thể kiểm tra cài đặt hiện tại bằng cách nhập sudo ufw status
:
- sudo ufw status
Nó có thể sẽ tạo ra phản hồi sau, nghĩa là chỉ lưu lượng HTTP mới được phép vào máy chủ web:
OutputStatus: 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, bạn có thể cập nhật quyền cho cấu hình “Nginx Full” và sau đó xóa phụ cấp cấu hình “Nginx HTTP” dư thừa:
- sudo ufw allow 'Nginx Full'
- sudo ufw delete allow 'Nginx HTTP'
Sau khi chạy sudo ufw status
, bạn sẽ nhận được kết quả như sau:
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
Đầu ra này xác nhận các điều chỉnh đối với tường lửa của bạn đã thành công và bạn đã sẵn sàng kích hoạt các thay đổi trong Nginx.
Khi hoàn tất các thay đổi và điều chỉnh đối với tường lửa của bạn, bạn có thể khởi động lại Nginx để thực hiện các thay đổi mới.
Trước tiên, hãy kiểm tra xem không có lỗi cú pháp nào trong các tệp. Bạn có thể làm điều này bằng cách gõ sudo nginx -t
:
- sudo nginx -t
Nếu mọi thứ thành công, bạn sẽ nhận được kết quả như sau:
Outputnginx: [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
Chú ý cảnh báo ngay từ đầu. Như đã lưu ý trước đó, cài đặt cụ thể này tạo ra cảnh báo vì chứng chỉ tự ký của bạn không thể sử dụng tính năng SSL stapling. Điều này được mong đợi và máy chủ của bạn vẫn có thể mã hóa các kết nối một cách chính xác.
Nếu đầu ra của bạn khớp với ví dụ của chúng tôi, thì tệp cấu hình của bạn không có lỗi cú pháp. Trong trường hợp này, bạn có thể khởi động lại Nginx một cách an toàn để thực hiện các thay đổi:
- sudo systemctl restart nginx
Bây giờ hệ thống đã được khởi động lại với những thay đổi mới, bạn có thể tiến hành kiểm tra.
Bây giờ, bạn đã sẵn sàng kiểm tra máy chủ SSL của mình.
Mở trình duyệt web của bạn và nhập https://
theo sau là tên miền hoặc IP của máy chủ của bạn vào thanh địa chỉ:
https://server_domain_or_IP
Tùy thuộc vào trình duyệt của bạn, bạn có thể sẽ 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 cấp chứng chỉ đáng tin cậy của trình duyệt của bạn:
Cảnh báo này được mong đợi và bình thường. Chúng ta chỉ quan tâm đến khía cạnh mã hóa của chứng chỉ của chúng ta chứ không phải sự xác thực của bên thứ ba về tính xác thực của máy chủ lưu trữ. Nhấp vào “ADVANCED” và sau đó nhấp vào liên kết được cung cấp để tiếp tục với máy chủ lưu trữ của bạn:
Tại thời điểm này, bạn nên được đưa đến trang web của bạn. Trong ví dụ của chúng tôi, thanh địa chỉ của trình duyệt hiển thị khóa có chữ “x” phía trên, điều đó có nghĩa là chứng chỉ không thể được xác thực. Nó vẫn đang mã hóa kết nối của bạn. Lưu ý rằng biểu tượng này có thể khác, tùy thuộc vào trình duyệt của bạn.
Nếu bạn đã thiết lập cấu hình Nginx với hai khối máy chủ, tự động chuyển hướng nội dung HTTP sang HTTPS, bạn cũng có thể kiểm tra xem chuyển hướng có hoạt động chính xác hay không:
https://server_domain_or_IP
Nếu điều này dẫn đến cùng một biểu tượng, điều này có nghĩa là chuyển hướng của bạn hoạt động bình thường.
Nếu chuyển hướng của bạn hoạt động bình thường và bạn chắc chắn chỉ muốn cho phép lưu lượng được mã hóa, thì bạn nên sửa đổi cấu hình Nginx để chuyển hướng vĩnh viễn.
Mở lại tệp cấu hình khối máy chủ của bạn:
- sudo nano /etc/nginx/sites-available/your_domain
Tìm return 302
và thay đổi nó thành return 301
:
return 301 https://$server_name$request_uri;
Lưu và đóng tệp bằng cách nhấn CTRL + X
rồi Y
và ENTER
.
Kiểm tra cấu hình của bạn để tìm lỗi cú pháp:
- sudo nginx -t
Khi bạn đã sẵn sàng, hãy khởi động lại Nginx để 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 triển khai và chuyển hướng của bạn hiện là vĩnh viễn.
Bạn đã thiết lập cấu hình máy chủ Nginx của mình để sử dụng mã hóa mạnh cho các kết nối máy khách. Điều này sẽ cho phép bạn phục vụ các yêu cầu một cách an toàn và ngăn các bên ngoài đọc lưu lượng truy cập của bạn. Ngoài ra, bạn có thể chọn sử dụng chứng chỉ SSL tự ký có thể nhận được từ Let's Encrypt, cơ quan cấp chứng chỉ cài đặt chứng chỉ TLS/SSL miễn phí và bật HTTPS được mã hóa trên máy chủ web. Tìm hiểu thêm từ hướng dẫn của chúng tôi về Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04.