Tạo SSL Self-Signed và cấu hình Nginx sử dụng chứng chỉ trên Ubuntu

Tạo SSL Self-Signed và cấu hình Nginx sử dụng chứng chỉ trên Ubuntu

TLS (Transport Layer Security) và tiền thân của nó, SSL (Secure Sockets Layer), là các giao thức bảo mật được sử dụng rộng rãi để mã hóa và bảo vệ dữ liệu truyền qua mạng. Những giao thức này giúp đảm bảo rằng thông tin trao đổi giữa máy chủ và máy khách luôn được bảo mật, ngăn chặn các cuộc tấn công đánh cắp hoặc giả mạo dữ liệu.

Bên cạnh việc mã hóa, hệ thống chứng chỉ số của TLS/SSL còn đóng vai trò quan trọng trong việc xác thực danh tính của máy chủ, giúp người dùng tin tưởng hơn khi truy cập các trang web an toàn.

DataOnline sẽ hướng dẫn bạn tìm hiểu cách tạo và triển khai chứng chỉ SSL tự ký trên máy chủ web Nginx chạy hệ điều hành Ubuntu, từ đó bảo vệ lưu lượng truy cập và nâng cao tính bảo mật cho website của mình.

Lưu ý: Chứng chỉ tự ký sẽ mã hóa dữ liệu truyền giữa máy chủ và máy khách. Tuy nhiên, vì nó không được ký bởi các cơ quan chứng thực đáng tin cậy có sẵn trong trình duyệt, nên người dùng không thể tự động xác thực danh tính máy chủ của bạn thông qua chứng chỉ này.

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ủ và trong những 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, nên sử dụng chứng chỉ được CA ký. Bạn có thể tìm hiểu cách thiết lập chứng chỉ miễn phí đáng tin cậy với dự án Let’s Encrypt.

Yêu cầu tiên quyết

Trước khi bắt đầu, bạn nên có một tài khoản người dùng không phải root được cấu hình với 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 này qua bài hướng dẫn “Thiết lập máy chủ ban đầu với Ubuntu.”

Bạn cũng cần cài đặt máy chủ web Nginx. Hãy theo dõi bài hướng dẫn cài đặt Nginx trên Ubuntu. Hãy đảm bảo hoàn thành Bước 5 của bài hướng dẫn và thiết lập một server block, vì điều này sẽ cần thiết để kiểm tra xem Nginx có thể mã hóa kết nối sử dụ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ộ bộ LEMP (Linux, Nginx, MySQL, PHP) trên máy chủ của mình, bạn có thể tham khảo bài hướng dẫn thiết lập LEMP trên Ubuntu thay vì chỉ cài đặt Nginx riêng lẻ.

Bước 1 – Tạo chứng chỉ TLS

TLS/SSL hoạt động dựa trên sự kết hợp giữ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 cho bất cứ 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 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

Giải thích các thành phần trong lệnh trên:

  • 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à superuser hoặc root). Điều này cần thiết vì chúng ta tạo cặp chứng chỉ và key dưới thư mục /etc/, chỉ có người dùng root hoặ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 file liên quan của OpenSSL.

  • req: Lệnh con này cho biết 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 cho 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 nên sử dụng lệnh này.

  • -x509: Tham số này chỉ định 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: Tham số này yêu cầu OpenSSL bỏ qua việc bảo vệ chứng chỉ bằng passphrase. Chúng ta cần Nginx có thể đọc file mà không cần tương tác người dùng khi khởi động máy chủ. Passphrase sẽ ngăn điều này vì bạn phải nhập lại sau mỗi lần khởi động.

  • -days 365: Thiết lập thời gian chứng chỉ còn 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 chứng chỉ mới và một key mới cùng lúc. Vì trước đó chưa có key nào được tạo để ký chứng chỉ, nên chúng ta cần tạo nó cùng với chứng chỉ. rsa:2048 yêu cầu tạo key RSA với độ dài 2048 bit.

  • -keyout: Tham số này chỉ định vị trí lưu file private key vừa tạo.

  • -out: Tham số này chỉ định vị trí lưu chứng chỉ vừa tạo.

Như đã nêu, các tùy chọn trên sẽ tạo ra một file key và một file chứng chỉ. Sau khi chạy lệnh, bạn sẽ được hỏi một số câu hỏi về máy chủ để tích hợp thông tin vào chứng chỉ.

Hãy điền các thông tin theo yêu cầu. 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, có thể, địa chỉ IP công khai của máy chủ.

Toàn bộ các câu hỏi sẽ hiển thị 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 file bạn tạo sẽ được đặt vào các thư mục thích hợp trong thư mục /etc/ssl.

Trong quá trình sử dụng OpenSSL, bạn cũng nên tạo một nhóm Diffie-Hellman (DH) mạnh, được dùng trong việc đàm phán Perfect Forward Secrecy với máy khách.

Bạn có thể thực hiện điều này bằng cách nhập:

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Lệnh này sẽ mất một 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 để sử dụng trong cấu hình.

Bước 2 – Cấu hình Nginx sử dụng SSL

Bây giờ, khi các file key và chứng chỉ trong thư mục /etc/ssl đã được tạo, bạn cần chỉnh sửa cấu hình của Nginx để sử dụng chúng.

Trước tiên, bạn sẽ tạo một đoạn cấu hình chứa thông tin về vị trí file key và chứng chỉ SSL. Sau đó, bạn sẽ tạo một đoạn cấu hình với các cài đặt SSL mạnh có thể 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 server block của Nginx sử dụng hai đoạn cấu hình vừa tạo để xử lý các yêu cầu SSL một cách thích hợp.

Phương pháp cấu hình Nginx này sẽ cho phép bạn giữ cho các server block được gọn gàng và đưa các đoạ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 chỉ định vị trí khóa và chứng chỉ SSL

Đầu tiên, 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 sử dụng nano.

Để phân biệt rõ mục đích của file này, hãy đặt tên nó là self-signed.conf:

sudo nano /etc/nginx/snippets/self-signed.conf

Bên trong file này, bạn cần đặt chỉ thị ssl_certificate trỏ đến file chứng chỉ và ssl_certificate_key trỏ đến file key tương ứng. File sẽ có nội dung 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;

Khi đã thêm các dòng trên, hãy lưu file và thoát khỏi trình soạn thảo. Nếu sử dụng nano, nhấn CTRL + X, sau đó YENTER.

Tạo đoạn cấu hình với 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 SSL mạnh và kích hoạt một số tính năng tiên tiến giúp bảo vệ máy chủ của bạn.

Các tham số được thiết lập có thể được tái sử dụng trong các cấu hình Nginx khác trong tương lai, vì vậy bạn có thể đặt tên file theo cách chung chung:

sudo nano /etc/nginx/snippets/ssl-params.conf

Để thiết lập SSL cho Nginx một cách an toàn, chúng ta sẽ áp dụng các khuyến nghị từ Cipherlist.eu.Cipherlist.eu là một nguồn tài nguyên hữu ích và dễ hiểu để nắm bắt các cài đặt mã hóa được sử dụng trong các phần mềm phổ biến.

Lưu ý: Các cài đặt được đề xuất từ Cipherlist.eu mang lại mức bảo mật cao. Đô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 bạn cần hỗ trợ các máy khách cũ, có thể thay thế bằng danh sách thay thế được truy cập thông qua liên kết 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ụ tiếp theo.

File ssl-params.conf sẽ có nội dung như sau (với một vài thay đổi nhỏ):

  • Thêm DNS resolver ưa thích cho các yêu cầu upstream, ở đây chúng ta sử dụng Google (8.8.8.88.8.4.4).
  • Comment dòng đặt header strict transport security. Trước khi bỏ comment dòng này, bạn nên tìm hiểu về HTTP Strict Transport Security (HSTS)chức năng “preload”. Việc preload HSTS tăng cường bảo mật nhưng cũng có thể gây ra hậu quả không mong muốn nếu kích hoạt hoặc cấu hình không đúng.

Thêm đoạn sau vào file 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ẽ xuất hiện cảnh báo và tắt stapling cho chứng chỉ tự ký của bạn, nhưng vẫn hoạt động đúng để mã hóa kết nối.

Khi hoàn thành, lưu file và thoát (nhấn CTRL + X, sau đó YENTER).

Điều chỉnh cấu hình Nginx sử dụng SSL

Bây giờ bạn đã có các đoạn cấu hình, hãy điều chỉnh cấu hình Nginx để kích hoạt SSL.

Hướng dẫn này giả định bạn đang sử dụng file cấu hình server block tùy chỉnh trong thư mục /etc/nginx/sites-available. Hướng dẫn này cũng tuân theo quy ước từ bài hướng dẫn yêu cầu ban đầu và sử dụng ví dụ file /etc/nginx/sites-available/your_domain. Hãy thay thế tên file cấu hình theo trường hợp của bạn.

Trước khi tiến hành, hãy sao lưu file cấu hình hiện tại:

sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak

Sau đó, mở file cấu hình để chỉnh sửa:

sudo nano /etc/nginx/sites-available/your_domain

Bên trong, server block của bạn có thể bắt đầu như sau:

/etc/nginx/sites-available/your_domain
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;
        }
}

File cấu hình có thể có thứ tự khác, và thay vì các chỉ thị rootindex, bạn có thể có các chỉ thị location, proxy_pass hoặc các cấu hình tuỳ chỉnh khác. Điều này không sao, chỉ cần cập nhật các chỉ thị listen và chèn các đoạn cấu hình SSL đã tạo. Sau đó, chỉnh sửa server block hiện tại để phục vụ lưu lượng SSL trên cổng 443, và tạo một server block mới cho cổng 80 tự động chuyển hướng lưu lượng đến cổng 443.

Lưu ý: Sử dụng chuyển hướng 302 cho đến khi bạn kiểm tra rằng mọi thứ hoạt động đúng. Sau đó, bạn sẽ chuyển sang chuyển hướng 301 vĩnh viễn.

Trong file cấu hình hiện tại, cập nhật 2 chỉ thị listen để sử dụng cổng 443 và ssl, sau đó chèn 2 file snippet đã tạo:

/etc/nginx/sites-available/your_domain
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 một server block thứ hai vào file cấu hình, sau dấu ngoặc đóng (}) của block đầ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;
}

File cấu hình trên lắng nghe trên cổng 80 và thực hiện chuyển hướng đến HTTPS.
Lưu file và thoát (nhấn CTRL + X, sau đó YENTER khi hoàn tất chỉnh sửa).

Bước 3 – Điều chỉnh tường lửa

Nếu bạn đã bật tường lửa ufw theo khuyến nghị của bài hướng dẫn ban đầu, bạn 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 số profile với ufw khi cài đặt.

Bạn có thể xem danh sách các profile có sẵn bằng cách nhập:

sudo ufw app list

Danh sách sẽ hiển thị như sau:

Output
Available 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:

sudo ufw status

Có thể bạn sẽ nhận được phản hồi như sau, nghĩa là chỉ lưu lượng HTTP được phép truy cập 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, bạn có thể cập nhật quyền cho profile “Nginx Full” và sau đó xóa quyền “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ả:

sudo ufw status
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ả trên xác nhận rằng việc điều chỉnh tường lửa đã thành công và bạn đã sẵn sàng kích hoạt các thay đổi trong Nginx.

Bước 4 – Kích hoạt các thay đổi trong Nginx

Sau khi hoàn thành các thay đổi và điều chỉnh tường lửa, bạn có thể khởi động lại Nginx để áp dụng các thay đổi mới.

Đầu tiên, kiểm tra xem có lỗi cú pháp nào trong các file không bằng cách nhập:

sudo nginx -t

Nếu mọi thứ thành công, bạn sẽ nhận được kết quả 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

Chú ý cảnh báo ở đầu. Như đã đề cập, cảnh báo này xuất hiện vì chứng chỉ tự ký không sử dụng được SSL stapling. Điều này là bình thường và máy chủ vẫn có thể mã hóa kết nối đúng.

Nếu không có lỗi cú pháp, bạn có thể khởi động lại Nginx để áp dụng các thay đổi:

sudo systemctl restart nginx

Giờ đây, khi hệ thống đã khởi động lại với các thay đổi mới, bạn có thể tiến hành kiểm tra.

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à nhập https:// theo sau là tên miền hoặc địa chỉ IP của máy chủ:

https://server_domain_or_IP

Tùy thuộc vào trình duyệt, có thể bạn 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 những cơ quan chứng thực đáng tin cậy của trình duyệt.

Thiet ke chua co ten 37

Cảnh báo này là bình thường và mong đợi. Chúng ta chỉ quan tâm đến việc mã hóa kết nối, không phải xác thực danh tính của máy chủ. Nhấn “ADVANCED” và sau đó nhấp vào liên kết được cung cấp để tiến vào máy chủ của bạn.

Thiet ke chua co ten 38

Tại điểm này, trình duyệt sẽ hiển thị biểu tượng ổ khóa với dấu “x” chéo, nghĩa là chứng chỉ không thể được xác thực, nhưng 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 vào trình duyệt.

Nếu bạn đã cấu hình Nginx với hai server block, tự động chuyển hướng lưu lượng từ HTTP sang HTTPS, bạn cũng có thể kiểm tra xem chuyển hướng có hoạt động đúng không bằng cách nhập:

http://server_domain_or_IP

Nếu kết quả hiển thị cùng biểu tượng ổ khóa, điều đó có nghĩa chuyển hướng đã hoạt động chính xác.

Bước 6 – Chuyển đổi sang chuyển hướng vĩnh viễn

Nếu chuyển hướng hoạt động đúng và bạn chắc chắn 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 vĩnh viễn.

Mở lại file cấu hình server block:

sudo nano /etc/nginx/sites-available/your_domain

Tìm dòng có 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 file và thoát (nhấn CTRL + X, sau đó YENTER).

Kiểm tra lỗi cú pháp:

sudo nginx -t

Khi đã sẵn sàng, 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 đã được áp dụng và chuyển hướng giờ là vĩnh viễn.

Kết luận

Bạn đã thiết lập thành công chứng chỉ SSL tự ký và cấu hình Nginx để mã hóa lưu lượng truy cập, giúp bảo vệ dữ liệu trao đổi giữa máy chủ và người dùng. Điều này giúp tăng cường bảo mật, tránh nguy cơ bị tấn công trung gian (MITM) và đảm bảo tính toàn vẹn của thông tin truyền tải.

Nếu bạn muốn triển khai chứng chỉ SSL được công nhận bởi các trình duyệt và không hiển thị cảnh báo bảo mật, hãy cân nhắc sử dụng Let’s Encrypt – một dịch vụ cấp chứng chỉ TLS/SSL miễn phí.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *