Thứ ba, 30/06/2020 | 00:00 GMT+7

Cách tạo chứng chỉ SSL tự ký cho Apache trên CentOS 8

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 máy CentOS 8.

Lưu ý: Chứng chỉ tự ký sẽ mã hóa giao tiếp giữa server của bạn và client của nó. Tuy nhiên, vì nó không được ký bởi bất kỳ tổ chức phát hành 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 để tự động xác thực danh tính của server của bạn. 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 CentOS 8 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 CentOS 8 với user không root , hỗ trợ sudo. Hướng dẫn Cài đặt Server Ban đầu với CentOS 8 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 dnf :

    • sudo dnf install httpd

    Bật Apache và khởi động nó bằng systemctl :

    • sudo systemctl enable httpd
    • sudo systemctl start httpd

    Và cuối cùng, nếu bạn có một firewalld firewall cài đặt , mở ra httphttps cổng:

    • sudo firewall-cmd --permanent --add-service=http
    • sudo firewall-cmd --permanent --add-service=https
    • sudo firewall-cmd --reload

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 - Cài đặt mod_ssl

Trước tiên, ta cần cài đặt mod_ssl , một module Apache cung cấp hỗ trợ mã hóa SSL.

Cài đặt mod_ssl bằng lệnh dnf :

  • sudo dnf install mod_ssl

Do lỗi đóng gói, ta cần khởi động lại Apache một lần để tạo đúng certificate SSL và khóa mặc định, nếu không ta sẽ gặp lỗi khi đọc '/etc/pki/tls/certs/localhost.crt' does not exist or is empty .

  • sudo systemctl restart httpd

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/pki/tls/private/apache-selfsigned.key -out /etc/pki/tls/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 của folder /etc/pki/tls . Đây là một folder tiêu chuẩn được cung cấp bởi CentOS cho mục đích này.

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 CentOS, 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/httpd/conf.d 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 phải sao chép các dòng cấu hình bắt đầu với SSL và chuyển cổng VirtualHost từ 80 sang 443 . Ta sẽ chăm sóc cổng 80 trong bước tiếp theo.

Mở một file mới trong folder /etc/httpd/conf.d :

  • sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

Dán vào cấu hình VirtualHost tối thiểu sau:

/etc/httpd/conf.d/your_domain_or_ip.conf
<VirtualHost *:443>     ServerName your_domain_or_ip     DocumentRoot /var/www/ssl-test     SSLEngine on     SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt     SSLCertificateKeyFile /etc/pki/tls/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/ssl-test

Mở index.html mới bằng editor của bạn:

  • sudo vi /var/www/ssl-test/index.html

Dán phần sau vào file trống:

/var/www/ssl-test/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 file , sau đó kiểm tra cấu hình Apache của bạn để tìm lỗi cú pháp bằng lệnh :

  • sudo apachectl configtest

Bạn có thể thấy một số cảnh báo, nhưng miễn là kết quả kết thúc bằng Syntax OK , bạn có thể an toàn để tiếp tục. Nếu đây không phải là một phần của kết quả của bạn, hãy kiểm tra cú pháp của các file và thử lại.

Khi tất cả đều ổn, hãy reload Apache để nhận các thay đổi cấu hình:

  • sudo systemctl reload httpd

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ỳ cơ quan cấp certificate đã biết nào của trình duyệ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 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 firewalld , các lệnh sau sẽ mở các cổng 80443 :

  • sudo firewall-cmd --permanent --add-service=http
  • sudo firewall-cmd --permanent --add-service=https
  • sudo firewall-cmd --reload

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 vi /etc/httpd/conf.d/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/httpd/conf.d/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 httpd

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ục vụ 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 bằng Let's Encrypt trên CentOS 8 của ta .


Tags:

Các tin trước

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
Cách thiết lập server ảo Apache trên Ubuntu 18.04 2020-02-10