Cài đặt Cerbot Let’s Encrypt Client để tạo chứng chỉ SSL Let’s Encrypt tự động
yum -y install epel-release
# -- For Apache
yum -y install certbot python2-certbot-apache mod_ssl
# -- For Nginx
yum -y install certbot-nginx
# -- For Haproxy (không có loại riêng)
yum -y install certbot
Lưu ý: Bạn phải đảm bảo domain đã được trỏ về IP máy chủ ( Nếu cài đặt SSL cho cả www.domain.com thì sub www cũng phải trỏ về máy chủ nhé)
File chứng chỉ SSL
Sau khi đã nhận được chứng chỉ, bạn sẽ nhận được các file được mã hóa PEM bao gồm:
- cert.pem: Chứng chỉ của tên miền
- chain.pem: Chuỗi chứng chỉ từ Let’s Encrypt
- fullchain.pem: Kết hợp của cert.pem và chain.pem
- privkey.pem: Khóa riêng tư của chứng chỉ
Để sử dụng chứng chỉ này trong cấu hình máy chủ web, bạn cần nhớ vị trí mà bạn đã lưu chúng.
SSL for Apache or Nginx
# -- Ví dụ đăng ký tên miền azdigi.cf
# -- QUAN TRỌNG! Tên miền đầu tiên sẽ là tên miền nền của bạn, trong trường hợp này là azdigi.cf
# -- For apache
certbot --apache -d azdigi.cf -d www.azdigi.cf
# -- For Nginx
certbot --nginx -d azdigi.cf -d www.azdigi.cf
``` [root@template conf.d]# certbot --apache -d azdigi.cf -d www.azdigi.cf Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): (Nhập email của bạn) Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server. Do you agree?
(Y)es/(N)o: Y (Nhấn Y để đồng ý điều khoản)
Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
(Y)es/(N)o: N (Nhấn N để từ chối các thông tin, tin tức từ letsencrypt và Certbot ) Account registered. Requesting a certificate for azdigi.cf and www.azdigi.cf
Cleaning up challenges Created an SSL vhost at /etc/httpd/conf.d/azdigi.cf-le-ssl.conf Deploying Certificate to VirtualHost /etc/httpd/conf.d/azdigi.cf-le-ssl.conf Redirecting vhost in /etc/httpd/conf.d/azdigi.cf.conf to ssl vhost in /etc/httpd/conf.d/azdigi.cf-le-ssl.conf
```
Như vậy đã cài đặt thành công SSL thông qua Certbot, đường đẫn lưu file chứng chỉ của website sẽ nằm tại đường dẫn tương ứng. Các file .conf cấu hình ssl cũng được tạo ra và đưa vào thư mục cấu hình Apache, Nginx
- VirtualHost For Apache: /etc/httpd/conf.d/azdigi.cf-le-ssl.conf
- VirtualHost For Nginx: /etc/nginx/conf.d/default.conf
- Certificate: /etc/letsencrypt/live/azdigi.cf/fullchain.pem
- Private Key: /etc/letsencrypt/live/azdigi.cf/privkey.pem
Gia hạn SSL Let’s Encrypt for Apache or Nginx
Chứng chỉ Let’s Encrypt chỉ có hiệu lực trong 90 ngày và thường được lưu tại thư mục /etc/letsencrypt/live , các bạn có thể gia hạn thủ công hoặc thiết lập cronjob để làm việc đó. certbot sẽ đọc thư mục /etc/letsencrypt/live/* và tự động gia hạn toàn bộ cert domain trong đó.
# -- Gia hạn thủ công
certbot renew --dry-run
# -- Thêm Cronjob để gia hạn tự động
export VISUAL=nano; crontab -e
# -- Thêm dòng vào file crontab
00 6 * * * /usr/bin/certbot renew --quiet
Chú thích: Cronjob này có nghĩa là cứ đúng 6:00 AM nó sẽ check chứng chỉ nếu chứng chỉ hết hạn sẽ tự động gia hạn, ngược lại nếu còn hạn sẽ không thực hiện gia hạ.. Option --quiet báo Certbot không được suất ra thông tin hoặc là đợi để người dùng nhập thông tin vào.
Kiểm tra chứng chỉ SSL
Chúng ta có thể truy cập ssllabs.com để kiểm tra chứng chỉ online
HAProxy với Certbot Let’s Encrypt Client
Với HAProxy, quá trình cài đặt phức tạp hơn, và khi renew SSL yêu cầu phải restart HAProxy server. Với phiên bản HAProxy mới hơn (version > 2.2) kết hợp với acem.sh đã không yêu cầu restart làm gián đoạn hoạt động server.
# -- Cài đặt certbot
yum -y install epel-release
yum -y install certbot
Tạo New letsencrypt certificate bằng certbot
Nếu muốn tạo certificate và cấu hình haproxy, chúng ta cần cấp phép cho LetsEncrypt. Khi đó cần thiết lập một site stand-alone để listen khi ủy quyền cho LetsEncrypt.
Khi yêu cầu một certificate từ LetsEncrypt, nó sẽ yêu cầu được truy cập vào tệp tin được ủy quyền theo dạng đường dẫn “http://your-domain/well-known/acme-challenge/” và đường dẫn này bind đến cổng 80 cho yêu cầu http và 443 cho https. Nên chúng ta phải stop HAproxy và kiểm tra cổng 80 có trống hay không
# -- Stop HAProxy
sudo systemctl stop haproxy
# -- Kiểm tra cổng 80
netstat -na | grep ‘:80.*LISTEN’
# -- Tạo SSL cho mymusic.vn với email ...
certbot certonly --standalone -d mymusic.vn -d www.mymusic.vn --non-interactive --agree-tos --email keepwalking86@mymusic.vn
–standalone: Sử dụng chế độ standalone để đạt một certificate khi chúng ta không muốn sử dụng hoặc không có web server đang tồn tại. Sử dụng standalone, chúng ta kết hợp gồm lệnh “certonly”
-d mymusic.vn: chỉ định public domain hợp lệ “mymusic.vn” mà trỏ bản ghi “A” vào địa chỉ IP Public của haproxy. Tùy chọn “-d” có thể được sử dụng cho nhiều domain và yêu cầu cùng một certificate.
–non-interactive –agree-tos –email keepwalking86@mymusic.vn: Cho phép xác nhận các điều khoản, cũng như vào thông tin email tự động khi LetsEncrypt yêu cầu
Sau khi kết thúc quá trình nhận certificate cho site mymusic.vn từ LetsEncrypt thành công, khi đó thư mục chứa các tệp certificate, key nằm ở /etc/letsencrypt/live/mymusic.vn/. Sau khi đã nhận được chứng chỉ, bạn sẽ nhận được các file được mã hóa PEM bao gồm:
- cert.pem: Chứng chỉ của tên miền
- chain.pem: Chuỗi chứng chỉ từ Let’s Encrypt
- fullchain.pem: Kết hợp của cert.pem và chain.pem
- privkey.pem: Khóa riêng tư của chứng chỉ
Mở rộng key và cert thành tệp pem
Tệp pem là tệp tin chứa định dạng có thể chỉ public certificate hoặc có thể gồm tập public key, private key và root certificate kết hợp với nhau. Chúng ta thực hiện nối private key và certificate ở trên để tạo thành tệp pem.
cd /etc/letsencrypt/live/mymusic.vn/
cat fullchain.pem privkey.pem | tee mymusic.vn.pem
Cấu hình HAProxy sử dụng LetsEncrypt SSL
Phần frontend
## -- Frontend section
frontend http-in
bind *:80
# listen port cho https với port default là 443, không sử dụng giao thức sslv3
bind *:443 ssl no-sslv3 crt /etc/letsencrypt/live/mymusic.vn/mymusic.vn.pem
# redirect toàn bộ http sang https
# redirect scheme https if !{ ssl_fc }
# HAProxy chỉ sử dụng HTTPS, nó sẽ tự động redirect đến https nếu gặp http://mymusic.vn
redirect scheme https if { hdr(Host) -i mymusic.vn } !{ ssl_fc }
acl mymusic-acl hdr(host) -i mymusic.vn
use_backend mymusic if mymusic-acl
Phần Backend
## -- Backend section
backend mymusic
balance roundrobin
server server1 192.168.10.111:8080 weight 1 check
server server2 192.168.10.112:8080 weight 1 chec
server server3 192.168.10.113:8080 weight 1 check
option httplog
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
- option forwardfor : Được sử dụng để thêm header “X-Forwarded-For”, vì vậy backend có thể nhận được địa chỉ IP thực của client truy cập. Nếu không có tùy chọn này thì backend sẽ chỉ nhận được thông tin IP của HAProxy.
- http-request set-header X-Forwarded-Port %[dst_port] : thiết lập một header “X-Forwarded-Port” vì vậy mà backend biết được port nào để sử dụng khi redirect URLs.
- http-request add-header X-Forwarded-Proto https if { ssl_fc } : Thêm header X-Forwarded-Proto với thiết lập scheme là https nếu yêu cầu truy cập https. Cái này, cho phép backend xác định được scheme để sử dụng khi gửi URL lúc redirect
Nội dung file cấu hình HAProxy đầy đủ cho site mymusic.vn sử dụng SSL
# Global settings
global
log 127.0.0.1 local0
pidfile /var/run/haproxy.pid
stats socket /var/lib/haproxy/stats
maxconn 100000
user haproxy
group haproxy
daemon
quiet
# Proxies settings
## Defaults section
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 100000
retries 3
timeout http-request 5s
timeout queue 30s
timeout connect 30s
timeout client 30s
timeout server 30s
timeout http-keep-alive 30s
timeout check 30s
## Frontend section
frontend http-in
bind *:80
bind *:443 ssl no-sslv3 crt /etc/letsencrypt/live/mymusic.vn/mymusic.vn.pem
redirect scheme https if { hdr(Host) -i mymusic.vn } !{ ssl_fc }
acl mymusic-acl hdr(host) -i mymusic.vn
use_backend mymusic if mymusic-acl
backend mymusic
balance roundrobin
server server1 192.168.10.111:8080 weight 1 check
server server2 192.168.10.112:8080 weight 1 chec
server server3 192.168.10.113:8080 weight 1 check
option httplog
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
## Cấu hình vào xem trang thống kê Statistics settings
listen statistics
bind *:1986
stats enable
stats admin if TRUE
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats refresh 30s
# username/password
stats auth keepwalking86:ILoveVietnam$
Gia hạn chứng chỉ SSL trên HAProxy
Phần gia hạn này cần cấu hình lại cái option trên tham khảo tại
Cách bảo mật HAProxy với Let’s Encrypt trên CentOS 7