TLS (transport layer security) và SSL (secure sockets layer) là các giao thức web sử dụng để bọc lưu lượng thông tin trong một lớp bảo vệ được mã hóa. Khi sử dụng công nghệ này, server có thể gửi lưu lượng thông tin đến client một cách an toàn mà không bị chặn bởi bên thứ ba. Hệ thống chứng chỉ cũng giúp người dùng xác minh danh tính của các trang web mà họ đang kết nối. Trong bài viết hướng dẫn tạo chứng chỉ SSL trên Apache cho CentOS 7 này, bạn sẽ được học cách thiết lập một chứng chỉ SSL self-signed sử dụng với web server Apache trên server CentOS 7.
Lưu ý
Chứng chỉ self-signed sẽ mã hóa thông tin giao tiếp giữa server và bất kỳ client nào. Tuy nhiên, người dùng không thể sử dụng chứng chỉ để tự động xác minh danh tính server mình. Do đó, khi truy cập vào trang web người dùng sẽ thấy lỗi bảo mật.
Do giới hạn này, chứng chỉ self-signed không phù hợp phục vụ rộng rãi. Chứng chỉ 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 sử dụng bởi một người dùng hoặc một nhóm người dùng nhỏ.
Yêu cầu để tạo chứng chỉ SSL trên Apache cho CentOS 7
Trước khi bắt đầu các bước trong bài viết, bạn cần thực hiện:
- Bạn cần có quyền truy cập vào một server CentOS 7 với tài khoản người dùng non-root có quyền
sudo
. - Cài đặt web server Apache trên CentOS 7. (Bài viết hướng dẫn tại đây)
Sau khi cài đặt hoàn tất, bạn đăng nhập vào tài khoản người dùng non-root qua SSH và tiếp tục bước 1 dưới đây.
Bước 1: Cài đặt mod_ssl
Để cài đặt chứng chỉ self-signed, trước tiên bạn cần cài đặt mod_ssl
trên server. mod_ssl
là một module Apache cung cấp hỗ trợ mã hóa SSL. Bạn có thể cài đặt mod_ssl
bằng lệnh yum
:
sudo yum install mod_ssl
Module sẽ tự động bật trong quá trình cài đặt. Apache sẽ bắt đầu sử dụng chứng chỉ SSL sau khi được khởi động lại. Bạn không cần làm thêm gì khác để sử dụng mod_ssl
.
Bước 2: Tạo chứng chỉ mới
Sau khi Apache đã sẵn sàng mã hóa, bạn có thể tạo một chứng chỉ SSL mới. TLS/SSL hoạt động bằng cách sử dụng kết hợp chứng chỉ công khai và khóa riêng tư. Khóa SSL được giữ bí mật trên server, được sử dụng để mã hóa nội dung gửi cho các client. Chứng chỉ SSL được chia sẻ công khai với người yêu cầu nội dung. Chứng chỉ còn sử dụng để giải mã nội dung được ký bằng khóa SSL liên quan.
Thư mục /etc/ssl/certs
được sử dụng để chứa chứng chỉ công khai đã tồn tại trên server. Bạn cũng cần tạo một thư mục /etc/ssl/private
để chứa file khóa riêng tư. Tính bảo mật của khóa này là rất quan trọng. Vì vậy, việc khóa các quyền truy cập để ngăn truy cập trái phép là rất cần thiết:
sudo mkdir /etc/ssl/private
sudo chmod 700 /etc/ssl/private
Bây giờ, bạn có thể tạo một cặp khóa và chứng chỉ self-signed với OpenSSL chỉ bằng một lệnh duy nhất:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Bạn sẽ được hỏi một loạt các câu hỏi khi thực hiện chạy lệnh này. Trước khi thực hiện, bạn cần tìm hiểu các thành phần trong lệnh:
- openssl: Đây là công cụ command line cơ bản để tạo và quản lý chứng chỉ OpenSSL, khóa và các file khác.
- req: Lệnh con này chỉ định rằng bạn muốn sử dụng certificate signing request (CSR) X.509. “X.509” là một tiêu chuẩn cơ sở khóa công khai mà SSL và TLS tuân thủ theo để quản lý khóa và chứng chỉ. Bạn muốn tạo một chứng chỉ X.509 mới nên bạn sử dụng lệnh con này.
- -x509: Tiếp tục sửa đổi lệnh con trước đó bằng cách cho tiện ích biết bạn muốn tạo chứng chỉ self-signed thay vì tạo certificate signing request như thường lệ.
- -nodes: Cho OpenSSL biết bỏ qua tùy chọn bảo vệ chứng chỉ bằng mật khẩu. Bạn cần Apache có thể đọc file mà không cần sự can thiệp của người dùng khi server khởi động lại. Mật khẩu sẽ ngăn cản điều này xảy ra vì bạn phải nhập mật khẩu sau mỗi lần khởi động lại.
- -days 365: Tùy chọn này xác định thời hạn có hiệu lực của chứng chỉ. Trong trường hợp này là 1 năm.
- -newkey rsa:2048 : Chỉ định bạn muốn tạo ra một chứng chỉ mới và một khóa mới cùng một lúc. Bạn chưa tạo khóa được yêu cầu để ký chứng chỉ trong bước trước đó. Vì vậy bạn cần tạo khóa cùng với chứng chỉ. Phần
rsa:2048
chỉ định tạo ra một khóa RSA có độ dài 2048 bit. - -keyout: Dòng này cho OpenSSL biết nơi đặt file khóa riêng tư được tạo ra.
- -out: Dòng này cho OpenSSL biết nơi đặt chứng chỉ được tạo ra.
Như đã trình bày ở trên, những tùy chọn này sẽ tạo ra cả file khóa và chứng chỉ. Bạn sẽ được yêu cầu trả lời một vài câu hỏi về server của bạn để nhúng chính xác thông tin phù hợp vào chứng chỉ.
Lưu ý: Nhập tên miền hoặc địa chỉ IP công khai của server của khi được yêu cầu nhập Common Name rất quan trọng (ví dụ: FQDN server hoặc tên của bạn). Giá trị nhập phải khớp với cách người dùng truy cập server của bạn.
Toàn bộ các câu hỏi sẽ như sau:
Output
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 đặt trong các thư mục con của thư mục /etc/ssl
.
Khi sử dụng OpenSSL, bạn cũng nên tạo một nhóm Diffie-Hellman sử dụng trong việc đàm phán Forward Secrecy tuyệt đối với các client.
Bạn có thể làm tạo nhóm Diffie-Hellman bằng cách gõ:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Có thể mất vài phút để tạo nhóm. Khi hoàn tất, bạn sẽ có một nhóm DH mạnh tại /etc/ssl/certs/dhparam.pem
mà bạn có thể sử dụng trong cấu hình của mình.
Như đã trình bày ở phần yêu cầu, để tạo chứng chỉ SSL trên Apache cho CentOS 7, đầu tiên bạn cần phải có một server CentOS 7. Nếu bạn chưa có server, bạn có thể tham khảo các gói dịch vụ VPS của Vietnix để tạo một server CentOS 7.
Vietnix hiện đang cung cấp nhiều gói dịch vụ VPS với cấu hình đa dạng và giá thành hợp lý, bao gồm VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS NVMe. Một số ưu điểm nổi bật của VPS Vietnix đó là:
- Tốc độ cao và ổn định.
- Hỗ trợ backup tự động hàng tuần.
- Hỗ trợ nhiều hệ điều hành, trong đó có CentOS 7.
- Kích hoạt nhanh chóng chỉ trong 5 phút và giao diện quản trị đơn giản.
- Tặng bản quyền theme & plugin WordPress trị giá đến 26.000.000 VND.
- Giá chỉ từ 89.000 VND/tháng, thuê chu kỳ dài thì giá càng rẻ.
Nếu bạn muốn biết thêm chi tiết hoặc cần được tư vấn, hãy liên hệ ngay Vietnix.
Bước 3: Thiết lập chứng chỉ
Bây giờ bạn đã có tất cả các thành phần cần thiết cho giao diện hoàn chỉnh. Tiếp theo là thiết lập các server ảo để hiển thị chứng chỉ mới.
Mở một file mới trong thư mục /etc/httpd/conf.d
:
sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
Dán vào đó đoạn cấu hình VirtualHost sau đây:
<VirtualHost *:443>
ServerName your_domain_or_ip
DocumentRoot /var/www/html
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 Server Name
phù hợp với cách bạn xác định địa chỉ server của mình. Đó có thể là một hostname, tên miền đầy đủ hoặc địa chỉ IP. Server Name
bạn chọn phải phù hợp với Common Name
mà bạn đã chọn khi tạo chứng chỉ.
Cài đặt thông số SSL an toàn
Tiếp theo, bạn sẽ thêm một số tùy chọn SSL bổ sung để tăng tính bảo mật cho trang web của mình. Các tùy chọn bạn sử dụng là các đề xuất từ Cipherlist.eu. Trang web này được thiết kế để cung cấp các thiết lập mã hóa dễ sử dụng cho phần mềm phổ biến.
Lưu ý: Các thiết lập mặc định được đề xuất trên Cipherlist.eu cung cấp bảo mật mạnh mẽ. Nhưng điều này có thể dẫn đến sự tương thích kém với các client cũ hơn. Nếu bạn cần hỗ trợ các khách hàng cũ, bạn có thể sử dụng một danh sách tương thích thay thế bằng cách nhấp vào liên kết có nhãn “Yes, give me a ciphersuite that works with legacy/old software.” . Danh sách tương thích có thể được sử dụng thay vì các đề xuất mặc định trong cấu hình. Sự lựa chọn của bạn sẽ phụ thuộc vào những gì bạn cần hỗ trợ.
Có một vài phần của cấu hình mà có thể bạn muốn sửa đổi. Bạn có thể thêm server DNS ưa thích của mình cho yêu cầu upstream vào chỉ thị resolver
. Trong bài viết này, bạn đã sử dụng của Google nhưng bạn có thể thay đổi sang DNS khác.
Bạn nên tìm hiểu thêm về HTTP Strict Transport Security hay HSTS và cụ thể về chức năng “preload”. Preloading HSTS cung cấp độ bảo mật tăng cường nhưng cũng có thể mang tới hậu quả lớn nếu bật sai cách. Trong bài viết này, bạn sẽ không preload các thiết lập nhưng có thể sửa đổi nếu chắc chắn rằng bạn hiểu rõ các ảnh hưởng của preload.
Các thay đổi khác mà bạn sẽ thực hiện là remove +TLSv1.3
và comment out chỉ thị SSLSessionTickets
và SSLOpenSSLConfCmd
. Hãy dán các thiết lập từ trang web sau khi kết thúc khối VirtualHost
:
. . .
</VirtualHost>
. . .
# Begin copied text
# from https://cipherli.st/
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.2
# SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off
Khi bạn hoàn thành các thay đổi này, bạn có thể lưu và đóng file.
Tạo chuyển hướng từ HTTP sang HTTPS (Không bắt buộc)
Server sẽ cung cấp cả lưu lượng HTTP không mã hóa và HTTPS được mã hóa. Để có sự an toàn hơn, đa số trường hợp được khuyến nghị chuyển hướng HTTP sang HTTPS tự động. Nếu bạn không muốn hoặc không cần chức năng này, bạn có thể bỏ qua phần này.
Để chuyển hướng tất cả lưu lượng để mã hóa SSL, bạn hãy tạo và mở một file có đuôi .conf
trong thư mục /etc/httpd/conf.d
:
sudo vi /etc/httpd/conf.d/non-ssl.conf
Bên trong file, tạo một khối VirtualHost
để phù hợp với các yêu cầu trên cổng 80. Sử dụng chỉ thị Server Name
để khớp lại tên miền hoặc địa chỉ IP của bạn. Sau đó, sử dụng Redirect
để khớp yêu cầu và gửi chúng đến SSL VirtualHost
. Hãy chắc chắn có dấu gạch chéo cuối cùng:
<VirtualHost *:80>
ServerName your_domain_or_ip
Redirect "/" "https://your_domain_or_ip/"
</VirtualHost>
Lưu và đóng file này khi bạn hoàn thành.
Bước 4: Áp dụng thay đổi cấu hình Apache
Bây giờ, bạn đã tạo chứng chỉ SSL và cấu hình web server để áp dụng chúng vào trang web của mình. Để áp dụng tất cả các thay đổi này và bắt đầu sử dụng mã hóa SSL, bạn có thể khởi động lại server Apache để tải lại cấu hình và các module.
Đầu tiên, kiểm tra file cấu hình của bạn có lỗi cú pháp hay không bằng cách nhập:
sudo apachectl configtest
Output kết thúc bằng Syntax OK
thì bạn có thể tiếp tục mà không gặp vấn đề gì. Nếu output của bạn không có phần này, hãy kiểm tra cú pháp của các file của bạn và thử lại:
Output
. . .
Syntax OK
Khởi động lại server Apache để áp dụng các thay đổi bằng cách nhập:
sudo systemctl restart httpd.service
Tiếp theo, hãy đảm bảo cổng 80 và 443 được mở trong tường lửa. Nếu bạn không chạy tường lửa, bạn có thể bỏ qua phần này.
Nếu bạn đang chạy tường lửa firewalld
, bạn có thể mở các cổng này bằng cách nhập:
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent
Nếu bạn đang chạy tường lửa iptables
, các lệnh bạn cần chạy phụ thuộc rất nhiều vào bộ quy tắc hiện tại của bạn. Đối với một bộ quy tắc cơ bản, bạn có thể thêm truy cập HTTP và HTTPS bằng cách nhập:
sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Bước 5: Kiểm tra mã hóa
Mở trình duyệt web và nhập https://
theo sau là tên server’s domain hoặc địa chỉ IP server của bạn vào thanh địa chỉ:
https://your_domain_or_ip
Bởi vì chứng chỉ mà bạn tạo ra không được ký bởi một trong các cơ quan chứng chỉ đáng tin cậy của trình duyệt nên bạn có thể sẽ thấy một cảnh báo giống như sau:
Điều này là bình thường. Bạn chỉ cần quan tâm đến khía cạnh mã hóa của chứng chỉ của bạn. Nhấp vào “ADVANCED” và sau đó nhấp vào liên kết được cung cấp để tiếp tục truy cập vào server:
Bạn sẽ được đưa đến trang web của bạn. Nếu nhìn vào thanh địa chỉ, bạn sẽ thấy một số dấu hiệu về bảo mật một phần. Đó có thể là một khóa với “x” bên trên hoặc một hình tam giác với một dấu chấm than. Chứng chỉ không thể được xác nhận và vẫn đang mã hóa kết nối của bạn.
Nếu bạn đã cấu hình Apache để chuyển hướng các yêu cầu HTTP sang HTTPS, bạn cũng có thể kiểm tra xem các chức năng chuyển hướng chính xác chưa:
http://your_domain_or_ip
Nếu kết quả dẫn đến cùng một biểu tượng thì có nghĩa là chuyển hướng của bạn hoạt động chính xác.
Nếu bạn cần thuê dịch vụ VPS để triển khai các dự án, Vietnix chính là địa chỉ bạn có thể yên tâm lựa chọn. Sau 10 năm hoạt động, Vietnix hiện đang là nhà cung cấp VPS tốc độ cao uy tín hàng đầu tại Việt Nam và được hơn 50.000 khách hàng trong và ngoài nước sử dụng dịch vụ. Trong đó có những đơn vị nổi tiếng như iVIVU.com, Vietnamwork, KINGFOOD, UBGroup, GTV,…
Vietnix không chỉ được đánh giá cao về chất lượng sản phẩm mà còn luôn chú trọng đến dịch vụ hỗ trợ khách hàng. Vì vậy, đến 97% khách hàng sử dụng VPS tại Vietnix đều đánh giá 5 sao và thường giới thiệu cho bạn bè, người quen.
Nhờ việc không ngừng nâng cao chất lượng sản phẩm và mang lại sự hài lòng cho khách hàng, Vietnix đã được vinh danh với giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022.
Liên hệ ngay với Vietnix theo những thông tin sau đây để được hỗ trợ tư vấn giải pháp VPS phù hợp với bạn.
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Qua bài viết hướng dẫn tạo chứng chỉ SSL trên Apache cho CentOS 7 này, bạn đã biết cách cấu hình server Apache để xử lý các yêu cầu HTTP và HTTPS. Bạn có thể giao tiếp với client một cách an toàn và tránh được việc bên ngoài có thể đọc được lưu lượng. Nếu bạn định sử dụng SSL cho website, bạn nên mua chứng chỉ SSL từ Vietnix để tránh những cảnh báo mỗi khi client truy cập. Cảm ơn bạn đã theo dõi và chúc bạn thực hiện thành công.