Bạn lưu ý, bạn đã nghe tới chứng chỉ ssl được bán rất nhiều trên mạng? Vậy mà tôi lại viết 1 bài về chứng chỉ tự ký, thì các bạn phải lưu ý là tự ký thì sẽ không được client(các trình duyệt) công nhận, vì thế sẽ đưa ra cảnh báo người dùng trước khi truy cập với side của bạn. Còn khi mua thì thì trình duyệt sẽ hiểu là chứng chỉ đó, server đó an toàn và cho phép truy cập ngay.

ok đầu tiên thì các bạn để ý tiêu đề là nginx. Tức là nếu các bạn sử dụng một apache hay web server khác thì vui lòng chỉ tham khảo thôi, hãy tìm một hướng dẫn khác cho web server của bạn.

  1. Tạo 1 chứng chỉ tự ký.

    • Đăng nhập máy chủ của bạn, sử dụng ssh. Sau đó sử dụng mẫu lệnh sau:

      sudo openssl req -x509 -nodes -days 365 -newkey rsa: 2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
      
      • Nhớ tạo thư mục trước đó nếu không có các thư mục /etc/ssl/private/ hay /etc/ssl/certs/.

        Tiếp đó, bạn cần nhập các thông tin cần thiết để nó tạo:

        writing new private key to '/etc/ssl/private/nginx-selfsigned.key'
        -----
        You are about to be asked to enter information that will be incorporated
        into your certificate request.
        What you are about to enter is what is called a Distinguished Name or a DN.
        There are quite a few fields but you can leave some blank
        For some fields there will be a default value,
        If you enter '.', the field will be left blank.
        -----
        Country Name (2 letter code) [XX]:your_input?
        State or Province Name (full name) []:your_input?
        Locality Name (eg, city) [Default City]:your_input?
        Organization Name (eg, company) [Default Company Ltd]:your_input?
        Organizational Unit Name (eg, section) []:your_input?
        Common Name (eg, your name or your server's hostname) []:your_input?(153.120.93.259)
        Email Address []:your_input?
        

        Thay your_input? bằng thông tin của bạn, chú ý một chút Common Name là địa chỉ của server đó.

      • Khi lệnh hoàn tất, các tệp cần thiết sẽ được thêm vào thư mục / etc / ssl và sẵn sàng sử dụng.

  2. bước 2 là mình sẽ đi config nginx. Chúng ta sẽ config nginx để sử dụng ssl.

    1. Hãy tạo một tệp mới. sudo cat > /etc/nginx/snippets/self-signed.conf

      Viết vào nội dung là đường dẫn 2 file mới tạo bên trên:

      ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
      ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
      
    2. Tiếp theo, tạo đoạn mã cấu hình thứ hai trỏ đến chứng chỉ và khóa SSL mà bạn và tôi mới tạo như sau:

      dùng: sudo cat > /etc/nginx/snippets/ssl-params.conf

      ssl_protocols TLSv1.2;
      ssl_prefer_server_ciphers on;
      ssl_dhparam /etc/ssl/certs/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;
      add_header X-Frame-Options DENY;
      add_header X-Content-Type-Options nosniff;
      add_header X-XSS-Protection "1; mode=block";
      

      Bởi vì ae mình đang sử dụng chứng chỉ tự ký,mình sẽ vô hiệu hóa tính năng ghim SSL ssl_stapling (một phương pháp để xác định nhanh chóng và an toàn xem chứng chỉ SSL có hợp lệ hay không). Nếu bạn không sử dụng chứng chỉ tự ký, hãy xóa ký hiệu #.

    3. Các bạn ơi, các bạn thấy file trên mình khai báo ssl_dhparam /etc/ssl/certs/dhparam.pem; chứ. Hãy tạo nó nào:

      sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
      

      Đoạn này đợi lâu vl, nó tạo cái gì cứ dấu . lại dấu + âý.

    4. Bước tiếp theo là định cấu hình NGINX để biết rằng chúng ta sẽ sử dụng SSL.

      Mở cái file mà bạn config nginx lên nào:

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

      Ghi chú là cái thư mục sites-available và file example.com bạn sửa lại thành đường dẫn chính xác trên server bạn nhé.

      Và định cấu hình ssl nào:

      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;
      
      }
      

      Lưu ý là trên chỉ là file mẫu thôi nhé, quan trọng là thông số này:

       		listen 443 ssl;
          listen [::]:443 ssl;
          include snippets/self-signed.conf;
          include snippets/ssl-params.conf;
      

      Còn lại phụ thuộc vào càii đặt của server bạn nhé.

    5. Thế nhi người dùng truy cập http không thôi thì sao nhỉ?

      Dễ thôi, chúng ta sẽ chuyển hết request sang https nhé.

      Vẫn ở file trên, bạn viết thêm khối server này nha.

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

      Bạn chú ý return 302 https://$server_name$request_uri; dòng này là chuyển hướng url tới https nha.

    6. Khởi động lại nginx nào:

      sudo systemctl restart nginx
      
    7. Vào thử server bạn nhé.

      Như mình đã lưu ý lúc đầu, trình duyệt sẽ cảnh báo bảo mật khi bạn vào lần đầu tiên. Do chứng chỉ chúng ta tự ký. Hãy bỏ qua thông báo và vào side của bạn nhé.

    Ok done. Chúc mừng bạn đã tạo https thành công nha!