Về Let’s Encrypt, tạo mới, gia hạn Certificate miễn phí

2
5840

Trước đây, mình đã có bài viết về tạo, gia hạn Cert của Letsencrypt, tuy nhiên chưa đầy đủ lắm. Vì vậy mình viết lại bài này để giải thích rõ hơn, cũng như gia hạn, tạo mới không cần stop web service.

1. Letsencrypt là gì?

Let’s Encrypt là một chương trình được tài trợ bởi nhiều đơn vị, quỹ phát triển lớn trên thế giới (bao gồm cả Google, Akamai, Facebook…) Mục đích cuả nó là giúp Internet an toàn hơn bằng cách cung cấp miễn phí các certificate cho website, ứng dụng…

Đặc điểm của Certificate Let’s Encrypt:

– Miễn phí, không giới hạn số lượng đăng ký trên một tài khoản.

– Hết hạn sau 3 tháng, gia hạn miễn phí

2. Lý giải thêm một số nguyên tắc hoạt động, cách tạo và gia hạn

Lưu ý, để tạo và gia hạn cert của Lets, người quản trị phải chứng minh quyền sở hữu tên miền bằng cách trỏ tên miền về đúng IP máy chủ muốn tạo và gia hạn. Đương nhiên, nếu bạn không phải là chủ tên miền thì làm sao nó cho phép.

Lets có nhiều cách để tạo và gia hạn cert. Nên thống nhất sử dụng 1 cách để việc gia hạn dễ dàng, chuẩn xác, dễ đặt lịch tự động người quản trị không phải quan tâm nhiều khi quản lý một số lượng lớn website.

– Chế độ standalone:

Đây là chế độ độc lập, bạn không cần cài một web server lên trước (như nginx, apache), chỉ cần trỏ tên miền về server, cài đặt lets là tạo được cert. Để tạo cert, Lets sẽ tạo ra 1 máy chủ web ảo bằng Python, chiếm cổng 443 của server. Vì vậy, cần phải stop mọi dịch vụ nào đang chiếm cổng 443 thì mới tạo và gia hạn được cert. Đó là lý do vì sao bạn thường được hướng dẫn stop nginx, apache khi tạo và gia hạn.

Chế độ này thường được hướng dẫn trên mạng nhưng nhược điểm của nó là phải stop web service đang chạy kể cả khi gia hạn. Không phải lúc nào bạn cũng được phép downtime như vậy trên môi trường production.

– Chế độ webroot

Đây là chế độ mà bắt buộc phải có sẵn một web service, trỏ website trước, vì vậy nó không cần tạo ra 1 máy chủ web ảo chiếm port 443 như chế độ standalone, vì vậy không cần stop web service khi tạo và gia hạn. Việc tạo và gia hạn sẽ được chứng thực thông qua 1 đường link có dạng tenmien.com/.well-known. Đơn giản bạn có thể hiểu nếu trên web của bạn có đường dẫn này thì máy chủ Letsencrypt sẽ xác thực cho bạn và cho phép tạo, gia hạn…

– Chế độ Manual

Tương tự chế độ Webroot nhưng nó sẽ hỏi các câu hỏi và điền bằng tay >> không chơi tự động được. Nên mình không quan tâm phần này.

– Chế độ theo web service: nginx, haproxy…

Tùy theo web service bạn sử dụng là gì, sẽ có câu lệnh cụ thể. Cách này cũng không cần stop web service đang chạy.

3. Tạo certificate mới theo chế độ web service. Ví dụ ở đây là nginx.

Truy cập trang web: https://certbot.eff.org/

Trong danh sách chọn web service của bạn và OS đang dùng để có câu lệnh cài đặt.

VD trên Centos 7:

sudo yum install certbot python2-certbot-nginx

>> Cài đặt certbot và plugin certbot-nginx

Ngay lập tức có thể tạo cert luôn mà không cần config gì thêm ở nginx:

sudo certbot --nginx certonly -d yourdomain.com

Nếu bạn build nginx bằng source và để file nginx.conf ở vị trí khác (chẳng hạn ở /etc/nginx/conf/nginx.conf) thì cần gõ thêm đường dẫn đến thư mục chứa file config nginx:

sudo certbot --nginx certonly --nginx-server /etc/nginx/conf -d yourdomain.com

Như vậy là đã thành công. Cách này rất đơn giản.

Tương tự với các web service khác, OS khác bạn chỉ cần chọn trên website phía trên, nó sẽ cho ra câu lệnh cài đặt certbot + plugin web service tương ứng.

4. Tạo certificate mới theo chế độ webroot (cách cũ)

Bước 1: Cài đặt Letsencrypt

Cài đặt giống cách ở trên, vào trang web https://certbot.eff.org/

Centos 7:

sudo yum install certbot

Centos 6:

wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto

Bước 2: Tạo vhost tạm (mình làm trên nginx)

Vì sao lại tạo vhost tạm? Mình cho là làm thế nhanh hơn là chỉnh sửa vhost thật trước. Vhost tạm này chỉ dùng để đăng ký lets theo dạng webroot, xong là xóa nó đi thôi.

server {
     listen	  80;
     server_name  hoctapit.com;

     location /.well-known/ {
              log_not_found off;
              root /usr/local/nginx/html;
     }
}

Lưu ý: location /.well-known/

Đây là phần bắt buộc, mục đích của nó để lets xác thực trang web của bạn khi nó tiến hành tạo hoặc gia hạn trong khi website của bạn vẫn đang chạy (không stop nginx). Lưu ý, thư mục này phải tồn tại thật, và khi gia hạn vẫn phải giữ thư mục này, vì vậy nên dùng 1 thư mục cố định cho mọi tên miền trên server. Ở đây dùng luôn thư mục mặc định của nginx.

Reload nginx để nhận file cấu hình mới này (bước này bắt buộc, nếu không reload thì sẽ ko thể tạo cert được:

sudo service nginx reload

Bước 3: Tạo cert mới

cd vào thư mục /opt/letsencrypt đã clone cái source ở bên trên.

sudo certbot certonly --webroot -w /usr/local/nginx/html -d tenmien.com

Lưu ý thư mục -w giống với thư mục trong location .well-know ở trên.

Bây giờ xóa file vhost vừa tạo ở trên đi, hoặc dùng nó làm vhost thật luôn cũng được.

server {
        listen 80;

        server_name hoctapit.com www.hoctapit.com;
        #redirect http to https
        return 301 https://$server_name$request_uri; 
 #Đoạn này để sau gia hạn certificate tự động 
       location /.well-known/ { 
       log_not_found off; 
       root /usr/local/nginx/html;
       }
}

server {
        listen 443;
        access_log /var/log/nginx/hoctapit.access.log;
        error_log /var/log/nginx/hoctapit./error.log;

        root /path/to/website/public_html;
        index index.php index.html index.htm;
        server_name hoctapit.com;

        ssl on;
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_certificate /etc/letsencrypt/live/hoctapit.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/hoctapit.com/privkey.pem;
        ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
         
        #Đoạn này để sau gia hạn certificate tự động  
        location /.well-known/ {
              log_not_found off;
              root /usr/local/nginx/html;
        }

     location / {
                try_files $uri $uri/ /index.php?$args;
        }
     location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_connect_timeout 1000;
                fastcgi_send_timeout 1000;
                fastcgi_read_timeout 1000;
                fastcgi_buffer_size 256k;
                fastcgi_buffers 4 256k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
}

Cái config này mình lấy mẫu của mình thôi, tùy trường hợp có thể khác.

Restart nginx để apply config mới.

5. Gia hạn certificate

Nếu tất cả tên miền đều được tạo theo cách như trên, thì chỉ cần gõ lệnh:

sudo certbot renew

Đặt cronjob để việc gia hạn này là tự động:

sudo crontab -e

Thêm vào dòng sau và lưu lại:

23 1 */10 * * certbot renew --post-hook "service nginx reload" >> /var/log/certbot-renew.log

Dòng này sẽ chạy lệnh gia hạn vào lúc 01:23 mỗi 10 ngày/lần, reload nginx và xuất ra file log để tiện theo dõi.

5. Một số thủ thuật

a. Test thử việc tạo, gia hạn:

Nếu bạn gõ lệnh với Letsencrypt sai, lỗi quá nhiều, nó sẽ khóa không cho bạn thao tác trong khoảng 1 tiếng. Vì vậy để thử trước khi thực hiện lệnh (tạo, gia hạn…) thật bạn có thể thêm tùy chọn –dry-run ở cuối câu lệnh. Chẳng hạn:

sudo ./letsencrypt-auto renew --dry-run

Lưu ý thêm tùy chọn này thì chỉ là test thôi, làm thật nhớ bỏ nó đi.

b. Gia hạn cho 1 tên miền riêng rẽ

Ví dụ bạn có 10 tên miền trên website, nhưng chỉ muốn gia hạn cho 1 tên miền thôi:

sudo ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/local/nginx/html --domain=tenmien.com

Lưu ý cái webroot giống của bạn nhé.

c. Xóa 1 cert của tên miền để tạo lại

 (chẳng hạn do trước đó tạo theo standalone, muốn chuyển qua webroot) chỉ cần xóa hết các file,thư mục sau:

+ /etc/letsencrypt/renewal/tenmien.conf (file)

+ /etc/letsencrypt/archived/tenmien (directory)

+ /etc/letsencrypt/live/tenmien (directory)

d. Tạo 1 certificate dùng cho nhiều domain.

Nếu bạn không muốn tạo mỗi domain 1 certificate thì có thể tạo 1 lúc nhiều domain luôn bằng cách sử dụng -d domain1.com -d domain2.com …. khi tạo certificate.

Letsencrypt hỗ trợ tới 100 tên miền cho 1 certificate được tạo. Nghĩa là bây giờ bạn sẽ cấu hình tất cả domain trong list trên sử dụng 1 cert trong /etc/letsencrypt/live/domain1.com. Khi gia hạn, tất cả đều được gia hạn cùng lúc.

BÀI TIẾP:

Tự động gia hạn Lets Encrypt Certificate trên HA Proxy không cần stop dịch vụ

2 COMMENTS

LEAVE A REPLY

Please enter your comment!
Please enter your name here