Cài đặt SSL free, sử dụng Letsenscrypt

Môi trường

  • CentOS 7

Bước 1: Cài đặt các gói cần thiết#

1
2
3
4
5
6
7
8
sudo yum install -y epel-release
sudo yum install -y certbot python2-certbot-apache php-fpm mod_ssl nginx

# SELinux management tools
yum install -y policycoreutils-python-utils

# Cho phép khởi động cùng hệ thống
systemctl enable nginx

Sử dụng Strong Diffie-Hellman Group Có thể dùng hoặc không

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 
mkdir /etc/nginx/snippets
touch /etc/nginx/snippets/ssl-params.conf

echo "
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
" >> /etc/nginx/snippets/ssl-params.conf

  • add_header X-Frame-Options DENY; Dòng lệnh này sẽ chặn việc gọi từ iframe

Bước 2: Cấu hình NGINX#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
    listen 80;
    server_name abcdomain.xyz;
    location ~ /.well-known {
allow all;
}
location / {
proxy_pass http://web.linux:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# return 301 https://$server_name$request_uri;
}

Bước 3: Tạo cert#

1
sudo letsencrypt certonly -a webroot --webroot-path=/home/domains/abcdomain/ -d abcdomain.xyz

Bước 4: NGINX => bật HTTPS#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
server_name abcdomain.xyz;
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/abcdomain.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/abcdomain.xyz/privkey.pem;
include snippets/ssl-params.conf;
location ~ /.well-known {
allow all;
}
location / {
proxy_pass http://web.linux:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
error_log /var/log/nginx/domains/abcdomain-error.log warn;
access_log /var/log/nginx/domains/abcdomain-access.log;
}
}

Bước 5: SELinux cấp quyền#

1
2
3
4
5
6
7
8
9
10
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1

# Enable port
sudo semanage port -a -t http_port_t -p tcp 8000

# Quyền đọc file
chcon -t httpd_config_t /etc/letsencrypt/live/abcdomain.xyz/fullchain.pem
chcon -t httpd_config_t /etc/letsencrypt/live/abcdomain.xyz/privkey.pem

Thiết lập cronjob#

Tự động gia hạn lại vào ngày 01 hàng tháng

1
0 0 1 * * certbot renew --cert-name abcdomain.xyz --dry-run

Đối với CentOS 6#

1
2
3
4
5
6
7
8
9
10
11
# Install Git
yum -y install git

# Clone Let's Encrypt repository
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

# Chạy lệnh tạo cert
/opt/letsencrypt/certbot-auto certonly -a webroot --webroot-path=/var/www/html/mountdisk/ -d getfile.thapden.com

# Cronjob
0 0 1 * * /opt/letsencrypt/certbot-auto renew && /bin/systemctl reload nginx

Các lỗi có thể gặp#

Thiết lập time zone php.ini

1
2
vi /etc/php.ini
date.timezone = "Asia/Ho_Chi_Minh"

Thiết lập time zone cho hệ thống

1
yes | cp /usr/share/zoneinfo/Asia/Ho_Chi_Minh  /etc/localtime

SELinux cấp quyền trên thư mục

1
chcon -R -t httpd_sys_rw_content_t /home/domains/abcdomain

Tham khảo#