Thứ năm, 21/04/2016 | 00:00 GMT+7

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

TLS , hay transport layer security và SSL tiền nhiệm của nó, viết tắt của lớp cổng bảo mật, là các giao thức web được sử dụng để bọc lưu lượng truy cập bình 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 lưu lượng một cách an toàn giữa server và client mà không có khả năng các thông điệp bị chặn bởi các bên bên ngoài. 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.

Trong hướng dẫn này, ta sẽ chỉ cho bạn cách cài đặt certificate SSL tự ký để sử dụng với web server Apache trên server Ubuntu 16.04.

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

Chứng chỉ tự ký có thể phù hợp nếu bạn không có domain được liên kết với server của bạn và đối với các trường hợp giao diện web được mã hóa không hướng tới user . Nếu bạn có một domain , trong nhiều trường hợp nó là tốt hơn để sử dụng một certificate CA-ký. 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 .

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 một account user như vậy theo cài đặt server ban đầu của ta cho Ubuntu 16.04 .

Bạn cũng cần phải 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 của bạn , bạn có thể làm theo hướng dẫn của ta về cách cài đặt LAMP trên Ubuntu 16.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 trong hướng dẫn.

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 . 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 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 : Đây là 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 lệ.
  • -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. Passphrase (password bảo vệ) sẽ ngăn điều này xảy ra vì ta sẽ phải nhập passphrase (password bảo vệ) 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.
  • -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.

Như ta đã nêu ở trên, các tùy chọn này sẽ tạo cả file khóa và certificate . Ta sẽ được hỏi một số câu hỏi về server của ta để nhúng thông tin một cách chính xác 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 của bạn hoặc nhiều khả năng hơn là địa chỉ IP công cộng 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 của folder /etc/ssl .

Trong khi ta đang sử dụng OpenSSL, ta cũng nên tạo một group Diffie-Hellman mạnh mẽ, được sử dụng để đàm phán Perfect Forward Secrecy với khách hàng.

Ta có thể làm điều này bằng lệnh :

  • sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Quá trình này có thể mất vài phút, nhưng khi hoàn tất, bạn sẽ có một group DH mạnh tại /etc/ssl/certs/dhparam.pem mà ta có thể sử dụng trong cấu hình của bạn .

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 của bạn để tận dụng những điều 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 mạnh mẽ.
  2. Ta sẽ sửa đổi file Server ảo SSL Apache được bao gồm để trỏ đến certificate SSL đã tạo của ta .
  3. (Được khuyến nghị) Ta sẽ sửa đổi file Server ảo không được mã hóa để tự động chuyển hướng yêu cầu đến Server ảo đượ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 Cài đặt mã hóa mạnh

Đầu tiên, ta sẽ 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 bộ mật mã SSL mạnh mẽ và kích hoạt một số tính năng nâng cao sẽ giúp giữ an toàn cho server của ta . Các tham số ta sẽ đặt được dùng bởi bất kỳ Server ảo 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. Bạn có thể đọc thêm về các quyết định của anh ấy liên quan đến các lựa chọn Apache tại đây .

Các cài đặt được đề xuất trên trang web được liên kết ở trên cung cấp 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 với client cao hơn. Nếu bạn cần hỗ trợ các ứng dụng client cũ hơn, có một danh sách thay thế có thể được truy cập bằng cách nhấp vào liên kết trên trang có nhãn “Có, hãy cung cấp cho tôi trang web mật mã hoạt động với phần mềm cũ / cũ”. Danh sách đó có thể được thay thế cho các mục được sao chép bên dưới.

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ợ. Cả hai đều sẽ cung cấp bảo mật tuyệt vời.

Vì mục đích của ta , 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 hai thay đổi nhỏ.

Đặt chỉ thị SSLOpenSSLConfCmd DHParameters trỏ đến file Diffie-Hellman mà ta đã tạo trước đó. Ngoài ra, 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” . 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ả sâu rộng 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 tải trước 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 bạn hiểu các hàm ý:

/etc/apache2/conf-available/ssl-params.conf
# from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html  SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 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 Strict-Transport-Security "max-age=63072000; includeSubdomains" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off  SSLSessionTickets Off SSLUseStapling on  SSLStaplingCache "shmcb:logs/stapling-cache(150000)"  SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem" 

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

Sửa đổi file server ảo SSL Apache mặc định

Tiếp theo, hãy sửa đổi /etc/apache2/sites-available/default-ssl.conf , file Server ảo Apache SSL mặc định. Nếu bạn đang sử dụng một file khối server 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 backup file Server ảo 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 Server ảo 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 đã bị xóa, file Server ảo 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>                  # BrowserMatch "MSIE [2-6]" \                 #               nokeepalive ssl-unclean-shutdown \                 #               downgrade-1.0 force-response-1.0          </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 Server ảo (địa chỉ email ServerAdmin, Tên server , v.v.), điều chỉnh các chỉ thị SSL để trỏ đến certificate và file khóa của ta và bỏ ghi chú một phần cung cấp khả năng tương thích cho các file cũ hơn các trình duyệt.

Sau khi thực hiện những thay đổi này, khối server 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>                  BrowserMatch "MSIE [2-6]" \                                nokeepalive ssl-unclean-shutdown \                                downgrade-1.0 force-response-1.0          </VirtualHost> </IfModule> 

Lưu file khi bạn 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, trong hầu hết các trường hợp, bạn nên tự động chuyển hướng HTTP sang HTTPS. Nếu bạn 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 file Server ảo không được mã hóa nhằm 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, bên trong các đoạn cấu hình VirtualHost , ta chỉ 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 hướng dẫn yêu cầu , có thể cần điều chỉnh cài đặt để cho phép lưu lượng SSL. May mắn là 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 truy cập HTTP thông thường trước đó, kết quả của bạn 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 phụ cấp cấu hình “Apache” dư 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 của bạn , ta có thể kích hoạt các module SSL và tiêu đề trong Apache, kích hoạt Server ảo sẵn sàng SSL và khởi động lại Apache.

Ta có thể bật mod_ssl , module Apache SSL và mod_headers , cần thiết bằng một số cài đặt trong đoạn mã SSL của ta , bằng lệnh a2enmod :

  • sudo a2enmod ssl
  • sudo a2enmod headers

Tiếp theo, ta có thể kích hoạt Server ảo 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 mình để đọc các giá trị mà ta đặt:

  • sudo a2enconf ssl-params

Đến đây, trang web của ta và các module cần thiết đã được kích hoạt. Ta nên kiểm tra đảm bảo rằng không có lỗi cú pháp nào trong các file của ta . Ta có thể làm điều này 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 chỉ 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 vì tin nhắn sẽ không có hạ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 của bạn :

  • 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 một trong những tổ chức phát hành certificate tin cậy của trình duyệt của bạn, bạn có thể sẽ thấy một cảnh báo trông đáng sợ như hình dưới đây:

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

Điều này được mong đợi và bình thường. Ta chỉ quan tâm đến khía cạnh mã hóa của certificate của ta , chứ 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 của ta . 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 của bạn:

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. 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 thành 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 Server ảo Apache chưa được mã hóa để chuyển hướng vĩnh viễn.

Mở lại file cấu hình khối server 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 đó, điều này 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 và đóng file .

Kiểm tra cấu hình của bạn để 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 . Điều này sẽ cho phép bạn gửi các 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.


Tags:

Các tin liên quan

Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 16.04
2016-04-21
Cách thiết lập server ảo Apache trên Ubuntu 16.04
2016-04-21
Cách thiết lập Let's Encrypt chứng chỉ cho nhiều server ảo Apache trên Ubuntu 14.04
2016-01-19
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 14.04
2015-12-18
Cách thiết lập server lưu lượng truy cập Apache làm Reverse-Proxy trên Ubuntu 14.04
2015-10-03
Cách thiết lập một cụm thụ động chủ động Apache bằng máy tạo nhịp tim trên CentOS 7
2015-09-08
Cách bảo vệ server Apache với Fail2Ban trên Ubuntu 14.04
2015-08-14
Cách cài đặt Apache Kafka trên Ubuntu 14.04
2015-08-12
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 14.04
2015-08-10
Cách bảo vệ chống lại DoS và DDoS với mod_evasive cho Apache trên CentOS 7
2015-07-30