Thứ hai, 09/01/2017 | 00:00 GMT+7

Cách tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 7

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 CentOS 7.

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ý. Để tìm hiểu cách cài đặt certificate tin cậy miễn phí, hãy làm theo hướng dẫn của ta về cách cài đặt Nginx với certificate Let's Encrypt trên CentOS 7 .

Yêu cầu

Đầu tiên, bạn nên có một user không phải root được cấu hình 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 của ta cho CentOS 7 .

Khi đã sẵn sàng để bắt đầu, hãy đăng nhập vào server của bạn với quyền là user sudo của bạn.

Bước 1: Cài đặt Nginx và điều chỉnh firewall

Trước khi bắt đầu, ta nên đảm bảo web server Nginx đã được cài đặt trên máy của ta .

Trong khi Nginx không có sẵn trong repository mặc định CentOS, nó hiện diện trong EPEL (gói bổ sung cho Enterprise Linux) kho. Ta có thể kích hoạt kho EPEL để cung cấp cho server của ta quyền truy cập vào gói Nginx bằng lệnh :

  • sudo yum install epel-release

Tiếp theo, ta có thể cài đặt Nginx bằng lệnh :

  • sudo yum install nginx

Bắt đầu dịch vụ Nginx bằng lệnh :

  • sudo systemctl start nginx

Kiểm tra xem dịch vụ có hoạt động hay không bằng lệnh :

  • systemctl status nginx
Output
● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2017-01-06 17:27:50 UTC; 28s ago . . . Jan 06 17:27:50 centos-512mb-nyc3-01 systemd[1]: Started The nginx HTTP and reverse proxy server.

Bạn cũng cần bật Nginx, vì vậy nó sẽ bắt đầu khi server của bạn khởi động:

  • sudo systemctl enable nginx
Output
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

Tiếp theo, ta cần đảm bảo ta không chặn quyền truy cập vào cổng 80 và 443 bằng firewall . Nếu bạn không sử dụng firewall , bạn có thể chuyển sang phần tiếp theo.

Nếu bạn có một bức firewall firewalld chạy, bạn có thể mở các cổng bằng lệnh :

  • sudo firewall-cmd --add-service=http
  • sudo firewall-cmd --add-service=https
  • sudo firewall-cmd --runtime-to-permanent

Nếu firewall iptables đang chạy, các lệnh bạn cần chạy phụ thuộc nhiều vào bộ luật hiện tại của bạn. Đối với bộ luật cơ bản, bạn có thể thêm quyền truy cập HTTP và HTTPS bằng lệnh :

  • sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
  • sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Đến đây bạn có thể truy cập trang Nginx mặc định thông qua trình duyệt web.

Bước 2: 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.

Thư mục /etc/ssl/certs , được dùng để giữ certificate chung, đã tồn tại trên server . Ta cũng hãy tạo một folder /etc/ssl/private để giữ file private key . Vì tính bí mật của khóa này là cần thiết để bảo mật, ta sẽ khóa các quyền để ngăn truy cập trái phép:

  • sudo mkdir /etc/ssl/private
  • sudo chmod 700 /etc/ssl/private

Bây giờ, 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 bằng lệnh :

  • 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 đị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 3: Cấu hình Nginx để sử dụng SSL

Cấu hình Nginx mặc định trong CentOS khá không có cấu trúc, với khối server HTTP mặc định nằm trong file cấu hình chính. Nginx sẽ kiểm tra các file có .conf trong folder /etc/nginx/conf.d để biết cấu hình bổ sung.

Ta sẽ tạo một file mới trong folder này để cấu hình khối server cung cấp nội dung bằng các file certificate mà ta đã tạo. Sau đó, ta có thể tùy chọn cấu hình khối server mặc định để chuyển hướng các yêu cầu HTTP đến HTTPS.

Tạo Khối server TLS / SSL

Tạo và mở một file gọi là ssl.conf trong /etc/nginx/conf.d folder :

  • sudo vi /etc/nginx/conf.d/ssl.conf

Bên trong, bắt đầu bằng cách mở một khối server . Theo mặc định, kết nối TLS / SSL sử dụng cổng 443, vì vậy đó sẽ là cổng listen của ta . server_name phải được đặt thành domain hoặc địa chỉ IP của server mà bạn đã sử dụng làm Tên chung khi tạo certificate của bạn . Tiếp theo, sử dụng các ssl_certificate , ssl_certificate_keyssl_dhparam để đặt vị trí của các file SSL mà ta đã tạo:

/etc/nginx/conf.d/ssl.conf
server {     listen 443 http2 ssl;     listen [::]:443 http2 ssl;      server_name server_IP_address;      ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;     ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;     ssl_dhparam /etc/ssl/certs/dhparam.pem; } 

Tiếp theo, ta sẽ thêm một số tùy chọn SSL bổ sung sẽ tăng tính bảo mật cho trang web của ta . Các tùy chọn ta sẽ sử dụng là các đề xuất từ 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ể tìm hiểu thêm về các quyết định của anh ấy liên quan đến các lựa chọn Nginx bằng cách đọc Bảo mật SSL mạnh trên nginx .

Lưu ý: Các cài đặt đề xuất mặc định trên Cipherli.st 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 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 khả năng tương thích được dùng thay cho các đề xuất mặc định trong cấu hình ở trên giữa hai khối comment . 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ó một vài phần của cấu hình mà bạn có thể cần sửa đổi. Đầu tiên, bạn có thể 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 vào chỉ thị resolver . Ta đã sử dụng Google cho hướng dẫn này, nhưng bạn có thể thay đổi điều này nếu bạn có các tùy chọn khá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/conf.d/ssl.conf
server {     listen 443 http2 ssl;     listen [::]:443 http2 ssl;      server_name server_IP_address;      ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;     ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;     ssl_dhparam /etc/ssl/certs/dhparam.pem;      ########################################################################     # 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;      ##################################     # END https://cipherli.st/ BLOCK #     ################################## } 

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.

Cuối cùng, thêm phần còn lại của cấu hình Nginx cho trang web . Điều này sẽ khác nhau tùy thuộc vào nhu cầu của bạn. Ta sẽ chỉ sao chép một số lệnh được sử dụng trong khối vị trí mặc định cho ví dụ của ta , điều này sẽ đặt root tài liệu và một số trang lỗi:

/etc/nginx/conf.d/ssl.conf
server {     listen 443 http2 ssl;     listen [::]:443 http2 ssl;      server_name server_IP_address;      ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;     ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;     ssl_dhparam /etc/ssl/certs/dhparam.pem;      ########################################################################     # from https://cipherli.st/                                            #     # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #     ########################################################################      . . .      ##################################     # END https://cipherli.st/ BLOCK #     ##################################      root /usr/share/nginx/html;      location / {     }      error_page 404 /404.html;     location = /404.html {     }      error_page 500 502 503 504 /50x.html;     location = /50x.html {     } } 

Khi bạn hoàn tất, hãy lưu và thoát. Điều này cấu hình Nginx để sử dụng certificate SSL được tạo của ta để mã hóa lưu lượng. Các tùy chọn SSL được chỉ định đảm bảo chỉ những giao thức và mật mã an toàn nhất mới được sử dụng. Lưu ý cấu hình ví dụ này chỉ phục vụ trang Nginx mặc định, vì vậy bạn có thể cần sửa đổi nó để đáp ứng nhu cầu của bạn .

(Tùy chọn) Tạo chuyển hướng từ HTTP sang HTTPS

Với cấu hình hiện tại của ta , Nginx phản hồi bằng nội dung được mã hóa cho các yêu cầu trên cổng 443, nhưng phản hồi bằng nội dung không được mã hóa cho các yêu cầu trên cổng 80. Điều này nghĩa là trang web của ta cung cấp mã hóa, nhưng không thực thi việc sử dụng nó. Điều này có thể ổn đối với một số trường hợp sử dụng, nhưng thường tốt hơn là yêu cầu mã hóa. Điều này đặc biệt quan trọng khi dữ liệu bí mật như password có thể được chuyển giữa trình duyệt và server .

Rất may, file cấu hình Nginx mặc định cho phép ta dễ dàng thêm chỉ thị vào khối server cổng 80 mặc định bằng cách thêm file trong folder /etc/nginx/default.d . Tạo một file mới có tên ssl-redirect.conf và mở nó để chỉnh sửa bằng lệnh sau:

  • sudo vi /etc/nginx/default.d/ssl-redirect.conf

Sau đó paste vào dòng này:

/etc/nginx/default.d/ssl-redirect.conf
return 301 https://$host$request_uri/; 

Lưu file khi bạn hoàn tất. Thao tác này cấu hình khối server HTTP trên cổng 80 (mặc định) để chuyển hướng các yêu cầu đến đến khối server HTTPS mà ta đã cấu hình .

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

Bây giờ ta đã áp dụng các thay đổi của bạn , ta có thể khởi động lại Nginx để triển khai cấu hình 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

Quá trình Nginx sẽ được khởi động lại, triển khai cài đặt SSL mà ta đã cấu hình .

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 số dấu hiệu về bảo mật một phần. Đây có thể là một ổ khóa có dấu “x” trên đó hoặc hình tam giác với dấu chấm than. 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 để chuyển hướng các yêu cầu HTTP đến 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.

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 thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 8
2016-12-22
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 8
2016-12-20
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8
2016-12-19
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Nginx
2016-12-19
Cách thêm module gzip vào Nginx trên Ubuntu 16.04
2016-12-02
Cơ sở hạ tầng SaltStack: Tạo Salt State cho web server Nginx
2016-11-07
Cách thêm module log vào Nginx trên Ubuntu 16.04
2016-10-31
Cách thêm module log vào Nginx trên CentOS 7
2016-10-31
Cách di chuyển web root Nginx đến vị trí mới trên Ubuntu 16.04
2016-07-29