Bài này mình viết từ thời 2017, giai đoạn này thì thú thực https nó còn chậm hơn cả http, tuy thế theo thời gian, https trên các trình duyệt đời mới, đã nhanh hơn so với http ngày xưa, cụ thể hiện tại
Microsoft Edge: https nhanh hơn http 90% Google Chrome: https nhanh hơn http 90% Cốc Cốc: https nhanh hơn http 90% Firefox: https nhanh hơn http 91%
HTTPS là viết tắt của “Hypertext Transfer Protocol Secure”, nó là một sự kết hợp giữa giao thức HTTP và giao thức bảo mật SSL hay TLS cho phép trao đổi thông tin một cách bảo mật trên Internet. Giao thức HTTPS thường được dùng trong các giao dịch cần tính bảo mật cao, lý thuyết thì 100% các trang thương mại điện tử, shop online này nọ bắt buộc phải cài vào để bảo mật thông tin (ờ, lý thuyết suông thôi hé, chứ cài vào mà ngon thì thiên hạ thái bình rồi)
OK, tiếp theo là HSTS, nó bắt nguồn từ thói quen sử dụng, bình thường ta gõ vào trình duyệt địa chỉ một trang web, thông thường hay là domain xong .com .net gì đó, hay kiểu mình thì là gõ domain xong Ctrl + Enter để nó tự thêm www đằng trước và .com đằng sau, chứ chẳng ai ngồi gõ trực tiếp https://www.domain.com bao giờ cả …. vấn đề này thì phía setup hosting và code họ sẽ tự làm, để khi khách gõ http://domain.com nó sẽ tự chuyển về https://domain.com
Vấn đề tiếp theo nảy sinh, là chẳng thèng quản trị hosting hay code nào dám khẳng định 100% là tất cả các lần khách gõ http://domain.com nó sẽ tự chuyển về https://domain.com cả, thế là HSTS ra đời, HSTS là viết tắt của (HTTP Strict Transport Security), một chính sách bảo mật cần thiết để bảo vệ các trang web HTTPS chống lại các cuộc tấn công hạ cấp. HSTS đảm bảo rằng tất cả kết nối tới một website phải được mã hóa bằng giao thức HTTPS, và không bao giờ sử dụng giao thức HTTP
Để làm được chuyện này, thì bạn phải cài SSL và setup thêm header( ‘Strict-Transport-Security: max-age=63072000; includeSubDomains; preload) xong thì yêu cầu hstspreload.org cấp phép, sau này gõ vào trình duyệt cái domain đó, nó sẽ tự động chuyển sang HTTPS (thời gian nhớ hiện tại là tối thiểu …. 1 năm) và nó cưỡng bức phải chạy HTTPS cho mọi subdomain của domain này luôn
Một ví dụ minh họa là trang paypal.com, một trang đã được hstspreload.org cấp phép
Hành trình bạn truy cập vào paypal.com cũng lằng nhằng, nó sẽ từ http://paypal.com -> https://paypal.com -> https://www.paypal.com
Để ý chỗ này nhé, vì cái này mà mình sang hẳn thèng HSTS đấy, đó là do domain paypal.com khi gõ vào trình duyệt, trình duyệt tự hiểu là chuyển sang https nên nó chỉ mất có 91 ms là chuyển qua, tiếp theo https://paypal.com nó phải dùng 301 redirect để chuyển sang trang https://www.paypal.com nên mất tới 269 ms ? nghĩa là mất hơn gấp đôi thời gian á
Dể hiểu nhất là nếu bạn dùng code để chuyển từ http -> https, nó sẽ dùng 301 redirect, tốn thời gian tầm 200-500ms
Còn khi dùng HSTS, trình duyệt tự lưu domain của bạn vào trong database, khi chuyển từ http -> https, nó sẽ dùng 307, thời gian chỉ từ 1->10ms

Nói chung người ta sinh ra HSTS là để tăng tính bảo mật mà công dụng chính với mình là để load web nhanh thêm được cỡ 100-200 ms (nói dễ hiểu là 0.1s -0.2s) :))
Dưới dây là tuần tự các thao tác, mình ghi lại một phần để nhớ là chính thôi, vì thực sự mỗi lần làm lại cái này là mình cứ quên sạch, lại phải google cả buổi 😛
Đầu tiên là ta phải có HTTPS đã
Cái này thì gần như bạn nào cũng dùng cả rồi, bản thân các script cài đặt VPS mà mình giới thiệu họ cũng đều có tính năng https, xưa mình thử SSL signed by Cloudflare chủ yếu vì cho vui, còn ở 2023 thì với 1 tấn công nghệ từ Clouddflare, mình khuyên là mọi người nên dùng ssl từ Cloudflare, nhàn hơn rất nhiều so với ssl từ Letsencrypt hay cách dịch vụ khác
Chủ yếu nhất là thời gian SSL Clouddflare rất dài, từ 10-15 năm, các dịch vụ ssl miễn phí khác thì đa phần toàn vài tháng phải renew 1 lần, quá phiền

Vào phần SSL/TLS -> Client Certificates -> Create client certificate

Chọn như mặc định là được, thời gian chọn 15 năm cho nhàn 😀

Nó sẽ tạo cho bạn 2 phần, private key và origin certificate, origin certificate bắt đầu bằng —–BEGIN CERTIFICATE—– và kết thúc bằng —–END CERTIFICATE—–, private key bắt đầu bằng —–BEGIN PRIVATE KEY—– và kết thúc bằng —–END PRIVATE KEY—–
Dùng 1 phần mềm edit text nào đó, sau đó save private key thành file có phần mở rộng là .key (bibica.net.key), save origin certificate thành file có phần mở rộng là .pem (bibica.net.pem)
Như đây mình làm cho domain bibica.net nó ra 2 file private key và origin certificate như thế
Upload 2 file này lên VPS của bạn, upload vào đâu thì tùy, mình thì upload nó vào /root/ssl, chủ yếu cho dễ nhớ thôi 😀
Mở file Nginx config của domain ra, cụ thể mình đang dùng Centmin Mod thì file config bibica.net nằm ở
/usr/local/nginx/conf/conf.d/bibica.net.conf
Thêm dòng bên dưới trong server {}
listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /root/ssl/bibica.net.pem; ssl_certificate_key /root/ssl/bibica.net.key;
Sau đó chạy tiếp dòng dưới để reload lại nginx, để thay đổi có hiệu lực
nginx -t service nginx reload
Trên các script khác, kiểu CyberPanel thì cứ add thẳng đoạn text vào SSL thôi

Nói chung, khi bạn đã có được 2 file .key và .pem này rồi thì có thể dùng được trên mọi web server khác nhau

Vào trang quản trị của Cloudflare, tới phần SSL/TLS -> Overview -> Full (strict)
Yêu cầu hstspreload.org cấp phép
Trước đây, để yêu cầu hstspreload cấp phép, ta phải cấu hình khá nhiều thứ, ở 2023 mình thấy Cloudflare đã hỗ trợ tự động cả rồi, bạn chỉ cần set theo hình là được
Do quản lý HSTS qua Cloudflare, nên trên các web server khác nhau đều có tác dụng, Nginx, Apache, LiteSpeed, OpenLiteSpeed …. nó rất tiện vì kiểu vì nhiều lý do, bạn có thể đổi qua nhiều web server khác nhau thì đều không cần phải cấu hình lại

SSL/TLS -> Edge Certificates
Always Use HTTPS bật Minimum TLS Version: TLS 1.2 TLS 1.3: Bật HTTP Strict Transport Security (HSTS): ấn vào để tùy chỉnh

Enable HSTS (Strict-Transport-Security): Bật Max Age Header (max-age): chọn 12 tháng Apply HSTS policy to subdomains (includeSubDomains): Bật Preload : Bật
Sau đó chọn Save
Lúc này kiểm tra tiêu đề trang bibica.net, nó sẽ có đoạn tiêu đều hstspreload yêu cầu 😀
strict-transport-security: max-age=31536000; includeSubDomains; preload

Ra được như thế thì vào hstspreload để yêu cầu cấp phép dùng HSTS thôi
Cơ bản là thế 😛
Ngày cấp phép thì mình không chắc cụ thể lắm, nhớ mang máng là phải chạy ổn định liên tục tầm 3 tháng với tiêu đề strict-transport-security: max-age=31536000; includeSubDomains; preload thì mới được cấp phép, đợt mình đăng kí nhớ hình như đâu đó tầm 2 tháng là được cấp rồi

Chú ý là một khi đã yêu cầu HSTS thành công rồi thì từ giờ, tất cả các sub domain hay domain của bạn đều phải dùng https hết, ví dụ như bạn tạo thêm forum.bibica.net, blog.bibica.net, hay cdn.bibica.net thì đều phải tạo thêm ssl để chạy https cho nó, vì khi đã được hstspreload cấp phép, là trình duyệt nó sẽ tự preload chuyển hết về https 😀 không có còn phải thông qua các lệnh gì liên quan tới server hay code kiểu 301 redirect nữa, lúc này thì kể cả bạn có xóa VPS, cứ gõ bibica.net vào trình duyệt là nó tự táng sang https://bibica.net hết 😀
Giờ đây nếu bạn dùng các trình duyệt “đời mới” thì khi gõ domain bibica.net, nó chỉ mất tầm 1-5ms để tự chuyển sang https://bibica.net 😀 status là 307 so với 301 thông thường 😛
Chung quy thì dùng HSTS ta cải thiện được 1 ít về tốc độ (từ 100-200ms -> 1-5ms), tăng thêm tính bảo mật cho site, vì cưỡng bức dùng https 😀

Vấn đề điểm số này nọ của SSL trên ssllabs thì cũng không cần quan tâm làm gì, Cloudflare xử lý mọi thứ theo tiêu chuẩn thế giới, A+ cả
Trước đây khi Cloudflare chưa hỗ trợ HSTS, chúng ta phải cấu hình ở webserver hơi nhiều, giờ mình thấy cấu hình quá là nhàn luôn, gần như bạn chỉ phải làm đúng 1 lần duy nhất trên Cloudflare, sau đó không cần làm thêm cái gì cả, có đổi host, đổi vps, đổi webserver … đều không ảnh hưởng, rất đáng bỏ thời gian ra làm
Mình cũng có thử rất nhiều công nghệ liên quan tới vấn đề tốc độ ssl, thì đều không quá hiệu quả, SSL từ Cloudflare vẫn cho ra tốc độ nhanh nhất, quan trọng là thèng bibica.net hiện tại gần như là sống trên đôi vai của Cloudflare, trừ Cloudflare Registrar là mình không dùng, còn lại từ DNS, SSL, HSTS, Cache, chậm chí cả chặn spam, đều dùng từ hệ sinh thái của Cloudflare 😀
Xưa thì mình hay cấu hình trực tiếp trên Nginx, đợt này đổi sang dùng OpenLiteSpeed, đổi đổi qua lại cấu hình thấy mệt người quá, nên thôi, để Cloudflare quản lý cho nhàn, sau đổi qua lại giữa các webserver không cần phải cấu hình lại, cập nhập lại bài này sau nhiều năm cũng là vì thế 😀
Tôi đã cài lại centiminmod và cài lại ssl nhưng lỗi vẫn như cũ, admin có thể xem giúp được ko ạ. THanks
Cài centiminmod với tất cả thông số mặc định (1 dòng code), add website vào (ấn 2-3 lần), tiếp theo config https như bài này
Nó chỉ thế thôi mà?
Theo hướng dẫn làm đi làm lại mãi vẫn lỗi dòng add site chuẩn hết đến đoạn này thì lại bị lỗi
listen 443;
ssl on;
ssl_certificate /root/ssl/bibica.net.pem;
ssl_certificate_key /root/ssl/bibica.net.key;
Lỗi dòng ssl on;
Thế mới đau chứ, từ qua nay mò mãi lên mạng xem các site nhưng ko có tài liệu.
bạn có thể giành chút thời gian xem hộ vps mình lỗi chỗ nào dc ko cài cả 6, 7 vẫn không dc.
Mình làm theo hướng dẫn mãi không được nhỉ, admin lúc nào có thời gian xem bên cloudflare có thay đổi gì không với, hoặc có video hướng dẫn gì giúp với. Mọi bước đều không sai nhưng cuối cùng https thì không truy cập dc .
https://datxanhquangninh.net/
Vào Cloudflare, phần SSL, chọn sang Flexible thử xem thế nào?
Giờ cài ssl cho cloudflare thì được nhưng cài website vào vps thì lại không truy cập dc, bạn có video nào hướng dẫn không ạ, những video nước ngoài xem khó hiểu quá. Thanks admin
Cài lại, thử lại từ đầu xem thế nào?
Mình thử lại nhiều lần lắm rồi, đến bước này bị lỗi này
listen 443;
ssl on;
ssl_certificate /root/ssl/datxanhquangninh.net.pem;
ssl_certificate_key /root/ssl/datxanhquangninh.net.key;
Khi làm lệnh lại
nginx -t
nó báo lỗi
nginx: [warn] the “ssl” directive is deprecated, use the “listen … ssl” directive instead in /usr/local/nginx/conf/conf.d/datxanhquangninh.vn.conf:15
line 15 là ssl on;
khi xóa đi thì nó ko báo lỗi nữa. Tóm lại hiện đang vướng biết xử lí cài lại qua nay chục lần chưa dc 🙁
Làm như bài, cái file nó sẽ như thế này (https://i1.wp.com/bibica.net/wp-content/uploads/2018/11/2018-11-30_22-01-15.png)
So xem điền đúng không?
====
listen 443;
ssl on;
ssl_certificate /root/ssl/datxanhquangninh.net.pem;
ssl_certificate_key /root/ssl/datxanhquangninh.net.key;
==== chỉnh như bên dưới sẽ hết 🙂
listen 443 ssl;
ssl_certificate /root/ssl/datxanhquangninh.net.pem;
ssl_certificate_key /root/ssl/datxanhquangninh.net.key;
Admin lam on cho hoi. Tôi làm như các bước đều thành công còn chỗ upload 2 file lên thì đường dẫn tôi lại khác vì trong mục root không có ssl nên đường dẫn nằm trong mục /etc/ssl/ và cho 2 file vào đấy
Bước kế đến
listen 443;
ssl on;
ssl_certificate /root/ssl/datxanhquangninh.net.pem;
ssl_certificate_key /root/ssl/datxanhquangninh.net.key;
Tôi thay thành
listen 443;
ssl on;
ssl_certificate /etc/ssl/datxanhquangninh.net.pem;
ssl_certificate_key /cet/ssl/datxanhquangninh.net.key;
Sau đó chạy lại lệnh
nginx -t
service nginx reload
nhưng không được và báo lỗi như ảnh
https://bdsdatxanh.com/wp-content/uploads/2020/03/ho-tro.png
Rất mong admin hỗ trợ, xin cảm ơn
Trong mục root không có thư mục ssl thì tạo thư mục đó là được 😀
Mình tạo rồi nó báo lỗi thế này là sao nhỉ
nginx: [emerg] “listen” directive is not allowed here in /usr/local/nginx/conf/conf.d/datxanhquangninh.net.conf:8
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
Thanks
Theo như lỗi nó báo thì là không chấp nhận load file từ thư mục đó
Tôi đã cài dc hết các bước nhưng truy cập vào https không dc nghĩa là sao admin có thể xem giúp ko ạ
Làm hết các bước, thì khi gõ http://domain.com nó sẽ tự chuyển sang thành https://domain.com, nếu không đúng nó sẽ báo lỗi 😀
Đã chỉnh sửa đúng y hệt luôn
https://batdongsanduyenhai.vn/wp-content/uploads/2020/03/ho-tro.png
Nhưng khi gõ
nginx -t
thì nó báo lỗi line theo chữ ssl on;
nginx: [warn] the “ssl” directive is deprecated, use the “listen … ssl” directive instead in /usr/local/nginx/conf/conf.d/datxanhquangninh.vn.conf:20
nên mình nghĩ chưa ra sai chỗ nào 🙁 rất mogng được hỗ trợ
Xóa hết làm lại từ đầu thôi 😀
đã xóa và cài lại centmin mod 2 lần rôi, vẫn chưa hiểu là sai ở bước nào bạn ạ.
Thử xem đã, hix
chào bạn mình xem trên mạng thấy họ dùng
server {
server_name http://www.example.com;
rewrite ^(.*) https://example.com$1 permanent;
}
để chuyển http sang https
còn code trên của bạn lại là return 301 https chứ k phải rewrite
bạn cho mình hỏi 2 cái này có gì khác nhau. và nên dùng cái nào ạ
thanks
Mình dùng như trong bài ở trên 😀
Nếu cài Origin Certificates của CF thì bật luôn SSL Full (Stric) được mà. Bật Full làm gì xấu 🙂
Full (stric) thì không lo bị lộ IP thật của server nữa. CF có 1 bài cảnh báo nói về vấn đề này rồi. Nhất là mấy web để flexiable :v
Full hay Full (strict) thì tùy 😀 chủ yếu dòng in đậm ở sau thôi 😀
Thực tế bài này khi viết xong sửa chỗ Full và Full (strict) tầm 3-4 lần rồi á :]]
bibica ơi, web mình cứ bị trả về Status Code: 304 chứ không phải 200 như bibica, có ảnh hưởng gì không 🙁
Web gì thế ạ?
Web https://teeqq.com
Không hiểu sao toàn bị chuyển sang 304.
P/S: Mình mới check lại thì phát hiện ra thế này.
1. x-rocket-nginx-serving-static: No thì Status Code sẽ là 200
2. x-rocket-nginx-serving-static: Yes thì Status Code sẽ là 304
Có gì mà không hiểu? Status Code: 304 Not Modified trên SHOP là chuẩn mà (https://www.keycdn.com/support/304-not-modified)
Lần đầu vào nó sẽ là code 200, sau khi bạn F5, hoặc qua trang khác, xong quay lại lại ban đầu, nó không thấy có sự thay đổi gì, thêm giỏ hàng hay mua hàng, thì nó sang code 304 là “không có sự thay đổi”
Chỉ thế thôi mà
Lý do mình luôn recommend dùng WP Rocket là thế, nó chạy trên shop rất hiệu quả, status 304 là nó không thấy có sự thay đổi gì so với trước, bạn vào trang thử ấn mua hàng, add 1 sản phẩm vào giỏ, là nó tự hiểu đang mua hàng, nó không load dùng cache ra nữa, mấy plugin cache khác có khi lỗi tè le lun á :]]
À haha ra là vậy, thế thì mình an tâm rồi, nhưng bibica ơi thế còn lỗi vary: Accept-Encoding bị duplicate 2 lần thì do đâu?
https://bewished.co -> Web này đang bị lỗi đó, lâu lâu cái web https://teeqq.com cũng vẫn bị, chả hiểu sao nữa.
vary: Accept-Encoding là lỗi gì
Nó bị lỗi như thế này ạ:
https://i.imgur.com/07TqUgx.png
Như bibica chỉ có 1 cái thôi ấy ạ.
Mình dùng hosting DigitalOcean + Serverpilot cấu hình ẵn http/2 và ngnix chạy song song với apache. Lúc cài wp rocket và rocket ngnix xong thì bị như thế, chả biết có bị trùng code hay gzip gì không? Mình tắt gzip on và gzip_vary: on đi trong nginx đi thì không bị vậy nữa, nhưng tắt rồi chả biết có sao không 🙁
Chủ yếu nhất cài WP Rocket vào xong thấy có nhanh hơn không? Nhanh hơn thì khỏi cần quan tâm mấy cái đó, còn thấy chậm hơn thì gỡ ra xem tốc độ thế nào
Thực tế DigitalOcean + Serverpilot chạy WP mặc định cũng ngon chán rồi, chẳng cần vẽ vời tốt ưu thêm cái gì cho mệt 😀
Khi nào shop khách vào đông bị quá tải thì mới cần quan tâm này nọ thôi 😛
Cụ thể như cái ảnh bên dưới của thèng ngoirungdui.com (https://i.imgur.com/rvmsOWs.jpg)
Làm xong, vào shop mất 0.5s, load xong trang mấy tầm 0.7s 😀
Xong, thấy nó nhanh, chạy không lỗi, ổn định là được 😀
Mình làm bằng Flexible và CloudFlare thấy nó cũng có HTTP Strict Transport Security (HSTS), đang gửi xác nhận, chờ duyệt :3
bibica dùng thằng nào để gửi mail thế ạ
Ngày xưa dùng MailGun (http://bibica.net/mailgun-the-email-service-for-developers/), hiện tại thì là Amazon Simple Email Service (http://bibica.net/amazon-simple-email-service/)
Ôi, phức tạp quá, thôi cứ dùng cái Flexible của CloudFlare cho lẹ, đỡ đau đầu :))
Làm thì nhanh, chủ yếu nó chuyển tất cả subdomain sang https nên cũng khá phiền đấy 😀
anh ơi, còn cái webinoly thì sao ạ.
Em bật SSL bằng script của webinoly thì OK rồi, check cũng A+
Nhưng khi thêm strict-transport-security vào để đăng ký HSTS thì bị trùng với 1 cái strict-transport-security đã có sẵn.
Có dùng mấy plugin dạng really simple ssl không?
Bọn này đa phần nó hay có option bật tiêu đề thế lên 😀
dạ hông anh.
Em đoán là thằng webinoly nó tự thêm vào, mà em không tìm ra chỗ để edit.
Em check thử ngoirungdui cũng có sẵn strict-transport-security luôn
Ah, đúng thế thật
Vào /etc/nginx/common/headers-https.conf nó có thêm dòng add_header Strict-Transport-Security “max-age=31536000”;
Sửa lại thành giống như trong bài rồi reload lại Nginx là được
yeah, cảm ơn anh nha, em làm theo anh và được rồi.
bài dài như lươn ấy, very good cho seo 🙂
Nguyên đoạn đầu viết để nhớ, thực tế đây cũng là lần đầu teo dùng ssl của Cloudflare 😀
Nguyên bài dài thế chứ thêm có mỗi header( ‘Strict-Transport-Security: max-age=63072000; includeSubDomains; preload) vào à 😀