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:
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:
- Ta sẽ tạo đoạn mã cấu hình để chỉ định cài đặt SSL mặc định.
- Ta sẽ sửa đổi file VirtualHost SSL Apache để trỏ đến certificate SSL đã tạo.
- (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ở:
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:
<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:
<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.
(khuyến khích) Sửa đổi file server HTTP để chuyển hướng sang HTTPS
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:
<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:
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:
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
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:
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:
Đ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:
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:
<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