Thứ bảy, 19/09/2020 | 11:14 GMT+7

Tạo chứng chỉ số tự ký trên Apache Centos 8 (self-signed-ssl-certificate)

Cài đặt chứng chỉ số Tự ký là một công việc có nhiều ứng dụng. Chứng chỉ số cho phép bạn tạo kênh truyền bảo mật trên mạng, nhằm đảm bảo an toàn dữ liệu truyền đi mà không bị theo dõi lắng nghe trên đường truyền

Giới thiệu

TLS hay còn gọi là “bảo mật lớp Transport - Truyền tải” - và SSL phiên bản trước của nó - là các giao thức được sử dụng để mã hóa bảo mật dữ liệu mạng. 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 một cách an toàn mà không bị bên ngoài chặn hoặc đọc thông tin truyền đi giữa chừng.

Trong hướng dẫn này, ta 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 CentOS 8.

Lưu ý: Chứng chỉ tự ký sẽ mã hóa giao tiếp giữa máy chủ của bạn và máy khách của nó. Vì nó không được ký bởi bất kỳ tổ chức phát hành chứng chỉ nào được xác nhận 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ỉ để 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.

Vì hạn chế này, chứng chỉ tự ký không phù hợp với môi trường phục vụ công khai, kinh doanh. Chúng thường được sử dụng để thử nghiệm hoặc để bảo mật nội bộ.

Để có giải pháp chứng chỉ được chứng thực công khai, có thể dùng Let's Encrypt, một tổ chức cung cấp chứng chỉ miễn phí. Bạn có thể cài đặt 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 CentOS 8.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn sẽ cần những thứ sau:

  • Truy cập vào máy chủ CentOS 8 với người dùng không cần root, đã bật sudo. Hướng dẫn Thiết lập Máy chủ Ban đầu với CentOS 8 có hướng dẫn cách tạo tài khoản này.
  • Bạn cũng sẽ cần cài đặt Apache, 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à nếu có một firewalld được chạy thì hãy mở cổng httphttps:

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

Bước 1 - Cài đặt mod_ssl

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

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

  • sudo dnf install mod_ssl

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

  • sudo systemctl restart httpd

Mô-đun mod_ssl đã được kích hoạt và sẵn sàng sử dụng.

Bước 2 - Tạo chứng chỉ SSL

Apache đã sẵn sàng để sử dụng mã hóa, 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.

Ta có thể tạo khóa SSL và các tệp chứng chỉ 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 nhắc nhập thông tin về trang web của mình. Trước khi xem xét điều đó, hãy xem điều gì đang xảy ra trong lệnh trên:

  • 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 sử dụng quản lý yêu cầu ký chứng chỉ (CSR) X.509. 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 : yêu cầu OpenSSL bỏ qua tùy chọn bảo mật chứng chỉ của ta bằng cụm mật khẩu. Có thể lựa chọn nhập mật khẩu bảo mật chứng chỉ mỗi khi apache khởi động hoặc không, là do tùy chọn này.
  • -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ệ, 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ỳ chứng chỉ nào có hiệu lực trên một năm nhằm nâng cao bảo mật.
  • -newkey rsa:2048 : Điều này chỉ định rằng ta muốn tạo chứng chỉ mới và khóa mới cùng một lúc. Ta đã không tạo khóa cần thiết để ký chứng chỉ ở bước trước, vì vậy ta 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 cá nhân đã tạo mà ta sẽ tạo.
  • -out : Điều này cho OpenSSL biết nơi đặt chứng chỉ sẽ 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à  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 vào máy chủ hoặc IP công khai của máy chủ. Quan trọng là trường này phải khớp với bất cứ thứ gì bạn sẽ đưa vào thanh địa chỉ của trình duyệt để truy cập trang web, vì không khớp sẽ gây ra nhiều lỗi bảo mật được báo.

Danh sách đầy đủ các lời 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 tệp bạn đã tạo sẽ được đặt trong các thư mục con thích hợp trong/etc/pki/tls . Đây là một thư mục 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 mình để sử dụng chứng chỉ và khóa mới.

Bước 3 - Định cấu hình Apache để sử dụng SSL

Bây giờ ta đã có chứng chỉ và khóa tự ký, 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 tệp 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 Apache khởi động lại.

Với hướng dẫn này, ta sẽ tạo một tệp cấu hình tối thiểu. Nếu bạn đã thiết lập 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 với SSL và chuyển cổng VirtualHost từ 80 sang 443 . Rồi ta sẽ xử lý tối ưu cổng 80 trong bước tiếp theo.

Mở một tệp 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 cấu hình VirtualHost cơ bản 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 domain 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 bạn chọn phù hợp với Common Name bạn đã chọn khi tạo chứng chỉ.

Các dòng còn lại chỉ định thư mục DocumentRoot và các tệp chứng chỉ và khóa mới đã được tạo.

Bây giờ, hãy tạo DocumentRoot của Ta và đặt một tệp HTML vào đó để thử nghiệm:

  • sudo mkdir /var/www/ssl-test

Mở index.html mới bằng soạn thảo văn bản Vi:

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

Với nội dung sau:

/var/www/ssl-test/index.html
<h1>it worked!</h1>

Đây không phải là một tệp HTML đầy đủ, chỉ dùng để test.

Lưu và đóng tệp, sau đó kiểm tra cấu hình Apache của bạn để tìm lỗi cú pháp bằng cách nhập:

  • sudo apachectl configtest

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

Khi mọi thứ đều ổn, hãy khởi động lại Apache để nhận các thay đổi cấu hình:

  • sudo systemctl reload httpd

Vào 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 báo lỗi. Điều này là bình thường đối với một 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 Ta không được ký bởi bất kỳ cơ quan cấp chứng chỉ đã 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 không vấn đề gì. Bạn sẽ 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 đó trình duyệt của bạn cho ra dòng text: it worked! mà ta đã gõ vào file index.html ở trên.

Lưu ý: nếu trình duyệt của bạn không kết nối với máy chủ, hãy đảm bảo rằng kết nối không bị tường lửa chặn. Nếu bạn đang sử dụng firewalld , các lệnh sau sẽ mở 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 mình để phục vụ các yêu cầu HTTP mặc định cổng 80 và chuyển hướng chúng đến HTTPS (cổng 443).

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 . Ta cần truy cập cả trên cổng 80 không được mã hóa. Thiết lập VirtualHost để phản hồi các yêu cầu cổng 80 sang 443 - HTTPS.

Mở cùng một tệp 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 để 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 vớ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 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 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 và tải lại 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 mình với http:// đơn giản phía trước địa chỉ. Bạn sẽ tự động được chuyển hướng đến https:// .

Kết luận

Vậy bạn đã hoàn tất 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ý, đồng thời có 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, được chứng nhận công khai hợp lệ, bạn nên xem xét việc mua một tên miền và sử dụng một tổ chức phát hành chứng chỉ miễn phí 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ác tin trước

Tối ưu SQL với Index, FullText Search 2020-08-10

Bảo mật Apache với Lets Encrypt 2020-08-06

Cài đặt Node.js trên Ubuntu 18.04 2020-08-06

Thực hành bài LAB Toàn tập Select SQL Query 2020-08-05

Cài đặt XAMPP Trên Hệ điều hành Windows 2020-08-05

Toàn tập SQL - Bài tập Lệnh SELECT Database Toàn tập - tinh gọn nhất 2020-08-03

Cài đặt MySQL trên Ubuntu 20.04 2020-07-30

Cấu hình sudoers file trên Ubuntu và Centos 2020-07-07

Tạo sudo cho user mới trên Ubuntu 20.04 [Quickstart] 2020-06-22

Cài đặt và sử dụng Docker trên Ubuntu 20.04 2020-06-09