Trang chủ / Chuyên đề / Tạo chứng chỉ Tự ký cho Apache trên Ubuntu 18-04
Thứ năm, 05/07/2018 | 00:00 GMT+7

Tạo chứng chỉ Tự ký cho Apache trên Ubuntu 18-04

TLS , hay transport layer security (bảo-mật-lớp-truyền-tải) và SSL tiền nhiệm của nó, viết tắt của secure socket layer, là các giao thức web được sử dụng để gói lưu lượng truy cập trong một shell (wrapper) có mã hóa. Sử dụng công nghệ này, các server có thể gửi nhận lưu lượng một cách an toàn tới client mà không lo bị nghe lén bởi các bên trung gian. Hệ thống certificate cũng hỗ trợ user xác minh danh tính của các trang web mà họ đang kết nối.

Hướng dẫn này sẽ trình bày cách cài đặt certificate SSL tự ký để sử dụng với web server Apache trên Ubuntu 18.04.

Lưu ý: Certificate tự ký (self-signed certificate) sẽ mã hóa giao tiếp giữa server và các client. Tuy nhiên, vì nó không được ký bởi bất kỳ tổ chức phát hành certificate mà user phổ thông tin cậy (certificate được đăng ký trong các trình duyệt web phổ biến), nên user không thể sử dụng certificate để xác thực danh tính của server tự động.

Do đó Certificate tự ký có thể phù hợp nếu bạn không có domain được liên kết với server và đối với các trường hợp giao diện web được mã hóa không dành cho user thông thường public sử dụng, mà phù hợp với môi trường private của bạn, hay tổ chức riêng. Nếu bạn có một domain thì có thể sử dụng một certificate CA chuẩn (được công nhận công khai). Bạn có thể tìm hiểu cách cài đặt certificate tin cậy miễn phí với dự án Let's Encrypt tại đây .

Thuật ngữ Tự ký ở đây, có nghĩa là nó được tin tưởng nội bộ. Cũng giống như trong thực tế, con dấu đỏ của công ty, cơ quan (ký công khai)... thì được công nhận pháp lý công khai. Còn con dấu tự bạn tạo ra (để tự ký), có thể đóng dấu vào các tài liệu qui định nội bộ.

Yêu cầu

Trước khi bắt đầu, bạn nên cấu hình một user không phải root với các quyền sudo . Bạn có thể tìm hiểu cách cài đặt account user như vậy theo Cài đặt server ban đầu với Ubuntu 18.04 .

Bạn cũng cần cài đặt web server Apache. Nếu bạn muốn cài đặt toàn bộ LAMP (Linux, Apache, MySQL, PHP) trên server, bạn có thể làm theo hướng dẫn về cách cài đặt LAMP trên Ubuntu 18.04 . Nếu bạn chỉ muốn có web server 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 yêu cầu, hãy tiếp tục bên dưới.

Bước 1 - Tạo certificate SSL

TLS/SSL hoạt động bằng cách sử dụng kết hợp public certificate và private key. Khóa SSL được giữ bí mật trên server. Nó được sử dụng để mã hóa nội dung được gửi đến client. Certificate SSL được chia sẻ công khai khi được yêu cầu. Nó được dùng để giải mã nội dung được ký bởi khóa SSL liên quan.

Ta có thể tạo một cặp certificate và khóa tự ký với OpenSSL trong một lệnh duy nhất:

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

Bạn sẽ được hỏi một loạt câu hỏi. 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 : công cụ dòng lệnh cơ bản để tạo và quản lý certificate OpenSSL, khóa và các file khác.
  • req : Lệnh con 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 của nó. Ta muốn tạo một certificate X.509 mới, vì vậy ta đang sử dụng lệnh con này.
  • -x509 : Điều này sửa đổi thêm lệnh con trước đó bằng cách nói với tiện ích rằng ta muốn tạo certificate tự ký thay vì tạo yêu cầu ký certificate như thường xảy ra.
  • -nodes : Điều này yêu cầu OpenSSL bỏ qua tùy chọn bảo mật certificate 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 cản việc tự động này , vì yêu cầu nhập passphare mỗi lần apache 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.
  • -newkey rsa: 2048 : 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 cần thiết để 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 sẽ tạo ra.
  • -out : Điều này cho OpenSSL biết nơi đặt certificate mà ta đang tạo.

Như ta đã nêu ở trên, các tùy chọn này sẽ tạo cả file khóa và certificate. Cài đặt sẽ hỏi các câu hỏi về server để đưa thông tin vào certificate.

Đ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 (eg server FQDN or YOUR name) . Bạn cần nhập domain được liên kết với server hoặc có thể là địa chỉ IP của server.

Toàn bộ dấu nhắc sẽ trông giống 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 file bạn đã tạo sẽ được đặt trong các folder con thích hợp dưới /etc/ssl .

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

Ta đã tạo các file khóa và certificate của bạn trong folder /etc/ssl . Bây giờ ta chỉ cần sửa đổi cấu hình Apache để tận dụng những lợi ích này.

Ta sẽ thực hiện một số điều chỉnh đối với cấu hình của bạn:

  1. Ta sẽ tạo đoạn mã cấu hình để chỉ định cài đặt SSL mặc định.
  2. Ta sẽ sửa đổi file VirtualHost SSL Apache để trỏ đến certificate SSL đã tạo.
  3. (khuyến khích) Ta sẽ sửa đổi file VirtualHost không được mã hóa để tự động chuyển hướng yêu cầu đến VirtualHost được mã hóa.

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

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

Đầu tiên, ta 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ẽ cài đặt Apache với một bộ mật mã SSL mạnh mẽ và kích hoạt một số tính năng nâng cao giúp giữ an toàn cho server. Các tham số ta sẽ đặt được dùng bởi bất kỳ VirtualHost nào bật SSL.

Tạo một đoạn mã mới trong folder /etc/apache2/conf-available . Ta sẽ đặt tên file là ssl-params.conf để làm rõ mục đích của nó:

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

Để cài đặt Apache SSL một cách an toàn, ta sẽ sử dụng các đề xuất của Remy van Elst trên trang Cipherli.st . Trang web này được thiết kế để cung cấp cài đặt mã hóa dễ sử dụng cho phần mềm phổ biến.

Các cài đặt đề xuất trên trang web được liên kết ở trên cung cấp khả năng bảo mật cao. Việc lựa chọn cấu hình nào bạn sử dụng sẽ phụ thuộc phần lớn vào những gì bạn cần hỗ trợ.

Ở đây, ta có thể sao chép toàn bộ các cài đặt được cung cấp. Ta sẽ chỉ thực hiện một thay đổi nhỏ. Ta sẽ tắt tiêu đề Strict-Transport-Security (HSTS).

Tải trước HSTS cung cấp khả năng bảo mật cao hơn, nhưng có thể gây ra hậu quả sai lỗi nếu vô tình được bật hoặc bật không đúng cách. Trong hướng dẫn này, ta sẽ không sửa gì, bạn có thể sửa đổi cài đặt đó nếu bạn chắc chắn hiểu nó.

Trước khi quyết định, hãy dành một 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 “tải trước”

Dán cấu hình vào file ssl-params.conf mà ta đã mở:

/etc/apache2/conf-available/ssl-params.conf
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
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 file khi bạn hoàn tất.

Sửa đổi file VirtualHost SSL Apache mặc định

Tiếp theo, hãy sửa đổi /etc/apache2/sites-available/default-ssl.conf , file VirtualHost Apache SSL mặc định. Nếu bạn đang sử dụng một file server block khác, hãy thay thế tên của nó trong các lệnh bên dưới.

Trước khi tiếp tục, hãy sao lưu file VirtualHost SSL ban đầu:

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

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

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

Bên trong, với hầu hết các comment đã xóa, file VirtualHost sẽ trông giống như thế này 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>

Ta sẽ thực hiện một số điều chỉnh nhỏ đối với file. Ta sẽ đặt những thứ bình thường mà ta muốn điều chỉnh trong file VirtualHost (địa chỉ email ServerAdmin, Tên server, v.v. ) và điều chỉnh các chỉ thị SSL để trỏ đến certificate và file khóa .

Sau khi thực hiện những thay đổi này, server block của bạn sẽ trông giống 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 file khi hoàn tất.

Như hiện tại, server sẽ cung cấp cả truy cập HTTP không được mã hóa và HTTPS được mã hóa. Để bảo mật tốt hơn, bạn nên chuyển hướng HTTP sang HTTPS. Nếu bạn không cần chức năng này, có thể bỏ qua phần này.

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

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

Bên trong, trong các khối cấu hình VirtualHost , ta cần thêm chỉ thị Redirect , trỏ tất cả lưu lượng truy cập đến version SSL của trang web:

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

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

        . . .
</VirtualHost>

Lưu file khi bạn hoàn tất.

Bước 3 - Điều chỉnh firewall

Nếu bạn đã bật firewall ufw , theo khuyến nghị của các hướng dẫn yêu cầu, bạn có thể điều chỉnh cài đặt để cho phép lưu lượng SSL. Apache đã đăng ký một số cấu hình với ufw khi cài đặt.

Ta có thể xem các cấu hình có sẵn bằng lệnh:

  • sudo ufw app list

Bạn sẽ thấy một danh sách như sau:

Output
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Bạn có thể xem cài đặt hiện tại bằng lệnh:

  • sudo ufw status

Nếu bạn chỉ cho phép lưu lượng truy cập HTTP thông thường trước đó, kết quả có thể trông giống như sau:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Ngoài ra, để cho phép lưu lượng truy cập HTTPS, ta có thể cho phép cấu hình “Apache Full” và sau đó xóa cấu hình “Apache” thừa:

  • sudo ufw allow 'Apache Full'
  • sudo ufw delete allow 'Apache'

Trạng thái của bạn bây giờ sẽ như thế này:

  • 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ước 4 - Bật các thay đổi trong Apache

Bây giờ ta đã áp dụng các thay đổi và điều chỉnh firewall, ta có thể kích hoạt các module SSL và tiêu đề trong Apache, kích hoạt VirtualHost sẵn sàng SSL và khởi động lại Apache.

Ta có thể kích hoạt mod_ssl , module Apache SSL và mod_headers , cần thiết bằng một số cài đặt, bằng lệnh a2enmod :

  • sudo a2enmod ssl
  • sudo a2enmod headers

Tiếp theo, ta có thể kích hoạt VirtualHost SSL của bạn bằng lệnh a2ensite :

  • sudo a2ensite default-ssl

Ta cũng cần kích hoạt file ssl-params.conf , để đọc các giá trị đã đặt:

  • sudo a2enconf ssl-params

Đến đây, trang web và các module cần thiết đã được kích hoạt. Ta nên kiểm tra đảm bảo không có lỗi cú pháp nào trong các file, bằng lệ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à một 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 không gây lỗ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ể khởi động lại Apache một cách an toàn để áp dụng các thay đổi:

  • sudo systemctl restart apache2

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

Bây giờ, ta đã sẵn sàng để kiểm tra server SSL của bạn.

Mở trình duyệt web và nhập https:// theo sau là domain hoặc IP của server vào thanh địa chỉ:

https://server_domain_or_IP

Vì certificate mà ta đã tạo không được ký bởi tổ chức phát hành certificate tin cậy nào được tích hợp trong trình duyệt của bạn, nên bạn có thể thấy một cảnh báo "đáng sợ" như hình dưới:

Cảnh báo certificate tự ký của Apache

Điều này được là bình thường, như ta mong muốn. Ta chỉ quan tâm đến khía cạnh mã hóa của certificate, không phải sự xác nhận của bên thứ ba về tính xác thực của server, vì tự ký là ta biết nó an toàn, chứ không cần xác nhận của một bên công khai nào. Nhấp vào “NÂNG CAO” và sau đó nhấp vào liên kết được cung cấp để tiếp tục với server:

Ghi đè tự ký của Apache

Bạn sẽ được đưa đến trang web. Nếu bạn nhìn vào thanh địa chỉ của trình duyệt, bạn sẽ thấy một ổ khóa có dấu “x” trên đó. Trong trường hợp này, điều này chỉ nghĩa là certificate không thể được xác thực bởi trình duyệt, nhưng nó vẫn đang mã hóa kết nối của bạn.

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

http://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 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 chỉ muốn cho phép truy cập được mã hóa, bạn nên sửa đổi lại VirtualHost Apache chưa được mã hóa để chuyển hướng vĩnh viễn.

Mở lại file cấu hình server block của bạn:

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

Tìm dòng Redirect mà ta đã thêm trước đó. Thêm permanent vào dòng đó, sẽ thay đổi chuyển hướng từ chuyển hướng tạm thời 302 thành 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 file.

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

  • sudo apache2ctl configtest

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

  • sudo systemctl restart apache2

Kết luận

Bạn đã cấu hình server Apache của bạn để sử dụng mã hóa mạnh cho các kết nối client, sẽ ngăn các bên ngoài đọc lưu lượng truy cập của bạn.



Các tin trước

Cài đặt MongoDB trên Ubuntu 18.04 2018-06-07

Cài đặt OpenVPN Server trên Ubuntu 18.04 2018-05-24

Cài đặt LEMP - Linux Nginx MySQL PHP trên Ubuntu 18 04 2018-05-23

Cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04 2018-05-04

Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 18 04 2018-04-27

Bảo mật cơ bản Ubuntu 18.04 2018-04-27

Cài đặt Apache Web Server trên Ubuntu 18.04 2018-04-27

Cài đặt xác thực đăng nhập SSH Keys, không cần password trên Ubuntu 18.04 2018-04-27

Cài đặt SSH Keys trên Ubuntu 16.04 2018-04-12

Cài đặt Node.js trên Ubuntu 16.04 2018-03-07