Vietnam

    Nodejs.vn

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Tags
    • Groups
    • Search

    Tự tạo và cài đặt SSL miễn phí cho Nginx, Apache với Letsencrypt!

    Node.JS
    3
    15
    13744
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • mike
      mike last edited by mike

      Nhân dịp nghĩ lễ 1/5. Nhiều bạn cũng thấy Nodejs.vn được comeback và tân trang với SSL (https://nodejs.vn) và SSL này hoàn toàn Free, nay Tùng sẽ share lại cho các bạn Tips cài đặt nó và sử dụng nó. Mình thì cài đặt bằng documents letsenscrypt, nhưng search thấy có 1 số blogger Dev Việt chia sẻ về Letsencrypt nên copyrighter cho nhanh.


      Let’s Encrypt là một nhà cung cấp SSL ( Certificate Authority) mới cung cấp cho bạn chứng chỉ số SSL hoàn toàn miễn phí và đặc biệt không giới hạn, bạn sử dụng cho bao nhiêu domain cũng được, cả SSL Wildcard cũng được luôn. Đây là một tổ chức được thành lập bởi các ông lớn như Facebook, Akamai, Mozilla, Cisco,… với mục đích làm cho Internet trở nên an toàn hơn. Bạn có đọc chi tiết về dự án tại đây

      Tips: SSL là một tiêu chí giúp website bạn có thứ hạng cao hơn trên Google 😃

      Hôm nay mình sẽ hướng dẫn bạn cách để lấy chứng chỉ SSL từ Let’s Encrypt và cài đặt lên server của bạn. Hiện Let’s Encrypt vẫn đang trong giai đoạn beta và chỉ trong vòng chưa đầy một tuần ra mắt đã có tới 119.000 chứng chỉ được cấp. Và SSL ở đây là loại Domain Validation tức là sau khi cài bạn sẽ có thanh ổ khoá màu xanh trên trình duyệt như nodejs.vn.

      Mình sẽ hướng dẫn trên 2 hệ điều hành phổ biến đó là Debian/Ubuntu và CentOS sử dụng NGINX hoặc Apache. Do đó, bạn cần có một máy chủ chạy 2 hệ điều hành trên và đương nhiên cần một tên miền trỏ DNS về IP của server để có thể sử dụng SSL.

      Bước 1. Cài đặt Let’s Encrypt Client

      Bước đầu tiên để có thể lấy được SSL miễn phí từ Let’s Encrypt đó là cài đặt phần mềm letsencrypt trên máy chủ của bạn. Hiện tại, Let’s Encrypt chỉ có thể được cài đặt thông qua Repository từ Github nhưng trong tương lai có thể Let’s Encrypt sẽ được cài đặt thông qua Package Manager.

      Cài đặt Git

      Cập nhật các gói phần mềm của hệ thống:

      Debian/Ubuntu :

      sudo apt-get update 
      sudo apt-get -y install git
      

      CentOS

      yum -y update
      yum -y install git
      

      Sao chép mã nguồn Let’s Encrypt vào máy chủ của bạn, chúng ta sẽ lưu trong thư mục opt

      git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

      Bước 2. Lấy chứng chỉ SSL miễn phí từ Let’s Encrypt

      Dành cho bạn đang dùng NGINX:

      Có nhiều cách để lấy một chứng chỉ tuy nhiên chúng ta sẽ lấy nó bằng plugin Standalone.

      Đảm bảo cổng 80 đang mở và không sử dụng

      Plugin Standalone cung cấp cho bạn một công cụ để lấy một chứng chỉ SSL từ Let’s Encrypt. Nó chạy như một webserver nhỏ thông qua port 80 để Let’s Encrypt CA có thể kết nối và xác mình server của bạn. Nó sẽ chạy như một webserver bình thường do đó nếu port 80 cần được mở và không sử dụng. Nếu bạn đã cài NGINX thì cần tắt nó đi tạm thời để giải phóng cổng 80. Chạy lệnh sau để tắt NGINX:

      Tắt NGINX (Debian/Ubuntu/CentOS)
      service nginx stop

      Bây giờ bạn đã có thể sử dụng plugin Standalone được rồi.

      Nếu bạn đang dùng CentOS thì cần chạy các lệnh sau mới có thể dùng được plugin Standalone, Debian/Ubuntu thì bỏ qua nhé lên thẳng bước 3.

      Đầu tiên bạn cần kiểm tra phiên bản Python trên VPS CentOS: python –version
      Nếu kết quả là phiên bản lớn hơn hoặc bằng 2.7 thì bạn có thể bỏ qua còn nếu nhỏ hơn 2.7 thì chạy các lệnh sau để cập nhật Python lên phiên bản 2.7, chạy từng cái một nhé, hơi lâu khoảng 5”.

      yum -y update
      yum groupinstall "Development tools"
      yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
      cd /opt
      wget --no-check-certificate https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
      tar xf Python-2.7.6.tar.xz 
      cd Python-2.7.6
      ./configure --prefix=/usr/local
      make && sudo make altinstall
      

      Sau đó kiểm tra xem đã là phiên bản 2.7 chưa bằng lệnh /usr/local/bin/python2.7 –version . Nếu đã lên 2.7 thì đi tiếp bước 3.

      Bước 3. Chạy Let’s Encrypt

      Trước khi sử dụng Let’s Encrypt, bạn cần duyệt tới thư mục chứa Let’s Encrypt Client mà đã Clone lúc trước từ Github.
      cd /opt/letsencrypt

      Bây giờ bạn có thể sử dụng plugin Standalone bằng cách chạy lệnh:
      ./letsencrypt-auto certonly --standalone

      Có thể nó sẽ hỏi bạn nhập mật khẩu của user mà bạn đang đăng nhập vào SSH. Nếu hỏi thì nhập vào.

      Chờ một lúc cho Let’s Encrypt khởi chạy, bạn sẽ được hỏi một số thông tin, nhập chính xác nhé:

      Nhập địa chỉ email để phòng khi mất private key còn có chỗ mà lấy lại:
      alt text

      Sau đó phải chấp nhận điều khoản của Let’s Encrypt. Chọn Agree
      Tiếp tục, bạn cần nhập tên miền mà bạn muốn dùng SSL. Lưu ý nếu bạn muốn dùng nhiều SSL ví dụ cho cả nodejs.vn và www.nodejs.vn thì phải nhập cả hai vào, cách nhau bởi dấu cách.
      alt text

      Nếu thành công, bạn sẽ nhận được thông báo như thế này:

      IMPORTANT NOTES:
      
      – If you lose your account credentials, you can recover through e-mails sent to [email protected]
      
      – Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2016-03-15. To obtain a new version of the certificate in the future, simply run Let’s Encrypt again.
      
      – Your account credentials have been saved in your Let’s Encrypt configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let’s Encrypt so making regular backups of this folder is ideal.
      
      – If like Let’s Encrypt, please consider supporting our work by: Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
      

      Bạn nhớ chú ý dòng chữ màu đỏ ở trên, đó là thư mục chưa file SSL của bạn và ngày hết hạn chứng chỉ.

      File SSL gồm có:

      cert.pem: Chứng chỉ SSL cho tên miền của bạn
      chain.pem: Chứng chỉ của Let’s Encrypt
      fullchain.pem: cert.pem và chain.pem được gộp lại thành một
      privkey.pem: Private key của chứng chỉ
      Lưu ý là thư mục lưu các file SSL của bạn tại đường dẫn /etc/letencrypt/live/domain.com/

      Bước 4. Cài đặt SSL lên máy chủ NGINX

      Sau khi đã có file chứng chỉ rồi, việc của bạn bây giờ chỉ là cài đặt nó lên máy chủ của mình thôi. Mình sẽ hướng dẫn cài đặt trên NGINX.

      Mở tập tin cấu hình tên miền trên NGINX của bạn ra hoặc nếu bạn đang cài website mới thì tạo một cái. Mặc định nó được đặt trong thư mục /etc/nginx/conf.d. Hoặc nếu bạn vẫn chưa cài NGINX thì cài bằng lệnh sau:

      Debian/Ubuntu: sudo apt-get install nginx
      CentOS:

      yum install epel-release
      yum install nginx
      

      Sau khi mở file cấu hình domain lên, hoặc tạo mới bằng lệnh sau:
      nano /etc/nginx/conf.d/default

      Một file cấu hình SSL cho NGINX chuẩn sẽ có dạng như sau:

      server { 
         listen 80; 
         server_name example.com; 
         location / { 
           return 301 https://example.com$request_uri; 
         } 
      } 
      server { 
         listen 443 ssl;
         server_name example.com; 
         ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
         ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
         ssl_prefer_server_ciphers on; 
         ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; 
         root /var/www/example.com/code; 
         index index.php index.html index.htm; 
         location / {
         try_file $uri $uri/ /index.php; 
      } 
         location ~ \.php$ { 
         try_files $uri =404; 
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
         include fastcgi_params; 
         fastcgi_pass unix:/var/run/php5-fpm.sock; 
         } 
      }
      

      Đây là file cấu hình SSL NGINX cơ bản, bạn cứ copy nguyên vào và sửa lại các thông tin của bạn như tên miền, đường dẫn tới file SSL, đường dẫn tới thư mục chứa code.

      Restart NGINX: sudo service nginx restart

      Truy cập vào website của bạn https://domain.com và bạn sẽ thấy cái khoá màu xanh trên trình duyệt, nhìn rất chuyên nghiệp :D. Mình đã cài thử trên subdomain, bạn có thể vào link sau để test SSL của Let’s Encrypt: https://nodejs.vn

      Dành cho bạn đang dùng Apache

      Apache đơn giản hơn, chỉ chạy một lệnh là xong (Nếu bạn dùng CentOS thì vẫn phải update Python lên 2.7 mà mình đã hướng dẫn ở phần chữ màu hồng ở trên nhé, nhớ thay crazytut.com bằng domain của bạn)

      cd /opt/letsencrypt
       
      ./letsencrypt-auto --apache -d nodejs.vn -d www.nodejs.vn
      

      Sau đó nó sẽ tự cấu hình domain cho bạn luôn và nó sẽ hỏi một vài thông tin như email khôi phục, và quan trọng là nó sẽ hỏi bạn muốn dùng cả http và https hay chỉ dùng https thôi để nó cấu hình redirect, bạn chú ý kỹ nhé.

      Cấu hình tự gia hạn SSL

      Dành cho NGINX

      Các chứng chỉ do Let’s Encrypt cung cấp chỉ có giá trị trong 90 ngày. Sau thời gian này bạn sẽ phải chạy lại lệnh ở bước 3 ở trên để lấy về chứng chỉ mới nếu không khi truy cập vào website của bạn sẽ có một cảnh báo chứng chỉ hết hạn. Nhưng tự gia hạn thế hơi nản nên mình sẽ hướng dẫn bạn cấu hình để Let’s Encrypt tự gia hạn SSL.

      Giải pháp thích hợp nhất đó là tạo cron job để khi hết hạn thì sẽ tự động chạy lệnh gia hạn SSL nhưng có một vấn đề là chúng ta cần sử dụng plugin khác để tạo SSL chứ không thể dùng plugin Standalone ở trên vì nó yêu cầu phải tắt web server đi, như thế thì web sẽ không truy cập được. Có một plugin khác tên là Webroot có thể tạo SSL mà không cần tạm ngừng webserver.

      Để sử dụng Webroot plugin, bạn phải chỉ định thư mục lưu mã nguồn của Website bạn, bạn hãy tìm trong file cấu hình domain NGINX mà mã nguồn web lưu ở thư mục nào thì chắc chắn bạn phải biết rồi đúng không còn để chắc chắn thì chạy lệnh sau, giả sử là mình đang tìm trong file cấu hình mặc định của NGINX còn bạn phải thay cái default thành tên file cấu hình NGINX của website bạn, nó nằm trong thư mục:
      /etc/nginx/conf.d

      grep "^\s*root" /etc/nginx/conf.d/default

      Bây giờ bạn đã biết được thư mục lưu mã nguồn rồi, chúng ta có thể sử dụng plugin Webroot để tự động gia hạn chứng chỉ SSL bằng lệnh sau (Bạn cần thay giá trị –webroot-path bằng thư mục chứa mã nguồn của website và thay domain sau giá trị -d bằng domain của bạn):

      cd opt/letsencrypt
      ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com
      

      Một đã gia hạn thành cồn, bạn cần reload lại NGINX để có sử dụng chứng chỉ mới
      sudo service nginx reload

      2 câu lệnh bên trên là 2 câu lệnh dùng để gia hạn, bạn có thể tạo cron job để chạy 2 câu lệnh đó khi chứng chỉ gần hết hạn, tuy nhiên mình sẽ hướng dẫn 1 cách khác, cách này chỉ để cho bạn biết thôi.

      Tạo file cấu hình Let’s Encrypt: Đơn giản quá trình gia hạn bằng cách tạo file cấu hình cho Let’s Encrypt:
      sudo cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini

      Bây giờ hãy mở file ra và chỉnh sửa:
      sudo nano /usr/local/etc/le-renew-webroot.ini
      Đầu tiên, vô hiệu dòng server = https://acme-staging.api.letsencrypt.org/directory bằng cách thêm dấu # vào trước nó.

      Tiếp tục bỏ dấu # đằng trước các dòng email, domains, webroot-path và sửa lại thông tin của bạn:

      rsa-key-size = 4096
       
      email = [email protected]
       
      domains = nodejs.vn, www.nodejs.vn
       
      webroot-path = /usr/share/nginx/html
      

      Bây giờ thay vì phải nhập thông tin về email, đường dẫn đến thư mục code như câu lệnh bên trên thì sau khi ta tạo file cấu hình Let’s Encrypt, không cần nhập thông tin như thế nữa. Bây giờ câu lệnh gia hạn của chúng ta sẽ là, ngắn gọn hơn nhiều:

      cd opt/letsencrypt
      ./letsencrypt-auto certonly -a webroot --renew-by-default --config /usr/local/etc/le-renew-webroot.ini
      

      Nguồn: https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04

      Dịch bởi: https://www.crazytut.com/cai-dat-ssl-tren-nginx-apache-mien-phi-tu-lets-encrypt/

      1 Reply Last reply Reply Quote 3
      • J
        jokyspy last edited by

        Cảm ơn bạn @tung đã chia sẻ.

        Mình chỉ muốn dẫn link tham khảo phiên bản gốc của tut này tại: https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04

        Liên quan trong đó có bộ: https://www.digitalocean.com/community/tags/let-s-encrypt?type=tutorials có toàn bộ các tutorials liên quan đến Let's Encrypt.

        Bạn crazytut.com này dịch bài, copy ảnh nhà người ta mà không có dẫn nguồn gì cả @@

        mike 1 Reply Last reply Reply Quote 0
        • mike
          mike @jokyspy last edited by mike

          @jokyspy Okie thx bạn, để mình sửa và bổ sung.
          Chúng ta nên tôn trọng các tác giả viết và cả người dịch.

          1 Reply Last reply Reply Quote 0
          • W
            way.code last edited by

            Cái này khá hay , tuy nhiên ở 1 số trình duyệt nó vẫn báo site unsecure nhé anh

            Tuấn Mạnh 1 Reply Last reply Reply Quote 1
            • Tuấn Mạnh
              Tuấn Mạnh @way.code last edited by

              This post is deleted!
              1 Reply Last reply Reply Quote 0
              • Nobj Nguyễn
                Nobj Nguyễn last edited by

                Với Apache sao ko thất có đoạn tự động gia hạn ?

                L 1 Reply Last reply Reply Quote 0
                • L
                  loind @Nobj Nguyễn last edited by loind

                  @Nobj-Nguyễn Giống nhau cả thôi bạn ạ. Mình thường dùng cronjob để chạy tự động (sau 2h sáng mỗi tuần)

                  Với nginx:

                  0 2 * * 1 service nginx stop && /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log && service nginx start
                  

                  Với Apache

                  0 2 * * 1 service httpd stop && /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log && service httpd start
                  
                  K 1 Reply Last reply Reply Quote 0
                  • T
                    Trầnn Anh last edited by

                    Mình dùng SSL sẵn của Cloudflare nhưng nhiều lúc vẫn bị mixed content do host không có sẵn SSL, giao thức ở dạng http. Không biết có cách nào khắc phục mà không cần dùng tới tut này không

                    YoloTEAM

                    1 Reply Last reply Reply Quote 0
                    • K
                      kazeuraki @loind last edited by

                      @loind Cho mình hỏi bạn cài đặt bằng plugin standalone hay webroot?
                      Vì mình dùng standalone cấu hình crontab như trên nó không tự gia hạn
                      Mình nghi là k có stop nginx nên bị thế

                      L 1 Reply Last reply Reply Quote 0
                      • L
                        loind @kazeuraki last edited by

                        @kazeuraki đúng rồi bạn ạ, phải stop nginx hoặc apache mới được 😃

                        1 Reply Last reply Reply Quote 0
                        • B
                          bom bom last edited by

                          Cảm ơn vì bài viết rất hữu ích, rõ ràng và hiệu quả.

                          1 Reply Last reply Reply Quote 0
                          • Bùi Đức Cường
                            Bùi Đức Cường last edited by

                            Ad cho em hỏi, hiện em đã cài thành công chứng chỉ letsencrypt trên Apache theo Tut của ad nhưng mới chỉ làm cho được 1 domain mà thôi, ở đây em muốn ad thêm website và tạo chứng chỉ cho domain thứ 2 thì không được, ad có thể hướng dẫn thêm cho mình không.

                            tuanquynet 1 Reply Last reply Reply Quote 0
                            • S
                              softwareout last edited by

                              said in Tự tạo và cài đặt SSL miễn phí cho Nginx, Apache với Letsencrypt!:

                              Mình có 1 vấn đề khi cài đặt chứng chỉ cho tên miền có www của mình, mình sử dụng máy chủ Ubuntu 14.4 và dùng Apache 2. làm theo hướng dẫn tại https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04 thì đến bước thiết lập chứng chỉ bằng lệnh :" sudo certbot --apache -d nexlesoft.com -d www.nexlesoft.com " thì báo lỗi không thể xác minh tên miền. Bạn cho mình hỏi là trường hợp tên miền có www thì mình cần làm gì khác so với không có www không ?
                              Mình cảm ơn.

                              1 Reply Last reply Reply Quote 0
                              • tuanquynet
                                tuanquynet last edited by

                                @softwareout : Bạn ping domain www.nexlesoft.com xem có trả về đúng ip của của server không? Nếu không ping được hoặc ip sai bạn cần config lại DNS trỏ www.nexlesoft.com về ip của server.

                                papa elf

                                1 Reply Last reply Reply Quote 0
                                • tuanquynet
                                  tuanquynet @Bùi Đức Cường last edited by

                                  @Bùi-Đức-Cường : Lưu ý khi đăng ký nhiều subdomain, bạn cần phải config DNS cho tất cả các subdomain trỏ đến ip của server.

                                  papa elf

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post
                                  $(document).ready(function () { app.coldLoad(); }); }