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

Cách tạo chứng chỉ SSL tự ký cho Nginx 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 Nginx 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 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 16.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 16.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/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 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 chỉ 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. 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 Nginx 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 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. Ta cũng sẽ tiếp tục và đặt cài đặt ssl_dhparam trỏ đến file Diffie-Hellman mà ta đã tạo trước đó.

Cuối cùng, 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. 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/nginx/snippets/ssl-params.conf
# from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Disable preloading HSTS for now.  You can use the commented out header line that includes # the "preload" directive if you understand the implications. #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff;  ssl_dhparam /etc/ssl/certs/dhparam.pem; 

Bởi vì ta đang sử dụng certificate tự ký, ghim SSL sẽ không được sử dụng. Nginx sẽ chỉ xuất ra một 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 khối server default trong folder /etc/nginx/sites-available . Nếu bạn đang sử dụng 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 khối server hiện tại của ta :

  • sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

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

  • sudo nano /etc/nginx/sites-available/default

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

/ etc / nginx / sites-available / default
server {     listen 80 default_server;     listen [::]:80 default_server;      # SSL configuration      # listen 443 ssl default_server;     # listen [::]:443 ssl default_server;      . . . 

Ta sẽ sửa đổi cấu hình này để các yêu cầu HTTP không được mã hóa tự động được chuyển hướng đến HTTPS được mã hóa. Điều này cung cấp bảo mật tốt nhất cho các trang web của ta . Nếu bạn muốn cho phép cả truy cập HTTP và HTTPS, hãy sử dụng cấu hình thay thế sau.

Ta sẽ chia cấu hình thành hai khối riêng biệt. Sau hai chỉ thị listen đầu tiên, ta sẽ thêm chỉ thị server_name , được đặt thành domain của server của bạn hoặc nhiều khả năng là địa chỉ IP. Sau đó, ta sẽ cài đặt chuyển hướng đến khối server thứ hai mà ta sẽ tạo. Sau đó, ta sẽ đóng khối ngắn này:

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.

/ etc / nginx / sites-available / default
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name server_domain_or_IP;     return 302 https://$server_name$request_uri; }      # SSL configuration      # listen 443 ssl default_server;     # listen [::]:443 ssl default_server;      . . . 

Tiếp theo, ta cần khởi động một khối server mới ngay bên dưới để chứa cấu hình còn lại. Ta có thể bỏ ghi chú hai chỉ thị listen sử dụng cổng 443. Ta có thể thêm http2 vào các dòng này để kích hoạt HTTP / 2 trong khối này. Sau đó, ta chỉ cần đưa vào hai file đoạn mã mà ta đã cài đặt :

Lưu ý: Bạn có thể chỉ có một chỉ thị listen bao gồm công cụ sửa đổi default_server cho mỗi version IP và kết hợp cổng. Nếu bạn đã bật các khối server khác cho các cổng này đã đặt default_server , bạn phải xóa công cụ sửa đổi khỏi một trong các khối.

/ etc / nginx / sites-available / default
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name server_domain_or_IP;     return 302 https://$server_name$request_uri; }  server {      # SSL configuration      listen 443 ssl http2 default_server;     listen [::]:443 ssl http2 default_server;     include snippets/self-signed.conf;     include snippets/ssl-params.conf;      . . . 

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

(Cấu hình thay thế) Cho phép cả truy cập HTTP và HTTPS

Nếu bạn muốn hoặc cần cho phép cả nội dung được mã hóa và không được mã hóa, bạn sẽ phải cấu hình Nginx hơi khác một chút. Điều này thường không được khuyến khích nếu có thể tránh được, nhưng trong một số trường hợp, nó có thể cần thiết. Về cơ bản, ta chỉ nén hai khối server riêng biệt thành một khối và xóa chuyển hướng:

/ etc / nginx / sites-available / default
server {     listen 80 default_server;     listen [::]:80 default_server;     listen 443 ssl http2 default_server;     listen [::]:443 ssl http2 default_server;      server_name server_domain_or_IP;     include snippets/self-signed.conf;     include snippets/ssl-params.conf;      . . . 

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ầ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/default

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

/ etc / nginx / sites-available / default
server {     listen 80 default_server;     listen [::]:80 default_server;     server_name server_domain_or_IP;     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 cài đặt Nginx trên Ubuntu 16.04
2016-04-21
Cách cài đặt Discourse Behind Nginx trên Ubuntu 14.04
2016-04-19
Cách thiết lập Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 16.04
2016-04-12
Cách thêm module gzip vào Nginx trên CentOS 7
2016-03-15
Cách thêm module gzip vào Nginx trên Ubuntu 14.04
2016-03-09
Cách thiết lập xác thực HTTP cơ bản với Nginx trên Ubuntu 14.04
2016-02-22
Cách thiết lập xác thực HTTP cơ bản với Nginx trên CentOS 7
2016-02-22
Cách bảo mật Nginx trên Ubuntu 14.04
2016-02-12
Cách bảo mật Nginx bằng Let's Encrypt trên CentOS 7
2016-01-26
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 14.04
2015-12-17