Thứ hai, 06/07/2020 | 00:00 GMT+7

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 httphttps :

    • 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ầ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 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:

/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>  

Đả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:

/var/www/your_domain_or_ip/index.html
<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:

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à 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 80443 :

  • 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:

/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 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 .


Tags:

Các tin trước

Cách tạo chứng chỉ SSL tự ký cho Apache trên CentOS 8 2020-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 Sự kiện MPM 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