TLS, hay “transport layer security” (bảo mật lớp vận chuyển) — và SSL tiền thân của nó — là các giao thức được sử dụng để bọc lưu lượng truy cập bình thường trong một trình bao bọc được mã hóa, bảo vệ. Sử dụng công nghệ này, các máy chủ có thể gửi thông tin đến máy khách của họ một cách an toàn mà không bị bên ngoài chặn hoặc đọc tin nhắn của họ.
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 ý: 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, 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. Do đó, người dùng của bạn sẽ thấy lỗi bảo mật khi truy cập trang web của bạn.
Do hạn chế này, chứng chỉ tự ký không phù hợp với môi trường sản xuất phục vụ công chúng. Chúng thường được sử dụng để thử nghiệm 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 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 liên lạc thay thế.
Để có giải pháp chứng chỉ sẵn sàng sản xuất hơn, hãy xem Let's Encrypt, 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à thiết lập cấu hình chứng chỉ Let's Encrypt trong hướng dẫn Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 20.04 của chúng tôi.
Trước khi bắt đầu hướng dẫn này, bạn sẽ cần những thứ sau:
apt
. Trước tiên, hãy cập nhật chỉ mục gói cục bộ để phản ánh những thay đổi ngược dòng mới nhất:- sudo apt update
Sau đó, cài đặt gói apache2
:
- sudo apt install apache2
Và cuối cùng, nếu bạn đã thiết lập tường lửa ufw
, hãy mở các cổng http
và https
:
- sudo ufw allow "Apache Full"
Sau khi các bước này hoàn tất, hãy đảm bảo rằng bạn đã đăng nhập với tư cách là non-root user của mình và tiếp tục với hướng dẫn.
mod_ssl
Trước khi chúng tôi có thể sử dụng bất kỳ chứng chỉ SSL nào, trước tiên chúng tôi phải bật mod_ssl
, một mô-đun Apache cung cấp hỗ trợ mã hóa SSL.
Bật mod_ssl
bằng 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
hiện đã được bật và sẵn sàng để sử dụng.
Bây giờ Apache đã sẵn sàng sử dụng mã hóa, chúng ta có thể chuyển sang tạo 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ẽ được kèm theo một tệp khóa 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 các tệp chứng chỉ và khóa SSL 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
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 điều gì đang xảy ra trong lệnh mà chúng ta đang phát hành:
openssl
: Đây là công cụ dòng lệnh để tạo và quản lý chứng chỉ OpenSSL, khóa và các tệp khác.req -x509
: Điều này chỉ định rằng chúng tôi 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 cơ sở hạ tầng khóa công khai mà SSL và TLS tuân thủ để quản lý khóa và chứng chỉ.-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 tôi bằng cụm mật khẩu. Chúng tôi 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. Cụm mật khẩu sẽ ngăn điều này xảy ra vì chúng tôi 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 tôi đặt nó trong 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ó giá trị lâu hơn một năm.-newkey rsa:2048
: Điều này chỉ định rằng chúng tôi muốn tạo chứng chỉ mới và khóa mới cùng một lúc. Chúng tôi đã không tạo khóa cần thiết để ký chứng chỉ trong bước trước, vì vậy chúng tôi 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 tôi đang tạo.-out
: Điều này cho OpenSSL biết nơi đặt chứng chỉ mà chúng tôi đang tạo.Đ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
. 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 khớp với bất kỳ nội dung nào bạn sẽ nhập vào thanh địa chỉ của trình duyệt để truy cập trang web, vì trường không khớp sẽ gây ra nhiều lỗi bảo mật hơn.
Danh sách đầy đủ các lời nhắc sẽ giố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 trong /etc/ssl
.
Tiếp theo, chúng tôi sẽ cập nhật cấu hình Apache của mình để sử dụng chứng chỉ và khóa mới.
Bây giờ chúng tôi đã có sẵn chứng chỉ và khóa tự ký, chúng tôi 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 các 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 quá 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 tôi 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 Apache <Virtualhost>
và chỉ cần thêm SSL vào đó, 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 tôi sẽ xử lý cẩn thận của 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 vào cấu hình Virtualhost tối thiểu sau:
<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>
Đảm bảo cập nhật dòng ServerName
theo cách bạn định đặt địa chỉ cho 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 rằng bất kỳ thứ gì bạn chọn khớp với Common Name
mà bạn đã chọn khi tạo chứng chỉ.
Các dòng còn lại chỉ định một thư mục DocumentRoot
để phục vụ các tệp từ đó và các tùy chọn SSL cần thiết để trỏ Apache tới chứng chỉ và khóa mới được tạo của chúng tôi.
Bây giờ, hãy tạo DocumentRoot
của chúng tôi và đặt một tệp HTML vào đó chỉ cho mục đích thử nghiệm:
- sudo mkdir /var/www/your_domain_or_ip
Mở tệp index.html
mới bằng 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 đoạn sau vào tệp trống:
<h1>it worked!</h1>
Tất nhiên, đây không phải là một tệp HTML đầy đủ, nhưng các trình duyệt rất nhẹ nhàng và nó sẽ đủ để xác minh cấu hình của chúng tôi.
Lưu và đóng tệp Next, chúng ta cần kích hoạt tệp cấu hình bằng 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ứ thành công, bạn sẽ nhận được kết quả như sau:
OutputAH00558: 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 lệnh ServerName
không được đặt trên toàn cầu. Nếu 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ủ trong /etc/apache2/apache2.conf
. Đây là tùy chọn vì tin nhắn 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 tôi có thể tải lại Apache một cách an toàn để thực hiện các thay đổi của mình:
- sudo systemctl reload apache2
Bây giờ hãy tải trang web của bạn trong trình duyệt, đảm bảo sử dụng https://
ngay từ đầ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 tôi không được ký bởi bất kỳ cơ quan cấp chứng chỉ nào đã biết. Đối với mục đích thử nghiệm và sử dụng cá nhân, điều này có thể ổn. Bạn sẽ có thể nhấp qua để advanced hoặc more information và chọn tiếp tục.
Sau khi bạn làm như vậy, trình duyệt của bạn sẽ tải tin nhắn it worked!
.
Lưu ý: nếu trình duyệt của bạn hoàn toàn không kết nối với máy chủ, hãy đảm bảo rằng 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ổng 80
và 443
:
- sudo ufw allow "Apache Full"
Tiếp theo, chúng tôi 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 đơn giản và chuyển hướng chúng sang HTTPS.
Hiện tại, cấu hình của chúng tôi sẽ chỉ phản hồi các yêu cầu HTTPS trên cổng 443
. Bạn cũng nên phản hồi trên cổng 80
, ngay cả khi bạn muốn buộc tất cả lưu lượng truy cập phải được mã hóa. Hãy thiết lập Virtualhost
để phản hồi các yêu cầu không được mã hóa này và chuyển hướng chúng sang HTTPS.
Mở cùng một tệp cấu hình Apache mà chúng tôi đã bắt đầu ở các bước trước:
- sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
Ở dưới cùng, 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 lệnh 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 SSL VirtualHost
. Đảm bảo bao gồm dấu gạch chéo:
<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 tất, 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://
thuần túy phía trước địa chỉ. Bạn sẽ được tự động chuyển hướng đến https://
.
Bây giờ bạn đã thiết lập 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 được mã hóa sang HTTPS.
Nếu bạn dự định sử dụng SSL cho một trang web công cộng, bạn nên xem xét việc mua một tên miền và sử dụng 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ề cách sử dụng Let's Encrypt với Apache, vui lòng đọc hướng dẫn Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 20.04 của chúng tôi.