Thứ năm, 23/09/2021 | 00:00 GMT+7

Tạo Chứng chỉ Self-signed SSL certificate với nginx trên ubuntu 20.04.1

TLS , hay bảo mật lớp truyền tải và SSL tiền nhiệm của nó, viết tắt của secure socket layer, là các giao thức web được sử dụng để bảo vệ và mã hóa lưu lượng truy cập qua mạng máy tính.

Với TLS / SSL, server có thể gửi lưu lượng truy cập giữa server và máy khách một cách an toàn mà không có khả năng các thông báo bị chặn bởi các bên bên ngoài. Hệ thống chứng chỉ cũng hỗ trợ user xác minh danh tính của các trang web mà họ đang kết nối.

Hướng dẫn này sẽ trình bày cách cài đặt chứng chỉ SSL tự ký để sử dụng với web server Nginx trên server Ubuntu 20.04.

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

Chứng chỉ tự ký có thể phù hợp nếu bạn không có tên miền được liên kết với server và đối với các trường hợp mà giao diện web được mã hóa không hướng tới user. Nếu bạn có một tên miền, trong nhiều trường hợp nó là tốt hơn để sử dụng một chứng chỉ CA-ký. Bạn có thể tìm hiểu cách cài đặt chứng chỉ tin cậy miễn phí với dự án Let's Encrypt .

Yêu cầu

Trước khi bắt đầu, bạn nên cấu hình user không phải root với các sudo và bật tường lửa. Bạn có thể tìm hiểu cách cài đặt một tài khoản user như vậy theo cài đặt server ban đầu cho Ubuntu 20.04.

Bạn cũng cần phải cài đặt web server Nginx. Làm theo hướng dẫn về cách cài đặt Nginx trên Ubuntu 20.04 . Đảm bảo hoàn thành Bước 5 của hướng dẫn này và cài đặt server block, vì điều này cần thiết để kiểm tra xem Nginx có thể mã hóa các kết nối bằng chứng chỉ tự ký của bạn hay không.

Nếu bạn muốn cài đặt toàn bộ LEMP (Linux, Nginx, MySQL, PHP) trên server, bạn có thể làm theo hướng dẫn về cách cài đặt LEMP trên Ubuntu 20.04 thay vì hướng dẫn cài đặt Nginx độc lập.

Bước 1 - Tạo chứng chỉ SSL

TLS / SSL hoạt động bằng sự kết hợp của chứng chỉ công khai và khóa riêng tư. Khóa SSL được giữ bí mật trên server và mã hóa nội dung được gửi đến máy khách. 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.

Bạn có thể tạo cặp chứng chỉ 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

Dưới đây là phân tích về những gì mỗi phần của lệnh này thực hiện:

  • sudo : Lệnh sudo cho phép các thành viên của sudo tạm thời nâng cấp quyền của họ lên quyền của user khác (theo mặc định là superuser hoặc root user). Điều này là cần thiết trong trường hợp này vì ta đang tạo chứng chỉ và cặp khóa trong thư mục /etc/ , chỉ user root hoặc các tài khoản quyền khác mới có thể truy cập được.
  • openssl : Đây là công cụ dòng lệnh cơ bản để tạo và quản lý chứng chỉ OpenSSL, khóa và các tệp 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ý chứng chỉ (CSR) X.509. “X.509” là tiêu chuẩn cơ sở hạ tầng khóa công khai mà SSL và TLS tuân theo để quản lý khóa và chứng chỉ của nó. Ta muốn tạo một chứng chỉ 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 chứng chỉ tự ký thay vì tạo yêu cầu ký chứng chỉ, như thường lệ.
  • -nodes : Điều này yêu cầu OpenSSL bỏ qua tùy chọn để bảo mật chứng chỉ bằng cụm mật khẩu. Ta cần Nginx để có thể đọc tệp mà không cần sự can thiệp của user, khi server khởi động. Cụm mật khẩu sẽ ngăn điều này xảy ra vì ta sẽ phải nhập cụm mật khẩu 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à chứng chỉ 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 chứng chỉ mới và khóa mới cùng một lúc. Ta đã không tạo khóa bắt buộc để ký chứng chỉ ở bước trước, vì vậy ta cần tạo khóa cùng với chứng chỉ. 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 tệp khóa cá nhân đã tạo mà ta đang tạo.
  • -out : Điều này cho OpenSSL biết nơi đặt chứng chỉ mà ta đang tạo.

Như đã nêu trước đây, các tùy chọn này sẽ tạo cả tệp khóa và chứng chỉ. Sau khi chạy lệnh này, bạn sẽ được hỏi một số câu hỏi về server để nhúng thông tin một cách chính xác vào chứng chỉ.

Đ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 tên miền được liên kết với server 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ẽ 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 tệp bạn đã tạo sẽ được đặt trong các thư mục con thích hợp của thư mục /etc/ssl .

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

Bạn có thể thực hiện việc 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 sẽ được sử dụng trong quá trình cấu hình.

Bước 2 - Cấu hình Nginx để sử dụng SSL

Bây giờ các tệp khóa và chứng chỉ của bạn trong thư mục /etc/ssl đã được tạo, bạn cần sửa đổi cấu hình Nginx của bạn để tận dụng chúng.

Đầu tiên, bạn sẽ tạo đoạn mã cấu hình với thông tin về khóa SSL và vị trí tệp chứng chỉ. Sau đó, bạn sẽ tạo đoạn mã cấu hình có cài đặt SSL mạnh được dùng với bất kỳ chứng chỉ nào trong tương lai. Cuối cùng, bạn sẽ điều chỉnh các server block Nginx của bạn bằng cách sử dụng hai đoạn mã cấu hình mà bạn đã tạo để các yêu cầu SSL có thể được xử lý một cách thích hợp.

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

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

Trước tiên, hãy sử dụng trình soạn thảo văn bản bạn muốn để tạo đoạn mã cấu hình Nginx mới trong thư mục /etc/nginx/snippets . Ví dụ sau sử dụng nano .

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

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

Trong tệp này, bạn cần đặt ssl_certificate thành tệp chứng chỉ của bạn và ssl_certificate_key thành khóa được liên kết. Điều này sẽ giống như sau:

/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 tệp và thoát khỏi editor. Nếu bạn đã sử dụng nano để chỉnh sửa tệp, bạn có thể thực hiện bằng cách nhấn CTRL + X , Y , sau đó ENTER .

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

Tiếp theo, bạn 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 giúp giữ an toàn cho server.

Các tham số bạn đặt được dùng lại trong các cấu hình Nginx trong tương lai, vì vậy bạn có thể đặt tên chung cho tệp:

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

Để cài đặt Nginx SSL một cách an toàn, ta sẽ điều chỉnh các đề xuất từ Cipherlist.eu . Cipherlist.eu là một tài nguyên hữu ích và dễ tiêu hóa để hiểu các cài đặt mã hóa được sử dụng cho phần mềm phổ biến.

Lưu ý : Các cài đặt được đề xuất này từ Cipherlist.eu 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 máy khách 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 một trang web mật mã hoạt động với phần mềm cũ / cũ”. Nếu muốn, bạn có thể thêm vào danh sách đó bằng nội dung của khối mã ví dụ tiếp theo.

Việc lựa chọn cấu hình nào để 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 bạn, hãy sao chép toàn bộ cài đặt được cung cấp, nhưng trước tiên, bạn cần thực hiện một vài sửa đổi nhỏ.

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

Thứ hai, comment dòng đặ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ũng có thể gây ra hậu quả tiêu cực sâu rộng nếu vô tình được kích hoạt hoặc kích hoạt không chính xác.

Thêm phần sau vào tệp đoạn mã ssl-params.conf

/etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; 
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout  10m;
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 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";

Vì bạn đang sử dụng chứng chỉ tự ký, ghim SSL sẽ không được sử dụng. Nginx sẽ đưa ra cảnh báo và tắt ghim cho chứng chỉ tự ký , nhưng sau đó sẽ tiếp tục hoạt động chính xác.

Lưu và đóng tệp bằng cách nhấn CTRL + X rồi nhấn YENTER khi bạn hoàn tất.

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

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

Trong hướng dẫn này, ta sẽ giả định bạn đang sử dụng tệp cấu hình server block tùy chỉnh trong thư mục /etc/nginx/sites-available . Hướng dẫn này cũng tuân theo các quy ước từ hướng dẫn Nginx tiên quyết và sử dụng /etc/nginx/sites-available/ your_domain cho ví dụ này. Thay thế tên tệp cấu hình của bạn nếu cần.

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

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

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

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

Bên trong, server block có thể bắt đầu tương tự như sau:

/ etc / nginx / sites-available / your_domain
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Tệp của bạn có thể theo một thứ tự khác và thay vì các rootindex , bạn có thể có một số câu lệnh 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 là tốt vì bạn chỉ cần cập nhật các listen và bao gồm các đoạn mã SSL. Sau đó, sửa đổi server block hiện có này để phục vụ lưu lượng SSL trên cổng 443 và tạo một server block 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 ý: Sử dụng chuyển hướng 302 cho đến khi bạn xác minh mọi thứ đang hoạt động bình thường. Sau đó, bạn sẽ thay đổi điều này thành chuyển hướng 301 vĩnh viễn.

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

/ etc / nginx / sites-available / your_domain
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

  server_name your_domain.com www.your_domain.com;

  location / {
                try_files $uri $uri/ =404;
        }
}


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

/etc/nginx/sites-available/your_domain.com

server {
    listen 80;
    listen [::]:80;

    server_name your_domain.com www.your_domain.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 và đóng tệp bằng cách nhấn CTRL + X rồi nhấn YENTER khi bạn hoàn tất chỉnh sửa.

Bước 3 - Điều chỉnh tường lửa

Nếu bạn đã ufw , theo đề xuất của 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.

Bạn có thể xem lại các cấu hình có sẵn bằng lệnh:

  • sudo ufw app list

Một danh sách như sau sẽ xuất hiện:

Output
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Bạn có thể kiểm tra cài đặt hiện tại bằng lệnh sudo ufw status :

  • sudo ufw status

Nó có thể sẽ tạo ra phản hồi sau, 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)

Để cho phép lưu lượng truy cập HTTPS, bạn có thể cập nhật quyền cho 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'

Sau khi chạy sudo ufw status , bạn sẽ nhận được kết quả sau:

  • 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)

Kết quả này xác nhận các điều chỉnh đối với tường lửa của bạn đã thành công và bạn đã sẵn sàng để bật các thay đổi trong Nginx.

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

Khi các thay đổi và điều chỉnh đối với tường lửa của bạn hoàn tất, bạn có thể khởi động lại Nginx để áp dụng các thay đổi mới.

Trước tiên, hãy kiểm tra xem không có lỗi cú pháp nào trong các tệp. Bạn có thể thực hiện việc này bằng lệnh sudo nginx -t :

  • 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 for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
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 tạo ra cảnh báo vì chứng chỉ tự ký của bạn không thể sử dụng ghim SSL. Điều này được mong đợi và server 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 trùng với ví dụ , thì tệp cấu hình của bạn không có lỗi cú pháp. Nếu đúng như vậy, bạn có thể khởi động lại Nginx một cách an toàn để áp dụng các thay đổi:

  • sudo systemctl restart nginx

Bây giờ hệ thống đã được khởi động lại với các thay đổi mới, bạn có thể tiến hành thử nghiệm.

Bước 5 - Kiểm tra mã hóa

Bây giờ, bạn đã 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à tên miền hoặc IP của server vào thanh địa chỉ:

https://server_domain_or_IP

Tùy thuộc vào trình duyệt của bạn, bạn có thể sẽ nhận được cảnh báo vì chứng chỉ bạn đã tạo không được ký bởi một trong những tổ chức phát hành chứng chỉ tin cậy của trình duyệt của bạn,

Cảnh báo chứng chỉ tự ký của Nginx

Cảnh báo 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 chứng chỉ , 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 . 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:

Ghi đè tự ký của Nginx

Đến đây, bạn sẽ được đưa đến trang web. Trong ví dụ , thanh địa chỉ trình duyệt hiển thị một ổ khóa có dấu “x” trên đó, nghĩa là chứng chỉ không thể được xác thực. Nó vẫn đang mã hóa kết nối của bạn. Lưu ý biểu tượng này có thể khác nhau, tùy thuộc vào trình duyệt của bạn.

Nếu bạn đã cấu hình Nginx với hai server block, 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 tệp cấu hình server block:

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

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

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

Lưu và đóng tệp bằng cách nhấn CTRL + X rồi nhấn YENTER

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

Sau khi khởi động lại, các thay đổi sẽ được triển khai và chuyển hướng của bạn hiện là vĩnh viễn.

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 máy khách. Điều này sẽ cho phép bạn cung cấp các yêu cầu một cách an toàn và ngăn các bên bên ngoài đọc được lưu lượng truy cập của bạn. Ngoài ra, bạn có thể chọn sử dụng chứng chỉ SSL tự ký có thể lấy từ Let's Encrypt, một tổ chức phát hành chứng chỉ cài đặt chứng chỉ TLS / SSL miễn phí và bật HTTPS được mã hóa trên web server. Tìm hiểu thêm từ hướng dẫn về Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04 .


Tags:

Các tin liên quan