Mục lục

Không có mục lục

Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 18.04

Ngày đăng: 28 tháng 9 năm 2023

Giới thiệu

TLS, hay transport layer securitySSL tiền nhiệm của nó, viết tắt của secure sockets layer, là các giao thức web được sử dụng để bao bọc lưu lượng truy cập thông thường trong một trình bao bọc được mã hóa, được bảo vệ.

Khi sử dụng công nghệ này, máy chủ có thể gửi lưu lượng truy cập giữa máy chủ và máy khách một cách an toàn mà không bị bên ngoài chặn tin nhắn. Hệ thống chứng chỉ cũng hỗ trợ người dùng xác minh danh tính của các trang web mà họ đang kết nối.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách thiết lập chứng chỉ SSL tự ký để sử dụng với máy chủ web Apache trên Ubuntu 18.04.

Lưu ý: Chứng chỉ tự ký (self-signed certificate) sẽ mã hóa thông tin liên lạc giữa máy chủ của bạn và bất kỳ máy khách nào. Tuy nhiên, vì nó không được ký bởi bất kỳ Cơ quan cấp chứng chỉ (CA) đáng tin cậy nào đi kèm với trình duyệt web nên người dùng không thể sử dụng chứng chỉ để tự động xác thực danh tính máy chủ của bạn.

Chứng chỉ tự ký có thể phù hợp nếu bạn không có tên miền được liên kết với máy chủ của mình và trong trường hợp giao diện web được mã hóa không hướng tới người dùng. Nếu bạn có tên miền, trong nhiều trường hợp, tốt hơn là bạn nên sử dụng chứng chỉ do CA ký. Đọc thêm về cách thiết lập chứng chỉ tin cậy miễn phí với hướng dẫn của chúng tôi về Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 18.04.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Một máy chủ Ubuntu 18.04 có non-root user được định cấu hình với đặc quyền sudo và bật tường lửa. Bạn có thể thiết lập tài khoản người dùng như vậy bằng cách làm theo Thiết lập máy chủ ban đầu của chúng tôi với Ubuntu 18.04
  • Một máy chủ web Apache đã được cài đặt. Nếu bạn muốn cài đặt toàn bộ LAMP stack (Linux, Apache, MySQL, PHP) trên máy chủ của mình, bạn có thể làm theo hướng dẫn của chúng tôi về cách thiết lập LAMP trên Ubuntu 18.04. Nếu bạn chỉ muốn máy chủ web Apache, hãy bỏ qua các bước liên quan đến PHP và MySQL.

Khi bạn đã hoàn thành các điều kiện tiên quyết, hãy tiếp tục bước tiếp theo.

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

TLS/SSL hoạt động bằng cách sử dụng kết hợp chứng chỉ chung và khóa riêng. SSL key được giữ bí mật trên máy chủ. Nó được sử dụng để mã hóa nội dung gửi cho khách hàng. Chứng chỉ SSL được chia sẻ công khai với bất kỳ ai yêu cầu nội dung. Nó có thể được sử dụng để giải mã nội dung được ký bởi SSL key liên quan.

Bạn có thể tạo cặp khóa và chứng chỉ tự ký bằng một lệnh OpenSSL:

  1. sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Điều này sẽ gợi lên một loạt câu hỏi. Trước khi thảo luận về những điều đó, đây là phần giới thiệu về những gì đang xảy ra trong lệnh bạn đang ban hành:

  • openssl: Đây là công cụ dòng lệnh cơ bản để tạo và quản lý chứng chỉ, khóa và các tệp khác của OpenSSL.
  • req: Lệnh phụ này chỉ định sử dụng quản lý yêu cầu ký chứng chỉ X.509 (CSR). “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ỉ. Để tạo chứng chỉ X.509 mới, hãy sử dụng lệnh phụ này.
  • -x509: Điều này tiếp tục sửa đổi lệnh phụ trước đó bằng cách yêu cầu tiện ích tạo chứng chỉ tự ký thay vì tạo yêu cầu ký chứng chỉ như thường lệ.
  • -nodes: Điều này yêu cầu OpenSSL bỏ qua tùy chọn bảo mật chứng chỉ bằng cụm mật khẩu (passphrase). Apache cần có khả năng đọc tệp mà không cần sự can thiệp của người dùng khi máy chủ khởi động. Cụm mật khẩu sẽ ngăn điều này xảy ra vì người dùng sẽ phải nhập cụm mật khẩu đó 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à chứng chỉ sẽ được coi là hợp lệ. Trong trường hợp này, nó được ấn định trong một năm.
  • -newkey rsa:2048: Điều này chỉ định rằng bạn muốn tạo chứng chỉ mới và khóa mới cùng một lúc. Khóa cần thiết để ký chứng chỉ chưa được tạo ở bước trước, vì vậy nó cần được tạo cùng với chứng chỉ. Phần rsa:2048 yêu cầu nó tạo khóa RSA dài 2048 bit.
  • -keyout: Dòng này cho OpenSSL biết nơi đặt tệp khóa riêng đã tạo đang được tạo.
  • -out: Điều này cho OpenSSL biết nơi đặt chứng chỉ đang được tạo.

Như đã nêu trước đây, các tùy chọn này sẽ tạo cả tệp khóa và chứng chỉ. Bạn sẽ được hỏi một số câu hỏi về máy chủ của mình để nhúng thông tin chính xác vào chứng chỉ.

Đ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à dòng yêu cầu Common Name (e.g. server FQDN or YOUR name). Bạn cần nhập tên miền được liên kết với máy chủ của bạn hoặc nhiều khả năng là địa chỉ IP công cộng của máy chủ của bạn.

Toàn bộ danh sách lời nhắc sẽ xuất ra như sau:

Output
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:server_IP_address Email Address []:admin@your_domain.com

Cả hai tệp bạn đã tạo sẽ được đặt trong thư mục con thích hợp trong /etc/ssl.

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

Bạn đã tạo thành công tệp khóa và chứng chỉ trong thư mục /etc/ssl. Bây giờ, bạn cần sửa đổi cấu hình Apache của mình để tận dụng những lợi thế này.

Bạn sẽ làm việc này bằng cách thực hiện một số điều chỉnh đối với cấu hình:

  1. Tạo đoạn cấu hình để chỉ định cài đặt SSL mặc định mạnh.
  2. Sửa đổi tệp SSL Apache Virtual Host (Máy chủ ảo) đi kèm để trỏ đến chứng chỉ SSL đã tạo của bạn.
  3. (Được khuyến nghị) Sửa đổi tệp Virtual Host không được mã hóa để tự động chuyển hướng các yêu cầu đến Virtual Host được mã hóa.

Khi hoàn tất, bạn sẽ có cấu hình SSL an toàn.

Tạo đoạn cấu hình Apache với cài đặt mã hóa mạnh

Để bắt đầu, hãy tạo đoạn mã cấu hình Apache để xác định một số cài đặt SSL. Điều này sẽ thiết lập Apache với bộ mật mã SSL mạnh và kích hoạt một số tính năng nâng cao giúp giữ an toàn cho máy chủ của bạn. Các tham số bạn đặt có thể được sử dụng bởi bất kỳ Virtual Host nào kích hoạt SSL.

Tạo một đoạn mã mới trong thư mục /etc/apache2/conf-available. Trong ví dụ này, chúng tôi sẽ tạo các tệp bằng nano và đặt tên tệp là ssl-params.conf để làm rõ mục đích của nó. Hãy thoải mái sử dụng trình soạn thảo văn bản ưa thích của bạn:

  1. sudo nano /etc/apache2/conf-available/ssl-params.conf

Để thiết lập SSL Apache một cách an toàn, chúng tôi sẽ điều chỉnh các đề xuất từ Cipherlist.eu. Cipherlist.eu là một nguồn tài nguyên hữu ích và dễ hiểu để hiểu rõ các cài đặt mã hóa được sử dụng cho phần mềm phổ biến.

Lưu ý: Các cài đặt được đề xuất này từ Cipherlist.eu mang lại khả năng bảo mật mạnh mẽ. Đôi khi, điều này phải trả giá bằng khả năng tương thích máy khách cao hơn. Nếu bạn cần hỗ trợ các máy khách cũ hơn, bạn có thể truy cập vào một danh sách thay thế bằng cách nhấp vào liên kết trên trang có nhãn “Yes, give me a ciphersuite that works with legacy / old software.” Nếu muốn, bạn có thể thay thế danh sách đó bằng nội dung của khối mã mẫu tiếp theo.

Việc lựa chọn sử dụng cấu hình nào sẽ phụ thuộc phần lớn vào những gì bạn cần hỗ trợ. Cả hai đều sẽ cung cấp bảo mật tuyệt vời.

Vì mục đích của bạn, hãy sao chép toàn bộ cài đặt được cung cấp. Tuy nhiên, bạn sẽ thực hiện một thay đổi nhỏ bằng cách vô hiệu hóa tiêu đề Strict-Transport-Security (HSTS).

Tải trước HSTS giúp tăng cường bảo mật nhưng có thể gây ra hậu quả sâu rộng nếu vô tình bật hoặc bật không chính xác. Trong hướng dẫn này, chúng tôi sẽ không bật cài đặt nhưng bạn có thể sửa đổi cài đặt đó nếu bạn chắc chắn rằng mình hiểu ý nghĩa.

Trước khi quyết định, hãy dành chút thời gian để đọc về Bảo mật truyền tải nghiêm ngặt HTTP hoặc HSTS và cụ thể là về chức năng “preload”

Bây giờ dán cấu hình vào tệp ssl-params.conf:

/etc/apache2/conf-available/ssl-params.conf
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +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 X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Lưu và đóng tập tin khi bạn hoàn tất. Nếu bạn đang sử dụng nano, bạn có thể thực hiện việc này bằng cách nhấn CTRL + X, sau đó nhấn YENTER.

Sửa đổi tệp SSL Apache Virtual Host mặc định

Tiếp theo, bạn sẽ sửa đổi /etc/apache2/sites-available/default-ssl.conf, tệp SSL Apache Virtual Host mặc định. Nếu bạn đang sử dụng một tệp khối máy chủ khác, hãy thay thế tên của nó bằng các lệnh sau.

Trước khi bạn bắt đầu, hãy sao lưu tệp SSL Virtual Host gốc:

  1. sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Bây giờ, hãy mở file SSL Virtual Host để thực hiện điều chỉnh:

  1. sudo nano /etc/apache2/sites-available/default-ssl.conf

Bên trong, với hầu hết các nhận xét đã bị xóa, tệp Virtual Host sẽ chứa nội dung sau theo mặc định:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Bạn sẽ thực hiện một số điều chỉnh nhỏ đối với tệp. Trước tiên, hãy đặt những thứ thông thường mà bạn muốn điều chỉnh trong tệp Virtual Host (chẳng hạn như địa chỉ email ServerAdmin, ServerName, v.v. và điều chỉnh các lệnh SSL để trỏ đến chứng chỉ và tệp khóa của bạn).

Sau khi thực hiện những thay đổi này, khối máy chủ của bạn sẽ có kết quả như sau:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Lưu và đóng tập tin khi bạn hoàn tất.

(Được khuyến nghị) Sửa đổi tệp HTTP Host để chuyển hướng sang HTTPS

Hiện tại, máy chủ sẽ cung cấp cả lưu lượng truy cập HTTP không được mã hóa và HTTPS được mã hóa. Để bảo mật tốt hơn, trong hầu hết các trường hợp, nên tự động chuyển hướng HTTP sang HTTPS. 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 một cách an toàn.

Để điều chỉnh tệp Virtual Host không được mã hóa nhằm chuyển hướng tất cả lưu lượng truy cập sang mã hóa SSL, hãy mở tệp /etc/apache2/sites-available/000-default.conf:

  1. sudo nano /etc/apache2/sites-available/000-default.conf

Trong các khối cấu hình VirtualHost, hãy thêm lệnh Redirect, trỏ tất cả lưu lượng truy cập đến phiên bản SSL của trang web:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

Lưu và đóng tập tin khi bạn hoàn tất.

Bước 3 - Điều chỉnh tường lửa

Nếu bạn đã bật tường lửa ufw, như được khuyến nghị trong các hướng dẫn tiên quyết, bạn có thể cần điều chỉnh cài đặt để cho phép lưu lượng SSL. May mắn thay, Apache đăng ký một vài cấu hình với ufw sau khi cài đặt.

Xem danh sách các cấu hình có sẵn bằng cách chạy như sau:

  1. sudo ufw app list

Đầu ra phải như sau:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

Bạn có thể xem lại cài đặt hiện tại bằng cách kiểm tra trạng thái:

  1. sudo ufw status

Nếu trước đó bạn chỉ cho phép lưu lượng truy cập HTTP thông thường thì kết quả đầu ra của bạn sẽ như sau:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

Để cho phép lưu lượng HTTPS bổ sung, bạn có thể cho phép cấu hình “Apache Full” và sau đó xóa phụ cấp cấu hình “Apache” dư thừa:

  1. sudo ufw allow 'Apache Full'
  2. sudo ufw delete allow 'Apache'

Xác nhận các thay đổi bằng cách kiểm tra trạng thái:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)

Bây giờ bạn đã cho phép thành công lưu lượng truy cập Apache vào tường lửa của mình.

Bước 4 - Kích hoạt các thay đổi trong Apache

Bây giờ bạn đã thực hiện các thay đổi và điều chỉnh tường lửa của mình, bạn có thể kích hoạt các mô-đun SSL và tiêu đề trong Apache, kích hoạt Virtual Host sẵn sàng cho SSL và khởi động lại Apache.

Kích hoạt mod_ssl, mô-đun SSL Apache và mod_headers, những điều cần thiết cho một số cài đặt trong đoạn mã SSL, bằng lệnh a2enmod:

  1. sudo a2enmod ssl
  2. sudo a2enmod headers

Tiếp theo, kích hoạt SSL Virtual Host của bạn bằng lệnh a2ensite:

  1. sudo a2ensite default-ssl

Bạn cũng cần kích hoạt tệp ssl-params.conf của mình để đọc các giá trị bạn đặt:

  1. sudo a2enconf ssl-params

Tại thời điểm này, trang web của bạn và các mô-đun cần thiết đã được kích hoạt. Kiểm tra để đảm bảo rằng không có lỗi cú pháp trong tệp của bạn bằng kiểm tra:

  1. sudo apache2ctl configtest

Nếu mọi thứ đều thành công, bạn sẽ nhận được kết quả 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 lệnh ServerName không được đặt trên toàn cầu. Nếu muốn loại bỏ thông báo đó, bạn có thể đặt ServerName thành tên miền hoặc địa chỉ IP của máy chủ trong /etc/apache2/apache2.conf. Đây là tùy chọn vì tin nhắn sẽ không gây hại gì.

Nếu đầu ra của bạn có Syntax OK trong đó thì tệp cấu hình của bạn không có lỗi cú pháp. Bây giờ bạn có thể khởi động lại Apache một cách an toàn để thực hiện các thay đổi của mình:

  1. sudo systemctl restart apache2

Bạn đã thực hiện các thay đổi của mình và tiếp theo bạn sẽ kiểm tra máy chủ SSL của mình.

Bước 5 - Kiểm tra mã hóa

Bây giờ là lúc kiểm tra máy chủ SSL của bạn. Bắt đầu bằng cách mở trình duyệt web của bạn và nhập https:// theo sau là tên miền hoặc IP của máy chủ của bạn vào thanh địa chỉ:

https://server_domain_or_IP

Vì chứng chỉ bạn đã tạo không được ký bởi một trong các tổ chức phát hành chứng chỉ đáng tin cậy của trình duyệt của bạn nên bạn có thể sẽ nhận được cảnh báo như sau:

description image

Điều này được mong đợi và bình thường. Chúng tôi chỉ quan tâm đến khía cạnh mã hóa chứng chỉ của mình chứ không quan tâm đến việc xác thực của bên thứ ba về tính xác thực của máy chủ của chúng tôi. Nhấp vào ADVANCED và sau đó liên kết được cung cấp để tiếp tục với máy chủ của bạn:

description image

Bạn nên được đưa đến trang web của mình. Trên thanh địa chỉ của trình duyệt, bạn sẽ có một khóa có chữ “x” phía trên. Điều này có nghĩa là chứng chỉ không thể được xác nhận. Nó vẫn đang mã hóa kết nối của bạn.

Nếu bạn đã định cấu hình Apache để chuyển hướng HTTP sang HTTPS, bạn cũng có thể kiểm tra xem các chức năng chuyển hướng có chính xác hay không:

https://server_domain_or_IP

Nếu điều này dẫn đến cùng một biểu tượng, điều này có nghĩa là chuyển hướng của bạn đã hoạt động chính xác.

Bước 6 - Thay đổi sang chuyển hướng vĩnh viễn

Nếu chuyển hướng của bạn hoạt động chính xác và bạn chắc chắn rằng bạn chỉ muốn cho phép lưu lượng được mã hóa, bạn nên sửa đổi lại Apache Virtual Host không được mã hóa để chuyển hướng vĩnh viễn.

Mở lại tệp cấu hình khối máy chủ của bạn:

  1. sudo nano /etc/apache2/sites-available/000-default.conf

Tìm dòng Redirect bạn đã thêm trước đó. Thêm permanent vào dòng đó, thay đổi chuyển hướng từ chuyển hướng tạm thời 302 sang chuyển hướng vĩnh viễn 301:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

Lưu và đóng tập tin.

Kiểm tra cấu hình của bạn để tìm lỗi cú pháp:

  1. sudo apache2ctl configtest

Khi bạn đã sẵn sàng, hãy khởi động lại Apache để chuyển hướng vĩnh viễn:

  1. sudo systemctl restart apache2

Bạn đã thực hiện chuyển hướng vĩnh viễn thành công để chỉ cho phép lưu lượng truy cập được mã hóa.

Kết luận

Bạn đã định cấu hình máy chủ Apache của mình để sử dụng mã hóa mạnh cho các kết nối máy khách. Điều này sẽ cho phép bạn gửi yêu cầu một cách an toàn và sẽ ngăn các bên ngoài đọc được lưu lượng truy cập của bạn.

0 câu trả lời