TLS, hay “bảo mật tầng giao vận” – và người tiền nhiệm của nó là SSL – là các giao thức được dùng để bọc lưu lượng truy cập thông thường trong một lớp bảo vệ và mã hóa. Sử dụng công nghệ này, các máy chủ có thể gửi thông tin an toàn đến máy khách mà không lo tin nhắn của họ bị chặn hoặc đọc bởi bên thứ ba.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tạo và sử dụng chứng chỉ SSL tự ký với máy chủ web Apache trên Ubuntu 20.04.
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ỳ 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 và hệ điều hành, người dùng không thể sử dụng chứng chỉ để tự động xác thực danh tính của máy chủ của bạn. Kết quả là, người dùng sẽ thấy một lỗi bảo mật khi truy cập trang web của bạn.
Do giới hạn 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 để kiểm tra, hoặc để bảo mật các dịch vụ không quan trọng được sử dụng bởi một người dùng duy nhất hoặc một nhóm nhỏ người dùng có thể thiết lập niềm tin vào tính hợp lệ của chứng chỉ thông qua các kênh truyền thông thay thế.
Để có giải pháp chứng chỉ sẵn sàng hơn cho sản xuất, hãy xem xét Let’s Encrypt, một cơ quan cấp chứng chỉ miễn phí. Bạn có thể tìm hiểu cách tải xuống và cấu hình chứng chỉ Let’s Encrypt trong hướng dẫn Cách Bảo mật Apache với Let’s Encrypt trên Ubuntu 20.04 của chúng tôi.
Điều kiện tiên quyết
Trước khi bắt đầu hướng dẫn này, bạn sẽ cần những thứ sau:
● Quyền truy cập vào máy chủ Ubuntu 20.04 với người dùng không phải root, có quyền sudo. Hướng dẫn Thiết lập Máy chủ Ban đầu với Ubuntu 20.04 của chúng tôi có thể chỉ cho bạn cách tạo tài khoản này.
● Bạn cũng sẽ cần cài đặt Apache. Bạn có thể cài đặt Apache bằng apt
. Đầu tiên, cập nhật chỉ mục gói cục bộ để phản ánh các thay đổi từ nguồn:
sudo apt update
● Sau đó, cài đặt gói apache2
:
sudo apt install apache2
● Và cuối cùng, nếu bạn có tường lửa ufw
đang hoạt động, hãy mở cổng http
và https
:
sudo ufw allow "Apache Full"
Sau khi hoàn thành các bước này, hãy đảm bảo bạn đã đăng nhập bằng người dùng không phải root và tiếp tục với hướng dẫn.
Bước 1 – Bật mod_ssl
Trước khi có thể sử dụng bất kỳ chứng chỉ SSL nào, trước tiên chúng ta phải bật mod_ssl
, một mô-đun Apache cung cấp hỗ trợ cho mã hóa SSL.
Bật mod_ssl
với lệnh a2enmod
:
sudo a2enmod ssl
Khởi động lại Apache để kích hoạt mô-đun:
sudo systemctl restart apache2
Mô-đun mod_ssl
giờ đã được bật và sẵn sàng sử dụng.
Bước 2 – Tạo Certificate SSL
Bây giờ Apache đã sẵn sàng sử dụng mã hóa, chúng ta có thể tiếp tục tạo một chứng chỉ SSL 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à sẽ đi kèm với một tệp key cho phép máy chủ xử lý dữ liệu được mã hóa một cách an toàn.
Chúng ta có thể tạo tệp key và chứng chỉ SSL với 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
Sau khi nhập lệnh, bạn sẽ được đưa đến một dấu nhắc nơi bạn có thể nhập thông tin về trang web của mình. Trước khi chúng ta xem xét điều đó, hãy xem xét những gì đang xảy ra trong lệnh chúng ta đang phát ra:
● openssl
: Đây là công cụ dòng lệnh để tạo và quản lý chứng chỉ, key và các tệp OpenSSL khác.
● req -x509
: Điều 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ỉ (CSR) X.509. 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ủ cho việc quản lý key và chứng chỉ.
● -nodes
: Điều này cho OpenSSL biết 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 Apache 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. Một 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 nó sau mỗi lần khởi động lại.
● -days 365
: Tùy chọn này đặt thời gian mà chứng chỉ sẽ được coi là hợp lệ. Chúng ta đặt nó cho một năm ở đây. Nhiều trình duyệt hiện đại sẽ từ chối bất kỳ chứng chỉ nào có hiệu lực lâu hơn một năm.
● -newkey rsa:2048
: Điều này 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 một lúc. Chúng ta không tạo key cần thiết để ký chứng chỉ trong bước trước đó, vì vậy chúng ta cần tạo nó cùng với chứng chỉ. Phần rsa:2048
cho biết nó tạo một key RSA dài 2048 bit.
● -keyout
: Dòng này cho OpenSSL biết nơi để đặt tệp Private Key được tạo ra 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.
Điền vào các dấu nhắc một cách thích hợp. Dòng quan trọng nhất là dòng yêu cầu Tên thông dụng. Bạn cần nhập tên máy chủ mà bạn sẽ sử dụng để truy cập máy chủ, hoặc IP công khai của máy chủ. Điều quan trọng là trường này phải khớp với bất cứ thứ gì bạn sẽ nhập vào thanh địa chỉ của trình duyệt để truy cập trang web, vì sự không khớp sẽ gây ra thêm lỗi bảo mật.
Danh sách đầy đủ các dấu nhắc sẽ trông như thế này:
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 tệp bạn tạo sẽ được đặt trong các thư mục con thích hợp dưới /etc/ssl
.
Tiếp theo, chúng ta sẽ cập nhật cấu hình Apache của mình để sử dụng chứng chỉ và key mới.
Bước 3 – Cấu hình Apache để sử dụng SSL
Bây giờ chúng ta đã có chứng chỉ tự ký và key, chúng ta cần cập nhật cấu hình Apache của mình để sử dụng chúng. Trên Ubuntu, bạn có thể đặt tệp cấu hình Apache mới (chúng phải kết thúc bằng .conf
) vào /etc/apache2/sites-available/
và chúng sẽ được tải vào lần tiếp theo khi quy trình Apache được tải lại hoặc khởi động lại.
Đối với hướng dẫn này, chúng ta sẽ tạo một tệp cấu hình tối thiểu mới. (Nếu bạn đã thiết lập <Virtualhost>
Apache và chỉ cần thêm SSL vào nó, 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 cổng VirtualHost
từ 80
sang 443
. Chúng ta sẽ xử lý cổng 80
trong bước tiếp theo.)
Mở một tệp mới trong thư mục /etc/apache2/sites-available:
sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
Dán cấu hình VirtualHost tối thiểu sau đây:
/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 dự định giao tiếp với máy chủ của mình. Đây có thể là tên máy chủ, tên miền đầy đủ hoặc địa chỉ IP. Đảm bảo bất cứ thứ gì bạn chọn đều khớp với Common Name
bạn đã chọn khi tạo chứng chỉ.
Các dòng còn lại chỉ định thư mục DocumentRoot
để phục vụ tệp từ đó, và các tùy chọn SSL cần thiết để hướng Apache đến chứng chỉ và key mới tạo của chúng ta.
Bây giờ, hãy tạo DocumentRoot
của chúng ta và đặt một tệp HTML vào đó chỉ để mục đích kiểm tra:
sudo mkdir /var/www/your_domain_or_ip
Mở một tệp index.html
mới với trình soạn thảo văn bản của bạn:
sudo nano /var/www/your_domain_or_ip/index.html
Dán nội dung sau vào tệp trống:
/var/www/your_domain_or_ip/index.html
<h1>it worked!</h1>
Đây dĩ nhiên không phải là một tệp HTML đầy đủ, nhưng các trình duyệt thường khoan dung và nó sẽ đủ để xác minh cấu hình của chúng ta.
Lưu và đóng tệp. Tiếp theo, chúng ta cần bật tệp cấu hình với công cụ a2ensite
:
sudo a2ensite your_domain_or_ip.conf
Tiếp theo, hãy 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ẽ nhận được kết quả trông như thế này:
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 là một thông báo cho bạn biết rằng chỉ thị ServerName
không được đặt toàn cục. Nếu bạn muốn loại bỏ thông báo đó, bạn có thể đặt ServerName
thành tên miền hoặc địa chỉ IP của máy chủ của bạn trong /etc/apache2/apache2.conf
. Điều này là tùy chọn vì thông báo sẽ không gây hại.
Nếu đầu ra của bạn có Syntax OK
trong đó, tệp cấu hình của bạn không có lỗi cú pháp. Chúng ta có thể tải lại Apache một cách an toàn để triển khai các thay đổi của mình:
sudo systemctl reload apache2
Bây giờ tải trang web của bạn trong trình duyệt, nhớ sử dụng https://
ở đầu.
Bạn sẽ thấy một lỗi. Điều này là bình thường đối với chứng chỉ tự ký! Trình duyệt đang cảnh báo bạn rằng nó không thể xác minh danh tính của máy chủ, vì chứng chỉ của chúng ta không được ký bởi bất kỳ cơ quan cấp chứng chỉ đã biết nào của nó. Đối với mục đích kiểm tra và sử dụng cá nhân, điều này có thể chấp nhận được. Bạn sẽ có thể nhấp vào nâng cao hoặc thêm thông tin và chọn tiếp tục. Sau khi làm như vậy, trình duyệt của bạn sẽ tải thông báo it worked!
.
Lưu ý: nếu trình duyệt của bạn không kết nối được với máy chủ, hãy đảm bảo kết nối của bạn không bị chặn bởi tường lửa. Nếu bạn đang sử dụng
ufw
, các lệnh sau sẽ mở cổng80
và443
:
sudo ufw allow "Apache Full"
Tiếp theo, chúng ta sẽ thêm một phần VirtualHost
khác vào cấu hình của mình để phục vụ các yêu cầu HTTP thông thường và chuyển hướng chúng đến HTTPS.
Bước 4 – Chuyển hướng HTTP sang HTTPS
Hiện tại, cấu hình của chúng ta sẽ chỉ phản hồi các yêu cầu HTTPS trên cổng 443
. Thông lệ tốt là cũng phản hồi trên cổng 80
, ngay cả khi bạn muốn bắt buộc tất cả lưu lượng phải đượ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 đến HTTPS.
Mở cùng một tệp cấu hình Apache mà chúng ta đã bắt đầu trong các bước trước:
sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
Ở cuối tệp, tạo một khối VirtualHost
khác để khớp với các yêu cầu trên cổng 80
. Sử dụng chỉ thị ServerName
để khớp lại tên miền hoặc địa chỉ IP của bạn. Sau đó, sử dụng Redirect
để khớp với bất kỳ yêu cầu nào và gửi chúng đến VirtualHost
SSL. Đảm bảo bao gồ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 tệp này khi bạn đã hoàn thành, sau đó kiểm tra lại cú pháp cấu hình của bạn, và tải lại Apache:
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 của mình với http://
đơn giản trước địa chỉ. Bạn sẽ tự động được chuyển hướng đến https://
.
Kết luận
Bây giờ bạn đã cấu hình Apache để phục vụ các yêu cầu được mã hóa bằng chứng chỉ SSL tự ký, và để chuyển hướng các yêu cầu HTTP không mã hóa sang HTTPS.
Nếu bạn đang có kế hoạch sử dụng SSL cho một trang web công khai, bạn nên xem xét việc mua một tên miền và sử dụng một cơ quan cấp chứng chỉ được hỗ trợ rộng rãi như Let’s Encrypt.
Để biết thêm thông tin về việc sử dụng Let’s Encrypt với Apache, vui lòng đọc hướng dẫn Cách Bảo mật Apache với Let’s Encrypt trên Ubuntu 20.04.