Hướng dẫn cài đặt chứng chỉ Let’s Encrypt SSL cho web trên VPS dùng HocVPS Script

Bạn đang chạy web trên VPS sử dụng HocVPS Script để tạo server? Giờ bạn muốn cài đặt SSL cho web chạy trên VPS đó? Vậy hãy làm theo hướng dẫn này để cài đặt chứng chỉ SSL của Let’s Encrypt hoàn toàn miễn phí và được tự động gia hạn SSL.

Let’s Encrypt là nhà cung cấp chứng chỉ số SSL (Certificate Authority) hoàn toàn miễn phí, đã và đang được sử dụng trên rất nhiều website. Hiện tại hầu hết các shared hosting như Hawkhost, AZDIGI, Stablehost,…đều đã tích hợp sẵn Let’s Encrypt trong Cpanel. Và trên blog mình cũng có bài hướng dẫn cài đặt SSL trên Cpanel bạn có thể tham khảo.

Trong bài viết này, Nguyễn Hùng sẽ hướng dẫn bạn cách cài đặt chứng chỉ Let’s Encrypt SSL cho web trên VPS dùng HocVPS Script giúp bạn có thể tự cài đặt SSL cho tất cả các web đang chạy trên server. Nào! Cùng bắt đầu làm theo các bước bên dưới.

Cài đặt chứng chỉ Let’s Encrypt SSL cho web đầu tiên trên VPS

Vì là cài cho web đầu tiên nên bạn phải clone mã nguồn của Let’s Encrypt về thư mục /opt/letsencrypt bằng cách chạy 2 lệnh sau. (CentOS 6 hay 7 đều thực hiện giống nhau).

yum -y install git
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Tiếp theo, để cài đặt Let’s Encrypt mình sẽ sử dụng option --standalone. Bạn chạy lần lượt 3 lệnh sau:

service nginx stop
cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone

Bạn chờ cho Let’s Encrypt cài đặt đầy đủ các công cụ cần thiết. Sau đó nó yêu cầu bạn nhập vào email và ấn Enter để tiếp tục.

huong-dan-cai-dat-lets-encrypt-ssl-cho-vps-1

Nhập vào a rồi ấn Enter để chấp nhập các điều khoản.

Tiếp theo nó sẽ hỏi bạn có đồng ý chia sẻ địa chỉ email với đối tác sáng lập Let’s Encrypt để họ gửi cho bạn những thông tin gì đó. Bạn có thể chọn y (Yes) hoặc n (No). Ở đây mình chọn y và ấn Enter.

Sau đó bạn nhập vào tên miền cần cài đặt SSL. Bạn nhập cả 2 phiên bản wwwnon-www của domain đó vào rồi ấn Enter.

huong-dan-cai-dat-lets-encrypt-ssl-cho-vps-2

Nếu không có lỗi gì xảy ra bạn sẽ nhận được thông báo như sau:

huong-dan-cai-dat-lets-encrypt-ssl-cho-vps-3

Lưu ý các thông tin tô sáng:

  • /etc/letsencrypt/live/nguyenhungplus.com/: là đường dẫn thư mục chứa các file chứng chỉ.
  • 2018-07-03: ngày hết hạn chứng chỉ (90 ngày từ ngày cài đặt).

Đó là các bước cài cho web đầu tiên trên VPS, từ các web sau để cài đặt SSL bạn chỉ cần làm như sau.

Cài đặt chứng chỉ Let’s Encrypt SSL cho web khác trên VPS

Đối với các web khác trên VPS nếu bạn muốn cài SSL thì chỉ cần chạy 3 lệnh bên dưới rồi nhập domain vào tương tự như ở trên.

service nginx stop
cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone

Cấu hình SSL trong file Nginx

Sau khi cài đặt các file chứng chỉ cho domain xong, việc tiếp theo là chỉnh sửa lại file cấu hình Nginx. Ví dụ tên miền mình vừa cài đặt SSL là nguyenhungplus.com thì file cấu hình nginx là /etc/nginx/conf.d/nguyenhungplus.com.conf

Khi làm trên VPS của bạn thì nhớ thay dòng nguyenhungplus.com thành tên miền của bạn nhé.

Tạo file DH parameters 2048 bit (tạo 1 lần duy nhất trên VPS)

mkdir /etc/nginx/ssl/
openssl dhparam 2048 -out /etc/nginx/ssl/dhparam.pem

Chỉnh sửa cấu hình nginx bằng Nano Editor

nano /etc/nginx/conf.d/nguyenhungplus.com.conf

Cấu hình SSL xử lý các request

Trong block server { ... } thứ 2 bạn sửa lại như sau:

+) Chuyển listen 80 default_server; thành listen 443 ssl default_server;

Lưu ý: Với domain không phải domain chính bạn chuyển listen 80 default_server; thành listen 443 ssl;

+) Sau dòng server_name nguyenhungplus.com; bạn thêm vào đoạn cấu hình SSL như sau:

# SSL
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
# Improve HTTPS performance with session resumption
 ssl_session_cache shared:SSL:50m;
 ssl_session_timeout 1d;
# DH parameters
 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 # Enable HSTS
 add_header Strict-Transport-Security "max-age=31536000" always;

Redirect toàn bộ www và non-www từ http sang https

Trong block server { ... } ở trên cùng, bạn sửa lại như sau:

+) Chuyển server_name www.nguyenhungplus.com; thành server_name nguyenhungplus.com www.nguyenhungplus.com;

+) Chuyển rewrite ^(.*) http://nguyenhungplus.com$1 permanent; thành rewrite ^(.*) https://nguyenhungplus.com$1 permanent;

Kết quả toàn bộ block server { ... } ở trên cùng sẽ như sau:

server {
 listen 80; 
 server_name nguyenhungplus.com www.nguyenhungplus.com;
 rewrite ^(.*) https://nguyenhungplus.com$1 permanent;
}

Block này có tác dụng giúp tự động chuyển http://nguyenhungplus.com và http://www.nguyenhungplus.com sang https://nguyenhungplus.com

Redirect toàn bộ www https sang https

Thêm mới block server { ... } ở trên cùng

server {
 listen 443 ssl;
 server_name www.nguyenhungplus.com;
# SSL
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
rewrite ^(.*) https://nguyenhungplus.com$1 permanent;
}

Block này có tác dụng giúp tự động chuyển https://www.nguyenhungplus.com sang https://nguyenhungplus.com

Cấu hình SSL với port quản lý HocVPS Script Admin

Đây là bước tùy chọn. Sau khi cài SSL cho domain chính bạn sẽ không truy cập được vào các công cụ HocVPS Script Admin thông qua domain ở địa chỉ (https://domain.com:2525) mà bạn chỉ có thể truy cập thông qua địa chỉ IP (https://dia-chi-ip:2525). Nếu bạn muốn dùng domain để truy cập các công cụ HocVPS Script Admin thì bạn thao tác theo các bước bên dưới.

Lưu ý: Bước này chỉ thiết lập đối với domain chính dùng để cài HocVPS Script – Domain phụ KHÔNG được thiết lập.

Giả sử khi cài HocVPS Script mình để port là 2525

Bạn hãy tìm block server { ... } cuối cùng có dòng listen 2525;

server {
 listen 2525 ssl;
 
 access_log off;
 log_not_found off;
 error_log /home/nguyenhungplus.com/logs/nginx_error.log;
 
 root /home/nguyenhungplus.com/private_html;
 index index.php index.html index.htm;
 server_name nguyenhungplus.com;

 error_page 497 https://$server_name:2525$request_uri;
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

 auth_basic "Restricted";
 auth_basic_user_file /home/nguyenhungplus.com/private_html/hocvps/.htpasswd;

Bây giờ thì bạn đã có thể truy cập HocVPS Script Admin bằng https://domain.com:2525

Cấu hình file Nginx cuối cùng của domain chính như sau:

server {
 listen 443 ssl;
 server_name www.nguyenhungplus.com;
# SSL
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 rewrite ^(.*) https://nguyenhungplus.com$1 permanent;
}
server {
 listen 80;
 
 server_name nguyenhungplus.com www.nguyenhungplus.com;
 rewrite ^(.*) https://nguyenhungplus.com$1 permanent;
}

server {
 listen 443 ssl default_server;
 
 # access_log off;
 access_log /home/nguyenhungplus.com/logs/access.log;
 # error_log off;
 error_log /home/nguyenhungplus.com/logs/error.log;
 
 root /home/nguyenhungplus.com/public_html;
 index index.php index.html index.htm;
 server_name nguyenhungplus.com;
 
 # SSL
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
# Improve HTTPS performance with session resumption
 ssl_session_cache shared:SSL:50m;
 ssl_session_timeout 1d;
# DH parameters
 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 # Enable HSTS
 add_header Strict-Transport-Security "max-age=31536000" always;
 
 location / {
 try_files $uri $uri/ /index.php?$args;
 }
 
 # Custom configuration
 include /home/nguyenhungplus.com/public_html/*.conf;
 
 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;
 }
 
 location /nginx_status {
 stub_status on;
 access_log off;
 allow 127.0.0.1;
 allow 45.77.94.237;
 deny all;
 }
 
 location /php_status {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include /etc/nginx/fastcgi_params;
 allow 127.0.0.1;
 allow 45.77.94.237;
 deny all;
 }
 
 # Disable .htaccess and other hidden files
 location ~ /\.(?!well-known).* {
 deny all;
 access_log off;
 log_not_found off;
 }
 
 location = /favicon.ico {
 log_not_found off;
 access_log off;
 }
 
 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }
 
 location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|eot|svg|ttf|woff)$ {
 gzip_static off;
 add_header Pragma public;
 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
 access_log off;
 expires 30d;
 break;
 }

location ~* \.(txt|js|css)$ {
 add_header Pragma public;
 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
 access_log off;
 expires 30d;
 break;
 }
}

server {
 listen 2525 ssl;
 
 access_log off;
 log_not_found off;
 error_log /home/nguyenhungplus.com/logs/nginx_error.log;
 
 root /home/nguyenhungplus.com/private_html;
 index index.php index.html index.htm;
 server_name nguyenhungplus.com;
 
 error_page 497 https://$server_name:2525$request_uri;
 ssl_certificate /etc/letsencrypt/live/nguyenhungplus.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/nguyenhungplus.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
 ssl_prefer_server_ciphers on; 
 ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
 auth_basic "Restricted";
 auth_basic_user_file /home/nguyenhungplus.com/private_html/hocvps/.htpasswd;
 
 location / {
 autoindex on;
 try_files $uri $uri/ /index.php;
 }
 
 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;
 }
 
 location ~ /\. {
 deny all;
 }
}

Kiểm tra lại cấu hình file Nginx

nginx -t

Nếu nhận được thông báo như sau là OK

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Khởi động lại Nginx

service nginx restart

Bây giờ bạn truy cập vào domain và xem thành quả

huong-dan-cai-dat-lets-encrypt-ssl-cho-vps-4

Lưu ý: Bạn phải chuyển toàn bộ link image, js, css từ http:// sang https:// thì tất cả các link trên web mới có biểu tượng màu xanh. Bạn có thể xem hướng dẫn cài đặt chuyển từ HTTP sang HTTPS cho web WordPress trong phần cuối bài viết này.

Cài đặt tự động gia hạn Let’s Encrypt SSL

Như ở trên mình cũng đã nói, chứng chỉ Let’s Encrypt SSL sẽ hết hạn sau 90 ngày kể từ ngày cài đặt. Vì vậy chúng ta sẽ sử dụng crontab để thiết lập tự động gia hạn chứng chỉ SSL bằng cách làm như sau:

Mở file cấu hình crontab

EDITOR=nano crontab -e

Dán đoạn code sau vào cửa sổ ZOC Terminal

15 1 * * * /opt/letsencrypt/letsencrypt-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start" >> /var/log/le-renew.log

Nhấn Ctrl+O -> Enter để Lưu và Ctrl+X để thoát. Bạn thấy thông báo như sau là OK.

crontab: installing new crontab

Trong đoạn code trên mình thiết lập crontab chạy lệnh gia hạn Let’s Encrypt SSL vào lúc 1h15 hàng ngày và kiểm tra xem nếu hết hạn thì sẽ tự động gia hạn.

Lời kết

Vậy là mình đã hướng dẫn bạn cài đặt chứng chỉ Let’s Encrypt SSL cho web chạy trên VPS sử dụng HocVPS Script tạo server. Với hướng dẫn này bạn sẽ được sử dụng SSL miễn phí từ Let’s Encrypt trọn đời. Còn chờ đợi gì nữa mà không cài đặt SSL cho web của bạn ngay đi. Chúc bạn thành công!

Hướng dẫn cài đặt chứng chỉ Let’s Encrypt SSL cho web trên VPS dùng HocVPS Script
5 1 vote

Để lại ý kiến của bạn

Hello! Tớ là Nguyễn Hùng, blog này tớ xây dựng nhằm mục đích chia sẻ miễn phí các kiến thức máy tính và làm web Wordpress, SEO, SEM, MMO,... mà tớ biết cho tất cả mọi người. Cảm ơn bạn đã ghé qua blog, nếu thấy bài viết hay, hãy chia sẻ để ủng hộ tinh thần cho tớ nha. → Xem tiếp"
Đăng ký nhận bản tin!

Đăng ký nhận bản tin!

Đăng ký email để nhận bài viết mới và các khuyến mãi, quà tặng trên blog Nguyễn Hùng.

Đăng ký thành công!