Hướng Dẫn Tạo Chứng Chỉ SSL Tự Ký Cho Apache Trên Ubuntu 22.04: Bảo Mật Website Nhanh Chóng

Hướng Dẫn Tạo Chứng Chỉ SSL Tự Ký Cho Apache Trên Ubuntu 22.04: Bảo Mật Website Nhanh Chóng

TLS (Transport Layer Security), tiền thân của SSL, là các giao thức bảo mật giúp mã hóa và bảo vệ lưu lượng truy cập mạng, đảm bảo rằng thông tin truyền tải giữa máy chủ và khách hàng luôn an toàn, không bị chặn hoặc đọc trộm bởi bên thứ ba.

DataOnline sẽ hướng dẫn bạn học cách tạo và sử dụng chứng chỉ TLS tự ký cho máy chủ web Apache trên Ubuntu 22.04. Bạn sẽ sử dụng công cụ dòng lệnh OpenSSL để tạo chứng chỉ TLS, sau đó cấu hình Apache để sử dụng chứng chỉ này, giúp nâng cao bảo mật cho các kết nối đến trang web của bạn.

Lưu ý: Một 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ỳ khách hàng nào. Tuy nhiên, vì chứng chỉ này không được ký bởi các tổ chức chứng thực đáng tin cậy có sẵn trong trình duyệt và hệ điều hành, người dùng sẽ không thể tự động xác thực danh tính của máy chủ. Do đó, khi truy cập trang web của bạn, người dùng sẽ thấy cảnh báo bảo mật.

Vì hạn chế này, chứng chỉ tự ký không phù hợp cho môi trường sản xuất phục vụ công chúng. Chúng thường được sử dụng cho mục đích thử nghiệm, hoặc để bảo mật các dịch vụ không quan trọng, chỉ dành cho một người dùng hoặc một nhóm nhỏ người dùng có thể xác minh tính hợp lệ của chứng chỉ qua các kênh giao tiếp thay thế.

Đối với giải pháp chứng chỉ sẵn sàng cho sản xuất, hãy tham khảo Let’s Encrypt – một tổ chức chứng thực miễn phí. Bạn có thể tìm hiểu cách tải và cấu hình chứng chỉ Let’s Encrypt qua bài hướng dẫn “Cách Bảo Mật Apache với Let’s Encrypt trên Ubuntu 22.04”.

Yêu Cầu

Trước khi bắt đầu hướng dẫn này, bạn cần:

  • Truy cập đến một máy chủ Ubuntu 22.04 với một tài khoản không phải root có quyền sudo. Bạn có thể tham khảo hướng dẫn “Thiết lập máy chủ ban đầu với Ubuntu” của DataOnline để biết cách tạo tài khoản này.

  • Cài đặt Apache. Bạn có thể cài đặt Apache bằng apt. Trước tiên, cập nhật chỉ mục gói cục bộ để có những thay đổi mới nhất từ nguồn:

  • sudo apt update
  • Sau đó, cài đặt gói apache2:

  • sudo apt install apache2
  • Cuối cùng, nếu bạn đã cấu hình tường lửa ufw, mở các cổng http và https:

    sudo ufw allow "Apache Full"

Sau khi hoàn tất các bước trên, hãy chắc chắn rằng bạn đang đăng nhập bằng tài khoản không phải root và tiếp tục với hướng dẫn dưới đây.

Bước 1 – Kích hoạt mod_ssl

Trước khi sử dụng bất kỳ chứng chỉ TLS nào, bạn cần kích hoạt mod_ssl, một module của Apache cung cấp hỗ trợ mã hóa SSL.

Kích hoạt mod_ssl bằng lệnh a2enmod:

sudo a2enmod ssl

Sau đó, khởi động lại Apache để kích hoạt module:

sudo systemctl restart apache2

Module mod_ssl đã được kích hoạt và sẵn sàng sử dụng.

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

Bây giờ, khi Apache đã sẵn sàng sử dụng mã hóa, chúng ta tiến hành tạo chứng chỉ TLS mới. Chứng chỉ sẽ lưu trữ một số thông tin cơ bản về trang web của bạn và đi kèm với một file khóa (key file) cho phép máy chủ xử lý dữ liệu mã hóa một cách an toàn.

Chúng ta có thể tạo file khóa TLS và chứng chỉ bằng lệnh openssl:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Các tham số của lệnh trên được giải thích như sau:

  • openssl: Công cụ dòng lệnh để tạo và quản lý chứng chỉ OpenSSL, khóa và các file liên quan.

  • req -x509: Xác định rằng chúng ta sử dụng X.509 certificate signing request (CSR) cho việc quản lý. X.509 là một tiêu chuẩn cơ sở hạ tầng khóa công khai mà TLS tuân theo để quản lý khóa và chứng chỉ.

  • -nodes: Cho OpenSSL biết bỏ qua bước bảo vệ chứng chỉ bằng passphrase. Chúng ta cần Apache có thể đọc file mà không cần can thiệp của người dùng khi khởi động máy chủ. Nếu có passphrase, chúng ta sẽ 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 coi là hợp lệ, ở đây là 1 năm. Nhiều trình duyệt hiện đại sẽ từ chối các chứng chỉ có thời gian hợp lệ quá 1 năm.

  • -newkey rsa:2048: Tạo một chứng chỉ mới và một khóa mới cùng lúc. Vì chúng ta chưa tạo sẵn khóa để ký chứng chỉ, nên cần tạo cùng lúc. Phần rsa:2048 chỉ định tạo một khóa RSA dài 2048 bit.

  • -keyout: Chỉ định nơi lưu file khóa riêng (Private Key) được tạo.

  • -out: Chỉ định nơi lưu chứng chỉ được tạo.

Sau khi nhập lệnh, bạn sẽ được nhắc nhập thông tin về trang web của mình. Dòng quan trọng nhất là “Common Name” – bạn cần nhập tên miền hoặc địa chỉ IP công cộng mà bạn sẽ dùng để truy cập máy chủ. Điều này rất quan trọng vì thông tin này phải khớp với nội dung bạn nhập vào trình duyệt, nếu không sẽ gây ra lỗi bảo mật.

Danh sách đầy đủ các trường nhập có thể sẽ trông như sau:

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com

Cả hai file bạn tạo sẽ được lưu vào các thư mục thích hợp dưới /etc/ssl.

Tiếp theo, chúng ta sẽ cập nhật cấu hình Apache để sử dụng chứng chỉ và khóa mới này.

Bước 3 – Cấu hình Apache sử dụng TLS

Giờ đây, khi bạn đã có chứng chỉ tự ký và file khóa, cần cập nhật cấu hình Apache để sử dụng chúng. Trên Ubuntu, bạn có thể đặt các file cấu hình mới của Apache (các file này phải kết thúc bằng .conf) vào thư mục /etc/apache2/sites-available/. Các file này sẽ được tải lên lần kế tiếp khi quá trình Apache được tải lại hoặc khởi động lại.

Trong hướng dẫn này, chúng ta sẽ tạo một file cấu hình tối giản mới. (Nếu bạn đã có một khối <VirtualHost> cho Apache và chỉ cần thêm TLS, bạn có thể cần sao chép các dòng cấu hình bắt đầu bằng SSL và chuyển VirtualHost từ cổng 80 sang 443. Chúng ta sẽ xử lý cổng 80 trong bước tiếp theo.)

Mở một file mới trong thư mục /etc/apache2/sites-available:

sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Dán vào file cấu hình VirtualHost tối giản sau:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:443>
   ServerName your_domain_or_ip
   DocumentRoot /var/www/your_domain_or_ip

   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

Hãy chắc chắn cập nhật dòng ServerName theo cách bạn muốn truy cập máy chủ (có thể là hostname, tên miền đầy đủ hoặc địa chỉ IP). Đảm bảo rằng giá trị này khớp với Common Name bạn đã nhập khi tạo chứng chỉ.

Những dòng còn lại chỉ định thư mục DocumentRoot phục vụ các file và các tham số TLS cần thiết để chỉ cho Apache biết vị trí chứng chỉ và file khóa mới tạo.

Tiếp theo, tạo thư mục DocumentRoot và thêm một file HTML đơn giản để kiểm tra:

sudo mkdir /var/www/your_domain_or_ip

Mở file index.html với trình soạn thảo:

sudo nano /var/www/your_domain_or_ip/index.html

Dán nội dung sau vào file:

/var/www/your_domain_or_ip/index.html
<h1>it worked!</h1>

Lưu ý: Đây không phải là một file HTML hoàn chỉnh, nhưng các trình duyệt sẽ chấp nhận và đủ để xác nhận cấu hình của bạn.

Lưu và đóng file. Sau đó, kích hoạt file cấu hình với công cụ a2ensite:

sudo a2ensite your_domain_or_ip.conf

Tiếp theo, kiểm tra lỗi cấu hình:

sudo apache2ctl configtest

Nếu mọi thứ đều thành công, bạn sẽ thấy thông báo như sau:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Dòng đầu tiên chỉ ra rằng chỉ thị ServerName chưa được đặt ở cấp toàn cục. Nếu muốn loại bỏ thông báo này, bạn có thể thiết lập ServerName cho tên miền hoặc địa chỉ IP của máy chủ trong file /etc/apache2/apache2.conf – đây là tùy chọn, vì thông báo này không gây hại gì.

Nếu bạn nhận được “Syntax OK”, nghĩa là file cấu hình không có lỗi cú pháp. Bạn có thể an tâm tải lại Apache để áp dụng các thay đổi:

sudo systemctl reload apache2

Giờ hãy mở trang web của bạn trong trình duyệt, nhớ sử dụng https:// ở đầu địa chỉ.

Bạn sẽ thấy một cảnh báo lỗi. Đây là điều bình thường với chứng chỉ tự ký! Trình duyệt cảnh báo rằng không thể xác minh danh tính máy chủ vì chứng chỉ không được ký bởi bất kỳ tổ chức chứng thực nào mà trình duyệt biết. Trong mục đích thử nghiệm và sử dụng cá nhân, bạn có thể chọn “nâng cao” hoặc “xem thêm thông tin” và tiếp tục truy cập trang web.

Sau khi chấp nhận cảnh báo, trang web của bạn sẽ hiển thị thông báo “it worked!”.

Lưu ý: Nếu trình duyệt không thể kết nối với máy chủ, hãy kiểm tra lại kết nối có bị chặn bởi tường lửa hay không. Nếu bạn sử dụng ufw, các lệnh sau sẽ mở các cổng 80 và 443:

sudo ufw allow "Apache Full"

Tiếp theo, chúng ta sẽ thêm một khối VirtualHost khác để phục vụ các yêu cầu HTTP thông thường và chuyển hướng chúng về HTTPS.

Bước 4 – Chuyển hướng HTTP sang HTTPS

Hiện tại, cấu hình của bạn chỉ phản hồi các yêu cầu HTTPS trên cổng 443. Thực hành tốt là phản hồi trên cổng 80, ngay cả khi bạn muốn buộc toàn bộ lưu lượng truy cập được mã hóa. Hãy thiết lập một VirtualHost để phản hồi các yêu cầu không mã hóa này và chuyển hướng chúng sang HTTPS.

Mở lại file cấu hình Apache mà bạn đã tạo:

sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Ở cuối file, tạo thêm một khối VirtualHost để xử lý các yêu cầu trên cổng 80. Sử dụng chỉ thị ServerName để khớp với tên miền hoặc địa chỉ IP của bạn, sau đó dùng lệnh Redirect để chuyển hướng tất cả các yêu cầu sang VirtualHost TLS. Hãy nhớ thêm dấu gạch chéo ở cuối:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:80>
    ServerName your_domain_or_ip
    Redirect / https://your_domain_or_ip/
</VirtualHost>

Lưu và đóng file. Sau đó, kiểm tra lại cấu hình:

sudo apachectl configtest
sudo systemctl reload apache2

Bạn có thể kiểm tra chức năng chuyển hướng mới bằng cách truy cập trang web với http:// ở đầu địa chỉ. Bạn sẽ được tự động chuyển hướng sang https://.

Kết luận

Tuy nhiên, nếu bạn có kế hoạch sử dụng TLS cho một trang web công khai, việc sử dụng chứng chỉ TLS tự ký có thể không đủ độ tin cậy với người dùng. Trong trường hợp này, bạn nên cân nhắc đăng ký tên miền và sử dụng tổ chức chứng thực (CA) được công nhận rộng rãi, chẳng hạn như Let’s Encrypt, để có chứng chỉ TLS miễn phí và được duyệt bởi hầu hết các trình duyệt web. Điều này không chỉ giúp bảo mật kết nối mà còn tạo sự tin tưởng cho người dùng khi họ truy cập vào trang web của bạn.

Để tìm hiểu chi tiết về cách cài đặt và sử dụng Let’s Encrypt trên Apache trên Ubuntu 22.04, bạn có thể tham khảo hướng dẫn của chúng tôi với tiêu đề Cách Bảo Mật Apache với Let’s Encrypt trên Ubuntu 22.04. Hướng dẫn này sẽ giúp bạn thiết lập và cấu hình chứng chỉ SSL từ Let’s Encrypt, đồng thời tối ưu hóa bảo mật cho website của bạn mà không cần phải chi trả chi phí cho chứng chỉ TLS thương mại.

Để 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 *