Hướng dẫn tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 7

Chắc hẳn bạn đã từng nghe nói về tầm quan trọng của việc bảo mật website bằng HTTPS là gì. Tuy nhiên, không phải lúc nào chúng ta cũng cần đến chứng chỉ SSL trả phí từ các nhà cung cấp (CA). Đối với môi trường phát triển, máy chủ nội bộ hoặc các dự án cá nhân, việc sử dụng chứng chỉ SSL tự ký (self-signed) là một giải pháp nhanh chóng, miễn phí và hiệu quả. Trong bài viết này, Bùi Mạnh Đức sẽ hướng dẫn bạn chi tiết từng bước để tạo và cấu hình một chứng chỉ SSL tự ký cho máy chủ Nginx trên hệ điều hành CentOS 7. Hãy cùng tìm hiểu cách tự mình mã hóa kết nối, tăng cường bảo mật cho máy chủ của bạn một cách dễ dàng nhé!

Giới thiệu về chứng chỉ SSL và chứng chỉ tự ký

Trong thế giới kỹ thuật số, việc bảo vệ dữ liệu là ưu tiên hàng đầu. Chứng chỉ SSL là gì chính là công nghệ nền tảng giúp mã hóa kết nối giữa trình duyệt của người dùng và máy chủ web. Nó đảm bảo rằng mọi thông tin trao đổi, từ mật khẩu đến dữ liệu thẻ tín dụng, đều được giữ bí mật và an toàn.

Vậy chứng chỉ SSL tự ký (self-signed certificate) là gì? Khác với chứng chỉ được cấp bởi các tổ chức uy tín (Certificate Authority là gì – CA) như Let’s Encrypt hay Comodo, chứng chỉ tự ký do chính quản trị viên máy chủ tạo ra. Nó cũng cung cấp khả năng mã hóa tương tự nhưng không được các trình duyệt mặc định tin tưởng. Điều này có nghĩa là người dùng sẽ thấy một cảnh báo bảo mật khi truy cập website.

Tại sao chúng ta lại cần nó cho Nginx? Đối với các môi trường không công khai như máy chủ thử nghiệm, ứng dụng nội bộ hoặc API cá nhân, việc sử dụng chứng chỉ tự ký là một giải pháp tuyệt vời. Nó giúp bạn thiết lập kết nối HTTPS nhanh chóng để kiểm thử tính năng mà không tốn chi phí và thời gian chờ đợi xác thực từ CA.

Lợi ích của việc sử dụng chứng chỉ SSL cho máy chủ Nginx

Việc trang bị chứng chỉ SSL cho máy chủ Nginx không chỉ là một lựa chọn mà gần như đã trở thành một yêu cầu bắt buộc. Dù là chứng chỉ tự ký hay được cấp bởi CA, lợi ích mà nó mang lại là không thể phủ nhận.

Bảo mật thông tin và mã hóa dữ liệu truyền tải

Lợi ích cốt lõi nhất của SSL là khả năng mã hóa. Mọi dữ liệu được gửi đi từ trình duyệt người dùng đến máy chủ và ngược lại sẽ được “khóa” lại. Điều này giúp giảm thiểu tối đa nguy cơ bị nghe lén hoặc tấn công “man-in-the-middle”.

Hình minh họa

Nếu không có SSL, thông tin nhạy cảm như tên đăng nhập, mật khẩu, và thông tin cá nhân có thể bị đánh cắp một cách dễ dàng khi truyền qua mạng. Việc mã hóa đảm bảo rằng chỉ có người gửi và người nhận hợp pháp mới có thể đọc được nội dung.

Nâng cao độ tin cậy và SEO cho website

Một website sử dụng HTTPS luôn tạo cảm giác an toàn và chuyên nghiệp hơn trong mắt người dùng. Biểu tượng ổ khóa màu xanh trên thanh địa chỉ trình duyệt là một dấu hiệu rõ ràng cho thấy kết nối của họ được bảo vệ. Điều này đặc biệt quan trọng đối với các trang web yêu cầu người dùng cung cấp thông tin cá nhân.

Hình minh họa

Ngoài ra, Google đã chính thức xác nhận rằng HTTPS là một trong những yếu tố xếp hạng. Các trang web được mã hóa sẽ có lợi thế nhỏ trong kết quả tìm kiếm so với các đối thủ cạnh tranh không an toàn. Do đó, cài đặt SSL cũng là một bước đi thông minh để cải thiện SEO cho website của bạn.

Cài đặt và cấu hình OpenSSL trên CentOS 7

Để tạo được chứng chỉ SSL tự ký, chúng ta cần một công cụ chuyên dụng. OpenSSL là bộ công cụ mã nguồn mở mạnh mẽ và phổ biến nhất cho các tác vụ liên quan đến SSL/TLS. May mắn là nó thường được cài đặt sẵn trên hầu hết các bản phân phối Linux, bao gồm cả CentOS 7.

Hướng dẫn cài đặt OpenSSL

Trong trường hợp máy chủ của bạn chưa có OpenSSL, việc cài đặt vô cùng đơn giản thông qua trình quản lý gói `yum`. Bạn chỉ cần mở terminal và thực thi lệnh sau với quyền quản trị (root hoặc sudo).

Lệnh này sẽ tìm kiếm gói `openssl` trong kho lưu trữ của CentOS và tiến hành cài đặt nó cùng các gói phụ thuộc cần thiết. Quá trình này thường diễn ra rất nhanh chóng.

sudo yum install -y openssl

Sau khi lệnh chạy xong, OpenSSL đã sẵn sàng trên hệ thống của bạn. Bạn không cần phải thực hiện thêm bất kỳ cấu hình phức tạp nào để bắt đầu sử dụng nó cho việc tạo chứng chỉ.

Kiểm tra phiên bản và cấu hình OpenSSL

Để chắc chắn rằng OpenSSL đã được cài đặt thành công, bạn nên thực hiện một bước kiểm tra đơn giản. Chạy lệnh sau để xem phiên bản hiện tại của OpenSSL trên máy chủ của bạn.

openssl version

Nếu lệnh trả về thông tin phiên bản, ví dụ như “OpenSSL 1.0.2k-fips”, điều đó có nghĩa là mọi thứ đã ổn. Việc biết phiên bản đang dùng cũng hữu ích trong việc tra cứu tài liệu hoặc khắc phục các vấn đề liên quan đến lỗ hổng bảo mật trong tương lai.

Hình minh họa

Đối với hầu hết các trường hợp tạo chứng chỉ tự ký, bạn không cần phải thay đổi cấu hình mặc định của OpenSSL. Các thiết lập có sẵn đã đủ để chúng ta tiến hành các bước tiếp theo một cách suôn sẻ.

Các bước tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 7

Bây giờ chúng ta sẽ đi vào phần chính: sử dụng OpenSSL để tạo ra các file cần thiết cho việc cấu hình HTTPS trên Nginx. Quá trình này bao gồm hai bước chính: tạo một cặp khóa riêng tư (private key) và yêu cầu ký chứng chỉ (CSR), sau đó dùng chính chúng để tạo ra chứng chỉ cuối cùng.

Tạo private key và Certificate Signing Request (CSR)

Private key là thành phần bí mật và quan trọng nhất, dùng để giải mã dữ liệu được mã hóa bởi chứng chỉ. CSR là một file chứa thông tin về tên miền và tổ chức của bạn, được dùng để yêu cầu một CA ký chứng chỉ. Với chứng chỉ tự ký, chúng ta sẽ tự mình “ký” vào CSR này.

Hãy sử dụng lệnh OpenSSL sau để tạo đồng thời cả private key (file `.key`) và CSR (file `.csr`) trong một lần chạy. Lệnh này sẽ tạo ra một khóa RSA 2048-bit, là mức độ bảo mật tiêu chuẩn hiện nay.

sudo openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.com.key -out yourdomain.com.csr

Sau khi chạy lệnh, bạn sẽ được yêu cầu điền một số thông tin như Tên quốc gia, Tỉnh/Thành phố, Tên tổ chức, và quan trọng nhất là “Common Name”. Tại mục “Common Name”, bạn hãy nhập địa chỉ IP hoặc tên miền mà bạn sẽ dùng để truy cập website (ví dụ: `192.168.1.10` hoặc `test.buimanhduc.com`).

Hình minh họa

Tạo chứng chỉ tự ký (self-signed certificate)

Khi đã có private key và CSR, bước cuối cùng là tạo ra file chứng chỉ SSL (file `.crt`). Chúng ta sẽ sử dụng chính private key vừa tạo để ký vào file CSR.

Thực hiện lệnh sau để tạo chứng chỉ. Lệnh này sẽ lấy file `.key` và `.csr` làm đầu vào và tạo ra file `.crt` có thời hạn sử dụng là 365 ngày. Bạn có thể thay đổi giá trị `-days` để tùy chỉnh thời gian hiệu lực.

sudo openssl x509 -req -days 365 -in yourdomain.com.csr -signkey yourdomain.com.key -out yourdomain.com.crt

Sau khi hoàn tất, bạn sẽ có ba file quan trọng: `yourdomain.com.key` (khóa riêng tư), `yourdomain.com.csr` (yêu cầu ký, có thể xóa đi sau khi đã tạo chứng chỉ) và `yourdomain.com.crt` (chứng chỉ SSL). Bây giờ, chúng ta đã sẵn sàng để cấu hình Nginx sử dụng chúng.

Cấu hình Nginx sử dụng chứng chỉ SSL tự ký

Sau khi đã tạo thành công các file chứng chỉ và khóa riêng tư, bước tiếp theo là “chỉ đường” cho Nginx biết nơi lưu trữ và cách sử dụng chúng để bật kết nối HTTPS.

Cập nhật file cấu hình Nginx để bật HTTPS

Đầu tiên, bạn cần di chuyển hai file `.crt` và `.key` vào một thư mục an toàn mà Nginx có quyền đọc. Một vị trí phổ biến là `/etc/nginx/ssl/`.

sudo mkdir -p /etc/nginx/ssl
sudo mv yourdomain.com.crt /etc/nginx/ssl/
sudo mv yourdomain.com.key /etc/nginx/ssl/
sudo chmod 600 /etc/nginx/ssl/*

Tiếp theo, hãy mở file cấu hình Nginx cho website của bạn (thường nằm ở `/etc/nginx/conf.d/yourdomain.conf` hoặc `/etc/nginx/sites-available/yourdomain`). Bạn cần thêm hoặc chỉnh sửa khối `server` để lắng nghe trên cổng 443 (cổng mặc định của HTTPS) và khai báo đường dẫn đến hai file SSL.

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;
    # Chuyển hướng HTTP sang HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;

    # Các cấu hình khác của website
    root /var/www/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

Hình minh họa

Đoạn cấu hình trên không chỉ bật HTTPS mà còn tự động chuyển hướng mọi truy cập từ HTTP (cổng 80) sang HTTPS (cổng 443), đảm bảo mọi kết nối đều được mã hóa.

Khởi động lại dịch vụ Nginx và kiểm tra cấu hình

Trước khi khởi động lại Nginx, bạn nên kiểm tra xem file cấu hình có lỗi cú pháp nào không. Đây là một thói quen tốt để tránh làm gián đoạn dịch vụ.

sudo nginx -t

Nếu bạn nhận được thông báo “syntax is ok” và “test is successful”, điều đó có nghĩa là cấu hình đã hợp lệ. Bây giờ, hãy áp dụng các thay đổi bằng cách khởi động lại dịch vụ Nginx.

sudo systemctl restart nginx

Đến đây, máy chủ Nginx của bạn đã được cấu hình để phục vụ website qua kết nối HTTPS an toàn sử dụng chứng chỉ tự ký.

Kiểm tra và xác thực chứng chỉ SSL trên Nginx

Sau khi cấu hình, bước quan trọng tiếp theo là kiểm tra xem mọi thứ có hoạt động đúng như mong đợi không. Bạn có thể kiểm tra bằng cả trình duyệt web và các công cụ dòng lệnh.

Cách đơn giản nhất là mở trình duyệt web (Chrome, Firefox,…) và truy cập vào website của bạn bằng https:// (ví dụ: `https://yourdomain.com`). Vì chúng ta đang sử dụng chứng chỉ tự ký, trình duyệt sẽ hiển thị một cảnh báo bảo mật với nội dung như “Kết nối của bạn không phải là kết nối riêng tư” hoặc “NET::ERR_CERT_AUTHORITY_INVALID”.

Hình minh họa

Đây là hành vi hoàn toàn bình thường. Nó xảy ra vì trình duyệt không nhận dạng được tổ chức đã cấp phát chứng chỉ (chính là bạn). Bạn có thể an tâm bỏ qua cảnh báo này bằng cách nhấp vào “Nâng cao” và chọn “Tiếp tục truy cập”. Nếu trang web tải được với biểu tượng ổ khóa bị gạch chéo, điều đó có nghĩa là HTTPS đã hoạt động.

Để kiểm tra kỹ thuật hơn, bạn có thể dùng các công cụ dòng lệnh. Lệnh curl cho phép bạn xem thông tin kết nối. Sử dụng cờ -k để bỏ qua việc xác thực chứng chỉ.

curl -k https://yourdomain.com

Một công cụ mạnh mẽ khác là openssl s_client. Lệnh này sẽ hiển thị chi tiết về chứng chỉ mà máy chủ đang sử dụng, giúp bạn xác nhận rằng Nginx đang gửi đúng chứng chỉ bạn đã tạo.

openssl s_client -connect yourdomain.com:443

Kết quả từ các công cụ này sẽ giúp bạn khẳng định rằng việc cài đặt và cấu hình SSL đã thành công.

Khắc phục lỗi thường gặp khi sử dụng chứng chỉ tự ký

Mặc dù quá trình cài đặt khá đơn giản, đôi khi bạn vẫn có thể gặp phải một số sự cố. Dưới đây là hai lỗi phổ biến nhất và cách để xử lý chúng.

Lỗi cảnh báo trình duyệt về chứng chỉ không tin cậy

Như đã đề cập, đây là “lỗi” được dự đoán trước. Nguyên nhân là do chứng chỉ của bạn không được ký bởi một Certificate Authority (CA) mà trình duyệt tin tưởng. Với môi trường phát triển hoặc nội bộ, bạn có thể chỉ cần bỏ qua cảnh báo mỗi khi truy cập.

Hình minh họa

Tuy nhiên, nếu bạn thường xuyên làm việc với trang web này và muốn loại bỏ cảnh báo phiền phức, bạn có thể thêm chứng chỉ tự ký vào “kho chứng chỉ tin cậy” (trusted store) trên máy tính của mình. Quá trình này khác nhau tùy theo hệ điều hành, nhưng về cơ bản, bạn cần tải file `.crt` về máy và import nó vào mục quản lý chứng chỉ của hệ thống hoặc trình duyệt.

Lỗi cấu hình Nginx không khởi động hoặc HTTPS không bật

Nếu sau khi cấu hình, dịch vụ Nginx không thể khởi động lại, hoặc trang web HTTPS không thể truy cập, nguyên nhân thường nằm ở file cấu hình hoặc quyền truy cập file.

Đầu tiên, hãy chạy lại lệnh sudo nginx -t. Lệnh này sẽ chỉ ra chính xác dòng nào trong file cấu hình đang bị lỗi cú pháp. Hãy kiểm tra kỹ các dấu chấm phẩy (;), dấu ngoặc nhọn ({}), và tên các chỉ thị (ssl_certificate, ssl_certificate_key).

Một nguyên nhân phổ biến khác là sai đường dẫn đến file chứng chỉ hoặc khóa riêng tư. Hãy đảm bảo đường dẫn bạn khai báo trong file `.conf` là chính xác. Cuối cùng, hãy kiểm tra quyền truy cập. Người dùng chạy Nginx (thường là `nginx` hoặc `www-data`) phải có quyền đọc hai file `.crt` và `.key`. Lệnh sudo chmod 600 /etc/nginx/ssl/* mà chúng ta đã thực hiện trước đó là để đảm bảo điều này.

Tối ưu bảo mật HTTPS cho website với chứng chỉ tự ký

Việc cài đặt chứng chỉ SSL chỉ là bước đầu tiên. Để thực sự tăng cường bảo mật cho máy chủ Nginx, bạn nên tinh chỉnh thêm một số cấu hình nâng cao. Các thiết lập này áp dụng được cho cả chứng chỉ tự ký và chứng chỉ từ CA.

Bạn nên ưu tiên sử dụng các phiên bản giao thức TLS là gì mới nhất và an toàn nhất. Các phiên bản cũ như SSLv2 và SSLv3 đã tồn tại nhiều lỗ hổng bảo mật và cần được vô hiệu hóa. Hãy thêm dòng sau vào khối `server` trong file cấu hình Nginx của bạn:

ssl_protocols TLSv1.2 TLSv1.3;

Tiếp theo, hãy chỉ định các bộ mật mã (cipher suite) mạnh mẽ mà máy chủ sẽ ưu tiên sử dụng. Điều này ngăn chặn việc sử dụng các thuật toán mã hóa yếu, dễ bị bẻ khóa.

ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Hình minh họa

Một tính năng bảo mật quan trọng khác là HTTP Strict Transport Security (HSTS). Khi được bật, nó yêu cầu trình duyệt luôn luôn kết nối với website của bạn qua HTTPS trong một khoảng thời gian nhất định. Tuy nhiên, hãy thận trọng khi sử dụng HSTS với chứng chỉ tự ký. Nếu người dùng chưa thêm chứng chỉ của bạn vào danh sách tin cậy, họ sẽ không thể bỏ qua cảnh báo để truy cập website.

Best Practices

Để việc quản lý và sử dụng chứng chỉ SSL tự ký trở nên an toàn và hiệu quả, hãy tuân thủ một vài nguyên tắc cơ bản sau đây. Đây là những kinh nghiệm thực tế giúp bạn tránh được các rủi ro không đáng có.

  • Luôn sao lưu key và certificate an toàn: Private key là chìa khóa của hệ thống mã hóa. Hãy cất giữ nó ở một nơi an toàn, được mã hóa và hạn chế quyền truy cập. Mất private key đồng nghĩa với việc bạn phải tạo lại toàn bộ chứng chỉ.
  • Không sử dụng chứng chỉ tự ký trên môi trường production: Chứng chỉ tự ký rất hữu ích cho môi trường dev, test hoặc nội bộ. Tuy nhiên, đối với website công khai, hãy luôn sử dụng chứng chỉ được cấp bởi một CA uy tín (như Let’s Encrypt – miễn phí) để đảm bảo trải nghiệm người dùng tốt nhất và không gây ra các cảnh báo bảo mật.
  • Định kỳ tạo lại chứng chỉ mới khi hết hạn: Chứng chỉ SSL luôn có thời hạn. Hãy đặt lịch nhắc nhở để tạo và triển khai chứng chỉ mới trước khi chứng chỉ cũ hết hạn, tránh làm gián đoạn dịch vụ.
  • Thường xuyên cập nhật OpenSSL và Nginx: Luôn giữ cho các phần mềm trên máy chủ của bạn được cập nhật lên phiên bản mới nhất. Điều này giúp vá các lỗ hổng bảo mật đã được phát hiện và đảm bảo hệ thống của bạn luôn được bảo vệ tốt nhất.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua toàn bộ quy trình tạo và cấu hình một chứng chỉ SSL tự ký cho máy chủ Nginx chạy trên CentOS 7. Bạn đã hiểu rõ hơn về SSL, lợi ích của việc mã hóa, cũng như các bước thực hành chi tiết từ cài đặt OpenSSL, tạo key, cho đến việc tinh chỉnh Nginx và khắc phục các lỗi thường gặp.

Việc sử dụng chứng chỉ tự ký là một kỹ năng quan trọng đối với bất kỳ nhà phát triển hay quản trị hệ thống nào. Nó mang lại sự linh hoạt và tiết kiệm chi phí cho các môi trường không yêu cầu sự tin cậy công khai. Bùi Mạnh Đức khuyến khích bạn hãy tự mình thực hành các bước trên để làm quen và nâng cao kỹ năng bảo mật cho các dự án của mình. Khi website của bạn sẵn sàng để ra mắt công chúng, bước tiếp theo tự nhiên sẽ là chuyển sang sử dụng một chứng chỉ SSL được xác thực bởi CA để mang lại sự tin tưởng tuyệt đối cho người dùng.

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan