Thứ năm, 05/07/2018 | 00:00 GMT+7

Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.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 Nginx trên server Ubuntu 18.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 18.04 .

Bạn cũng cần phải cài đặt web server Nginx. Nếu bạn muốn cài đặt toàn bộ LEMP (Linux, Nginx, 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 LEMP trên Ubuntu 18.04 .

Nếu bạn chỉ muốn web server Nginx, thay vào đó bạn có thể làm theo hướng dẫn của ta về cách cài đặt Nginx trên Ubuntu 18.04 .

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/nginx-selfsigned.key -out /etc/ssl/certs/nginx-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 Nginx để 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/nginx/dhparam.pem 4096

Quá trình này sẽ mất một lúc, nhưng khi hoàn tất, bạn sẽ có một group DH mạnh tại /etc/nginx/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 Nginx để 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 Nginx của bạn để tận dụng những lợi ích này.

Ta sẽ thực hiện một vài đ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ứa khóa SSL và các vị trí file certificate của ta .
  2. Ta sẽ tạo đoạn mã cấu hình chứa cài đặt SSL mạnh được dùng với bất kỳ certificate nào trong tương lai.
  3. Ta sẽ điều chỉnh các khối server Nginx của bạn để xử lý các yêu cầu SSL và sử dụng hai đoạn mã trên.

Phương pháp cấu hình Nginx này sẽ cho phép ta giữ các khối server sạch sẽ và đưa các phân đoạn cấu hình chung vào các module có thể tái sử dụng.

Tạo đoạn mã cấu hình trỏ đến khóa và certificate SSL

Đầu tiên, hãy tạo đoạn mã cấu hình Nginx mới trong folder /etc/nginx/snippets .

Để phân biệt đúng mục đích của file này, hãy gọi nó là self-signed.conf :

  • sudo nano /etc/nginx/snippets/self-signed.conf

Trong file này, ta cần đặt chỉ thị ssl_certificate thành file certificate của ta và ssl_certificate_key thành khóa được liên kết. Trong trường hợp của ta , nó sẽ trông như thế này:

/etc/nginx/snippets/self-signed.conf
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; 

Khi bạn đã thêm những dòng đó, hãy lưu file .

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

Tiếp theo, ta sẽ tạo một đoạn mã khác sẽ xác định một số cài đặt SSL. Điều này sẽ cài đặt Nginx 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 lại trong các cấu hình Nginx trong tương lai, vì vậy ta sẽ đặt tên chung cho file :

  • sudo nano /etc/nginx/snippets/ssl-params.conf

Để cài đặt Nginx 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 đượ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 chỉ cần thực hiện một vài sửa đổi nhỏ.

Đầu tiên, ta sẽ thêm trình phân giải DNS ưa thích của bạn cho các yêu cầu ngược dòng. Ta sẽ sử dụng Google cho hướng dẫn này.

Thứ hai, ta sẽ comment dòng cài đặt tiêu đề bảo mật truyền tải nghiêm ngặt. Trước khi bỏ comment này, bạn nên 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.

Sao chép phần sau vào file đoạn mã ssl-params.conf của bạn:

/etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0 ssl_session_timeout  10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 ssl_stapling on; # Requires nginx >= 1.3.7 ssl_stapling_verify on; # Requires nginx => 1.3.7 resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Disable strict transport security for now. You can uncomment the following # line if you understand the implications. # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; 

Bởi vì ta đang sử dụng certificate tự ký, ghim SSL sẽ không được sử dụng. Nginx sẽ đưa ra cảnh báo, tắt ghim cho certificate tự ký của ta và tiếp tục hoạt động chính xác.

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

Điều chỉnh cấu hình Nginx để sử dụng SSL

Bây giờ ta đã có các đoạn mã của bạn , ta có thể điều chỉnh cấu hình Nginx của bạn để bật SSL.

Trong hướng dẫn này, ta sẽ giả định bạn đang sử dụng file cấu hình khối server tùy chỉnh trong folder /etc/nginx/sites-available . Ta sẽ sử dụng /etc/nginx/sites-available/example.com cho ví dụ này. Thay thế tên file cấu hình của bạn nếu cần.

Trước khi tiếp tục, hãy backup file cấu hình hiện tại của ta :

  • sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak

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

  • sudo nano /etc/nginx/sites-available/example.com

Bên trong, khối server của bạn có thể bắt đầu tương tự như sau:

/etc/nginx/sites-available/example.com
server {     listen 80;     listen [::]:80;      server_name example.com www.example.com;      root /var/www/example.com/html;     index index.html index.htm index.nginx-debian.html;      . . . } 

Tệp của bạn có thể theo một thứ tự khác và thay vì các index thị rootindex bạn có thể có một số location , proxy_pass hoặc các câu lệnh cấu hình tùy chỉnh khác. Điều này không sao cả, vì ta chỉ cần cập nhật chỉ thị listen và bao gồm các đoạn mã SSL của ta . Ta sẽ sửa đổi khối server hiện có này để phục vụ lưu lượng SSL trên cổng 443, sau đó tạo một khối server mới để phản hồi trên cổng 80 và tự động chuyển hướng lưu lượng đến cổng 443.

Lưu ý: Ta sẽ sử dụng chuyển hướng 302 cho đến khi ta xác minh mọi thứ đang hoạt động bình thường. Sau đó, ta có thể thay đổi điều này thành chuyển hướng 301 vĩnh viễn.

Trong file cấu hình hiện có của bạn, hãy cập nhật hai câu lệnh listen để sử dụng cổng 443 và ssl, sau đó bao gồm hai file đoạn mã mà ta đã tạo ở các bước trước:

/etc/nginx/sites-available/example.com
server {     listen 443 ssl;     listen [::]:443 ssl;     include snippets/self-signed.conf;     include snippets/ssl-params.conf;      server_name example.com www.example.com;      root /var/www/example.com/html;     index index.html index.htm index.nginx-debian.html;      . . . } 

Tiếp theo, dán khối server thứ hai vào file cấu hình, sau dấu đóng ngoặc ( } ) của khối đầu tiên:

/etc/nginx/sites-available/example.com
. . . server {     listen 80;     listen [::]:80;      server_name example.com www.example.com;      return 302 https://$server_name$request_uri; } 

Đây là một cấu hình cơ bản lắng nghe trên cổng 80 và thực hiện chuyển hướng đến HTTPS. Lưu file khi bạn hoàn tất chỉnh sửa.

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ần điều chỉnh cài đặt để cho phép lưu lượng SSL. May mắn là Nginx đă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: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

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

  • sudo ufw status

Nó có thể sẽ giống như thế này, nghĩa là chỉ truy cập HTTP được phép đến web server :

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (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 “Nginx Full” và sau đó xóa phụ cấp cấu hình “Nginx HTTP” dư thừa:

  • sudo ufw allow 'Nginx Full'
  • sudo ufw delete allow 'Nginx HTTP'

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 Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Bước 4 - Bật các thay đổi trong Nginx

Bây giờ ta đã áp dụng các thay đổi và điều chỉnh firewall của bạn , ta có thể khởi động lại Nginx để áp dụng các thay đổi mới của bạn .

Trước tiên, 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 nginx -t

Nếu mọi thứ thành công, bạn sẽ nhận được kết quả như sau:

Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Lưu ý cảnh báo trong đầu. Như đã lưu ý trước đó, cài đặt cụ thể này đưa ra cảnh báo vì certificate tự ký của ta không thể sử dụng ghim SSL. Điều này được mong đợi và server của ta vẫn có thể mã hóa các kết nối một cách chính xác.

Nếu kết quả của bạn phù hợp với những điều trên, thì 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 Nginx một cách an toàn để áp dụng các thay đổi của bạn :

  • sudo systemctl restart nginx

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 Nginx

Đ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 Nginx

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 Nginx với hai khối server , tự động chuyển hướng nội dung 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 cấu hình Nginx để 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/nginx/sites-available/example.com

Tìm giá trị return 302 và thay đổi nó để return 301 :

/etc/nginx/sites-available/example.com
    return 301 https://$server_name$request_uri; 

Lưu và đóng file .

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

  • sudo nginx -t

Khi đã sẵn sàng , hãy khởi động lại Nginx để thực hiện chuyển hướng vĩnh viễn:

  • sudo systemctl restart nginx

Kết luận

Bạn đã cấu hình server Nginx 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 Nginx bằng Let's Encrypt trên FreeBSD
2018-07-02
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04
2018-04-27
Cách cài đặt và bảo mật phpMyAdmin với Nginx trên Ubuntu 16.04
2018-04-12
Cách lưu trữ trang web bằng Cloudflare và Nginx trên Ubuntu 16.04
2018-03-15
Nginx Essentials: Khắc phục sự cố cài đặt và cấu hình
2017-12-12
Cách thiết lập Let's Encrypt với Nginx Server Blocks trên Ubuntu 16.04
2017-10-27
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04
2017-10-27
Cách tăng điểm tốc độ trang bằng cách thay đổi cấu hình Nginx của bạn trên Ubuntu 16.04
2017-08-15
Cách thêm module log vào Nginx trên Debian 8
2017-06-21
Cách triển khai ứng dụng Laravel với Nginx trên Ubuntu 16.04
2017-06-14