Tiếp tục thôi, bài này mình sẽ hướng dẫn chi tiết cách cài đặt và cấu hình SSL Certificate của Let’s Encrypt trên CentOS 7 Web Server. Bạn nào chưa biết Let’s Encrypt là gì thì đọc lại bài trước của mình nhé.
Như đã biết, muốn lấy chứng chỉ từ Letsencryp bản phải dùng Let’s Encrypt Client để tải về.
Trong bài này mình sẽ dùng Client Certbot. Tại sao lại dùng Certbot à, vì nó là Recommended Client được Let’s Encrypt khuyên dùng ^^.
Thứ hai là mình sẽ dùng Plugin webroot bởi plugin này dùng được cho cả webserver chạy apache và nginx. Quan trọng nhất là mình sẽ không phải stop port 80/443 khi chứng thực “authenticators” như plugin standalone vì sẽ làm gián đoạn website. Còn Plugin apache/nginx lại chỉ dùng riêng cho từng loại web server và đang trong giai đoạn thử nghiệm nên mình cũng không dùng.
Tài liệu tham khảo: certbot & webroot
Chuẩn bị
- Bạn nên dùng VPS theo danh sách mà mình đã trải nghiệm.
- Hệ điều hành CentOS 7
- Web Server Nginx or Apache
- Domain demo thuysys.xyz
1. Cài Let’s Encrypt
Phần này là cài đặt chung cho CentOS 7 áp dụng cả Web Server NGINX và APACHE.
Hiện package Certbot có sẵn trên kho của EPEL bạn add repo này vào server để lấy bộ cài đặt về.
Add repository EPEL
yum install epel-release
Cài Certbot
yum install certbot
Tạo thư mục .well-known
trong Document Root của website
mkdir /var/www/thuysys.xyz/.well-known
Việc tạo thư mục ẩn .well-know
chính là lời giải thích cho sự khác nhau giữa hai plugin webroot và standalone. Tại sao standalone phải stop webserver còn webroot thì không ?
Bạn là webmaster chắc không còn lạ gì với cách verify domain trên Google Webmaster Tool. Cách hoạt động của webroot cũng tương tự như vậy. Để “authenticators” với Let’s Encrypt, webroot sẽ tạo ra một file tạm trong thư mục .well-known sau đó Let’s Encrypt sẽ truy cập vào file đó để xác nhận domain của bạn. Cách làm này đơn giản mà hiệu quả, không như standalone bắt buộc sử dụng port 80/443 mới chịu.
Bước tiếp theo chúng ta chạy lệnh để cài SSL trên CentOS 7 từ Let’s Encrypt.
certbot certonly --webroot -w /var/www/thuysys.xyz -d thuysys.xyz -d www.thuysys.xyz
Giải thích mấy cái option một chút:
certonly
nghĩa là bạn chỉ muốn lấy certificate thôi còn không install.--webroot
khai báo dùng plugin webroot.-w
là đường dẫn đến Document Root của website.-d
tên miền muốn dùng SSL.
Chạy lệnh trên, sẽ có thông báo yêu cầu bạn nhập địa chỉ email. Đây là email sở hữu chứng chỉ để sau này có vấn đề gì còn có cái liên hệ. Ví dụ mình nhập admin@thuysys.xyz.
Nhập Email quản lý chứng chỉ.
Đồng ý với điều khoản (TOS) của Let’s Encrypt, chọn Agree
Nếu không muốn phải nhập thông tin gì khi lấy chứng chỉ SSL bạn chạy lệnh sau.
certbot certonly --webroot -w /var/www/thuysys.xyz -d thuysys.xyz -d www.thuysys.xyz --agree-tos --email admin@thuysys.xyz
Cài SSL cho CentOS bạn có thể mở file log của Web Server để xem quá trình authenticators domain giữa Web Server với Let’s Encrypt.
66.133.109.36 - - [19/Jul/2016:07:50:48 +0000] "GET /.well-known/acme-challenge/wzCKwmsw9pAOdM_HOacafzZ0AHAgv8TF91FQrmwbCFc HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
Sau bước này bạn đã lấy chứng chỉ SSL cho domain thuysys.xyz thành cồng. Toàn bộ chứng chỉ sẽ được lưu tại /etc/letsencrypt/live/thuysys.xyz/
gồm 4 file.
- cert.pem file chứng chỉ domain của bạn, nếu người dùng truy cập thuysys.xyz Webserver sẽ gửi chứng chỉ này cho web browser cũng với Public Key được sinh ra từ privkey.pem.
- privkey.pem đây là Private Key nó dùng để giải mã Public Key. File này rất quan trong bạn phải bảo mật cẩn thận.
- chain.pem là chứng chỉ của Root CA đơn vị cao nhất xác minh sự tồn tại của CA trung gian. Cách hoạt động SSL Certificate theo kiểu đệ quy giống với truy vấn DNS. Root CA là cao nhất quản lý các thằng CA cấp thấp hơn, Let’s Encrypt cũng là một CA trùng gian cấp thấp.
- fullchain.pem file gộp, bao gồm chứng chỉ của domain và root CA đầy đủ nhất (cert.pem + chain.pem).
Tiếp theo chúng ta sẽ đi cấu hình Web Server sử dụng chứng chỉ SSL vừa lấy được.
2. Cấu hình nginx sử dụng SSL
Mở file config nginx, bạn thêm vào block server {…} mấy chỉ thị sau.
listen 443 ssl default_server; ssl_certificate /etc/letsencrypt/live/thuysys.xyz/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/thuysys.xyz/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
Đến bước này bạn chỉ cần restart nginx là dùng được SSL rồi.
Chuyển hướng http sang https
Nhiều người vẫn gọi là Redirect sang https. Chỗ này nói thêm, vì mình muốn bất kỳ ai gõ tên miền thuysys.xyz trên address bar có www hay non-www đều tự động chuyển sang https://www.thuysys.xyz. Nên mình sẽ phải thêm đoạn code cấu hình redirect url cho nginx như bên dưới.
if ($scheme = http) { return 301 https://www.thuysys.xyz$request_uri; }
Mình thích dùng directive return để cấu hình redirect hơn vì nó đơn giản và được nginx khuyên dùng. Ngoài ra bạn có thể cấu hình dùng directive rewrite mà vẫn đạt được mục đích trên.
3. Cấu hình Apache sử dụng SSL.
Cũng tương tự như Nginx để cài Let’s Encrypt cho Apache bạn cũng tạo folder .well-known trong Document Root sau đó chạy lệnh certbot lấy chứng chỉ cho domain.
Với Apache bạn phải kiểm tra mod_ssl đã được cài đặt hay chưa, nếu chưa cài thì cài bổ sung vào.
yum install mod_ssl
Khi mod_ssl được cài thành công bạn sẽ thấy file config ssl trong /etc/httpd/conf.d/ssl.conf
Backup file config phòng rủi ro
cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
Nếu server của bạn chạy Virtual Host cho nhiều website thì bạn chỉ việc đổi tên ssl.conf thanh Virtual Host tương ứng.
mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl-thuysys.xyz.conf
Sau đó mở file ssl_thuysys.xyz.conf sửa đổi một chút để cấu hình ssl cho tên miền của mình.
<VirtualHost _default_:443> DocumentRoot /var/www/thuysys.xyz ServerName www.thuysys.xyz:443 SSLCertificateFile /etc/letsencrypt/live/thuysys.xyz/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/thuysys.xyz/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/thuysys.xyz/chain.pem SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH ... </VirtualHost>
Chuyển hướng http sang https
Cấu hình Redirect URL trên Apache sang https://www.thuysys.xyz khác so với nginx. Bạn thêm dòng bên dưới vào <VirtualHost>…</VirtualHost>
Redirect permanent / https://www.thuysys.xyz
Trên Apache cũng có nhiều cách để thay đổi URL theo sở thích riêng, bạn có thể dùng mod_rewrite để làm được việc này. Cách sử dụng mod_rewrite mọi người tự mần nhé.
4. Gia hạn chứng chỉ Let’s Encrypt
Toàn bộ thông tin chứng chỉ của bạn được mô tả trong file /etc/letsencrypt/renewal/thuysys.xyz.conf
Với nội dung:
# renew_before_expiry = 30 days version = 0.8.1 cert = /etc/letsencrypt/live/thuysys.xyz/cert.pem privkey = /etc/letsencrypt/live/thuysys.xyz/privkey.pem chain = /etc/letsencrypt/live/thuysys.xyz/chain.pem fullchain = /etc/letsencrypt/live/thuysys.xyz/fullchain.pem # Options used in the renewal process [renewalparams] authenticator = webroot installer = None account = 48c642e6815eb3a0c4c5ec98837976ac webroot_path = /var/www/thuysys.xyz [[webroot_map]] www.thuysys.xyz = /var/www/thuysys.xyz thuysys.xyz = /var/www/thuysys.xyz
Như vậy bạn chỉ có thể xin cấp mới chứng chỉ khi thời gian sử dụng còn lại 30 ngày.
Vì lý do nào đó bạn muốn xin cấp mới chứng chỉ sớm hơn thời hạn bạn chạy lệnh sau cho mình.
certbot renew --webroot -w /usr/share/nginx/html --force-renew
Kết quả như bên dưới là thành công.
------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/thuysys.xyz.conf ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- new certificate deployed without reload, fullchain is /etc/letsencrypt/live/thuysys.xyz/fullchain.pem ------------------------------------------------------------------------------- Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/thuysys.xyz/fullchain.pem (success) ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/thuysys.xyz.conf -------------------------------------------------------------------------------
Muốn Auto Renewal bạn phải tạo một crontab để tự động chạy lệnh renewal ở trên định kỳ.
0 0 1 */2 * certbot renew --webroot -w /usr/share/nginx/html --force-renew
Crontab ở trên sẽ tự động gia hạn chứng chỉ sau hai tháng.
- Xem thêm: cách sử dụng crontab
5. Kiểm tra hoạt động SSL
Thế là xong, bạn lưu file config lại rồi khởi động Web Server. Mở trình duyệt ra truy cập vào địa chỉ thuysys.xyz để tận hưởng thành quả.
Như hình bên dưới là SSL hoạt động tốt rồi.
Thêm bước kiểm tra SSL tương thích với trình duyệt nữa cho chuẩn, mình dùng công cụ tại ssllabs.com kết quả :
Tuyệt với, A+ là qúa ngon rồi bạn check mà điểm không được mức A là phải xem lại cấu hình SSL trên server nhé.
6. Kết bài
Cấu hình Let’s Encrypt SSL không khó chỉ cần vận dụng tốt Client và Plugin là làm được. Có thời gian mình sẽ hướng dẫn sử dụng Certificate tại Let’s Encrypt để cài SSL cho Ubuntu cho các bạn, thông số cấu hình cũng như nội dung bài này chỉ khác chút về đường dẫn thôi.
Ngoài ra nếu muốn có thương hiệu bạ có thể mua SSL của Namecheap hoặc GogetSSL với giá chỉ khoảng $3/năm, tham khảo bài viết.
Chúc các bạn có thứ hạng cao trên google 🙂
cho hỏi khi mình chạy lệnh: certbot certonly –webroot -w /var/www/maydomain.com -d maydomain.com -d http://www.mydomain.com
thì nó báo lỗi:
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
Mong ad giúp mình. Thanks !
Lỗi này có thể do bạn chưa trỏ domain về webserver, bạn kiểm tra xem đã truy cập http bình thường chưa.
Chào ad, cái domain demo thuysys.xyz được tạo ra từ apache, có cần cài DNS phân giải cho nó không mà e cài vào nó báo DNS problems. Mong nhận được sự giúp đỡ
Bạn không cần cài DNS riêng làm gì, nên dùng DNS (Nameserver) của nhà cung cấp dịch vụ Domain hoặc VPS
Chỉ cần 0 0 1 */2 * certbot renew là tự renew rồi.
Thanks bro..