Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 20.04
TLS hay còn gọi là “bảo mật lớp truyền tải” - 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 thông thường trong một lớp bao bọc được mã hóa, được bảo vệ. Sử dụng công nghệ này, các server có thể gửi thông tin đến client 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, ta sẽ chỉ cho bạn cách tạo và sử dụng certificate SSL tự ký với web server Apache trên Ubuntu 20.04.
Lưu ý: Chứng chỉ tự ký sẽ mã hóa giao tiếp giữa server của bạn và bất kỳ client nào. Tuy nhiên, vì nó không được ký bởi bất kỳ tổ chức cấp certificate tin cậy nào có trong trình duyệt web và hệ điều hành, user không thể sử dụng certificate để xác thực danh tính server của bạn một cách tự động. Do đó, user của bạn sẽ thấy lỗi bảo mật khi truy cập trang web .
Vì hạn chế này, các certificate tự ký không phù hợp với môi trường production 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 user hoặc một group nhỏ user có thể cài đặt sự tin cậy về tính hợp lệ của certificate thông qua các kênh liên lạc thay thế.
Để có giải pháp certificate sẵn sàng production hơn, hãy xem Let's Encrypt , một tổ chức phát hành certificate miễn phí. Bạn có thể tìm hiểu cách download và cấu hình certificate 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 ta .
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:
- Truy cập vào server Ubuntu 20.04 với user không root , đã bật sudo. Hướng dẫn Cài đặt Server Ban đầu với Ubuntu 20.04 của ta có thể chỉ cho bạn cách tạo account này.
- Bạn cũng cần phải cài đặt Apache. Bạn có thể cài đặt Apache bằng - apt. Đầu tiên, hãy cập nhật index gói local để cập nhật thay đổi 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 đã cài đặt firewall - ufw, hãy mở cổng- httpvà- https:- sudo ufw allow "Apache Full"
 
Sau khi các bước này hoàn tất, hãy đảm bảo bạn đã đăng nhập với quyền là user không phải root của bạn 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ỳ certificate  SSL nào , trước tiên  ta  phải bật mod_ssl , một module  Apache cung cấp hỗ trợ cho 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 module :
- sudo systemctl restart apache2 
Mô-đun mod_ssl hiện đã được kích hoạ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, ta có thể chuyển sang tạo certificate SSL mới. Chứng chỉ sẽ lưu trữ một số thông tin cơ bản về trang web và sẽ được kèm theo một file khóa cho phép server xử lý dữ liệu được mã hóa một cách an toàn.
  Ta  có thể tạo khóa SSL và các file  certificate  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 dấu nhắc nơi bạn có thể nhập thông tin về trang web của bạn . Trước khi xem xét điều đó, hãy xem điều gì đang xảy ra trong lệnh mà ta đang phát hành:
-  openssl: Đây là công cụ dòng lệnh để tạo và quản lý certificate OpenSSL, khóa và các file khác.
-  req -x509: Điều này chỉ định rằng ta muốn sử dụng quản lý yêu cầu ký certificate (CSR) X.509. X.509 là tiêu chuẩn cơ sở hạ tầng public key mà SSL và TLS tuân theo để quản lý khóa và certificate .
-  -nodes: Điều này yêu cầu OpenSSL bỏ qua tùy chọn bảo mật certificate của ta bằng passphrase (password bảo vệ) . Ta cần Apache để có thể đọc file mà không cần sự can thiệp của user , khi server khởi động. Một passphrase (password bảo vệ) sẽ ngăn điều này xảy ra, vì 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 khoảng thời gian mà certificate sẽ được coi là hợp lệ. Ta đặt nó trong một năm ở đây. Nhiều trình duyệt hiện đại sẽ từ chối bất kỳ certificate nào có hiệu lực trên một năm.
-  -newkey rsa:2048: Điều này chỉ định rằng ta muốn tạo certificate mới và khóa mới cùng một lúc. Ta đã không tạo khóa bắt buộc phải ký certificate ở bước trước, vì vậy ta cần tạo khóa cùng với certificate . Phầnrsa:2048yê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 file private key đã tạo mà ta đang tạo.
-  -out: Điều này cho OpenSSL biết nơi đặt certificate mà 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 Common Name . Bạn cần nhập tên  server  mà bạn sẽ sử dụng để truy cập vào  server  hoặc IP công khai của  server . Điều quan trọng là trường này phải  trùng với  bất kỳ thứ gì bạn sẽ đưa 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 nhiều lỗi bảo mật hơn.
Danh sách đầy đủ các dấu nhắc sẽ trông giố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 đặt trong các folder  con thích hợp dưới /etc/ssl .
Tiếp theo, ta sẽ cập nhật cấu hình Apache của bạn để sử dụng certificate và khóa mới.
Bước 3 - Cấu hình Apache để sử dụng SSL
 Bây giờ  ta  đã có sẵn certificate  và khóa tự ký,  ta  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 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  reload  hoặc khởi động lại.
 Đối với hướng dẫn này,  ta  sẽ tạo một file  cấu hình tối thiểu mới. (Nếu bạn đã  cài đặt  Apache <Virtualhost> 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  Ta  sẽ xử lý của cổng 80 trong bước tiếp theo.)
Mở một file mới trong folder / 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  server   của bạn . Đây có thể là tên  server , domain  đầy đủ hoặc địa chỉ IP. Đảm bảo bất kỳ điều gì bạn chọn phù hợp với Common Name bạn đã chọn khi tạo certificate .
 Các dòng còn lại chỉ định folder  DocumentRoot để phục vụ các file  từ đó và các tùy chọn SSL cần thiết để trỏ Apache tới certificate  và khóa mới được tạo của  ta .
 Bây giờ, hãy tạo DocumentRoot của  ta  và đặt một file  HTML vào đó chỉ cho mục đích thử nghiệm:
- sudo mkdir /var/www/your_domain_or_ip 
Mở index.html mới bằng editor  của bạn:
- sudo nano /var/www/your_domain_or_ip/index.html 
Dán phần sau vào file trống:
<h1>it worked!</h1> Tất nhiên, đây không phải là một file HTML đầy đủ, nhưng các trình duyệt khoan dung và nó sẽ đủ để xác minh cấu hình của ta .
 lưu và đóng  file 
 Tiếp theo,  ta  cần kích hoạt file  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à thông báo cho bạn biết rằng lệnh ServerName không được đặt  trên phạm vi global . Nếu bạn muốn loại bỏ thông báo đó, bạn có thể đặt ServerName thành domain  hoặc địa chỉ IP của  server  trong /etc/apache2/apache2.conf . Đây là tùy chọn vì tin nhắn sẽ không có hại.
 Nếu  kết quả  của bạn có Syntax OK trong đó, file  cấu hình của bạn không có lỗi cú pháp.  Ta  có thể  reload  Apache một cách an toàn để  áp dụng các thay đổi   của bạn :
- sudo systemctl reload apache2 
Bây giờ tải  trang web  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 một certificate 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 server vì certificate của ta không được ký bởi bất kỳ tổ chức phát hành certificate nào đã biết của nó. Đố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 có thể nhấp qua thông tin nâng cao hoặc thông tin khác 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 it worked! thông điệp.
 Lưu ý: nếu trình duyệt của bạn hoàn toàn không kết nối với  server , hãy  đảm bảo  kết nối của bạn không bị firewall  chặn. 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,  ta  sẽ thêm một phần VirtualHost khác vào cấu hình  của bạn  để phục vụ các yêu cầu HTTP thuần túy 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  ta  sẽ chỉ phản hồi các yêu cầu HTTPS trên cổng 443 . Một thực tiễn tốt là cũng 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 phải được mã hóa. Hãy  cài đặt  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 đến HTTPS.
Mở cùng một file cấu hình Apache mà ta đã 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 để  trùng với  các yêu cầu trên cổng 80 . Sử dụng lệnh ServerName để khớp lại với domain  hoặc địa chỉ IP của bạn. Sau đó, sử dụng Redirect để  trùng 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 sau:
<VirtualHost *:80>     ServerName your_domain_or_ip     Redirect / https://your_domain_or_ip/ </VirtualHost> Lưu file này khi bạn hoàn tất, sau đó kiểm tra lại cú pháp cấu hình và reload 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 bạn  với http:// đơn giản phía trước địa chỉ. Bạn sẽ được chuyển hướng tự động đến https:// .
Kết luận
Đến đây bạn đã cấu hình Apache để phân phát các yêu cầu được mã hóa bằng certificate SSL tự ký và để chuyển hướng các yêu cầu HTTP không được mã hóa đến HTTPS.
Nếu bạn đang lên kế hoạch 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 domain và sử dụng một tổ chức phát hành certificate đượ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 with 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 .
Các tin liên quan
Cách tạo chứng chỉ SSL tự ký cho Apache trên CentOS 82020-06-30
Cách bảo mật Apache bằng Let's Encrypt trên CentOS 8
2020-06-29
Cách cấu hình Apache HTTP với MPM Event và PHP-FPM trên Ubuntu 18.04
2020-05-13
Cách cài đặt web server Apache trên CentOS 8 [Quickstart]
2020-05-08
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 20.04
2020-04-29
Cách cài đặt web server Apache trên Ubuntu 20.04 [Quickstart]
2020-04-28
Cách cài đặt web server Apache trên Ubuntu 20.04
2020-04-27
Cách cài đặt web server Apache trên CentOS 8
2020-04-24
Cách thiết lập server ảo Apache trên Ubuntu 18.04 [Quickstart]
2020-02-19
Các bước được đề xuất để ngăn chặn HTTP Apache trên FreeBSD 12.0
2020-02-12
 

