Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 9
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 Debian 9.
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í với dự án Let's Encrypt, hãy tham khảo Cách bảo mật Nginx bằng Let's Encrypt trên Debian 9 .
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 Debian 9 .
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 Debian 9 .
Nếu chỉ muốn có web server Nginx, bạn có thể làm theo hướng dẫn của ta về cách cài đặt Nginx trên Debian 9 .
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:
OutputCountry 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 .
- 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 .
- 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.
- 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:
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 , 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:
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 nhưng vẫn 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:
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ị root
và index
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:
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:
. . . 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:
OutputAvailable applications: . . . Nginx Full Nginx HTTP Nginx HTTPS . . .
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 :
OutputStatus: 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
OutputStatus: 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:
Outputnginx: [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 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, nên bạn có thể sẽ thấy một cảnh báo trông đáng sợ như hình bên dưới (phần sau xuất hiện khi sử dụng Google Chrome):
Đ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:
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
:
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.
Các tin liên quan
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 92018-09-06
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 9
2018-09-05
Cách cài đặt Nginx trên Debian 9
2018-09-04
Cách cài đặt Nginx trên Ubuntu 18.04 [Quickstart]
2018-07-23
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 18.04
2018-07-13
Cách di chuyển web root Nginx đến vị trí mới trên Ubuntu 18.04
2018-07-12
Cách cấu hình Jenkins với SSL bằng Nginx Reverse Proxy trên Ubuntu 18.04
2018-07-10
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 18.04
2018-07-09
Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.04
2018-07-05
Cách bảo mật Nginx bằng Let's Encrypt trên FreeBSD
2018-07-02