Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Security Essentials

Security Essentials 022.2: Mã hóa Web

Security Essentials 022.2: Mã hóa Web

Hiểu HTTPS và lỗi chứng thư qua SAN, thời hạn và CA; thực hành TLS trong lab riêng, kiểm tra sai tên máy chủ và bàn giao lỗi mà vẫn giữ xác minh.

Cổng nhân sự thường dùng bỗng hiện cảnh báo chứng thư. Đồng nghiệp đề nghị bấm tiếp vì “trang nội bộ vẫn thế”. Help Desk cần xác định lỗi tên dịch vụ, thời gian hay chuỗi tin cậy trước khi cho người dùng nhập mật khẩu. Bỏ qua cảnh báo có thể khiến kết nối mất bước xác minh đúng máy chủ.

Kết quả học tập và phạm vi kiểm chứng

Sau bài này, bạn phân biệt HTTP với HTTPS, đọc SAN và thời hạn chứng thư, nhận diện các nhóm lỗi rồi thu thập bằng chứng để bàn giao. Cần biết URL, terminal, tệp và mã thoát; nên hoàn thành bài mật mã và PKI trước.

Bài tham chiếu mục 022.2 của giáo trình Security Essentials 1.0 tiếng Việt ngày 15/04/2026, trang in 71–88. Đối chiếu mục tiêu LPI và tài liệu chính thức đến 23/10/2026. Lab chạy Ubuntu 26.04.1 ARM64, OpenSSL 3.5.5, curl 8.18.0 và Python 3.14.4 trong container riêng. Không coi kiểm thử curl là kiểm thử mọi trình duyệt.

HTTPS bảo vệ kết nối đến tên nào?

HTTP định nghĩa cách trao đổi yêu cầu và phản hồi. Khi truyền không có lớp mã hóa phù hợp, bên có khả năng quan sát đường truyền có thể đọc hoặc can thiệp dữ liệu. HTTPS bổ sung bảo vệ truyền tải và xác minh danh tính dịch vụ theo tên mà client dự kiến kết nối. Máy chủ kết thúc TLS vẫn có thể đọc nội dung để xử lý.

Với HTTP/1.1 hoặc HTTP/2 trên TLS/TCP, cổng HTTPS mặc định thường là 443. Không suy ra mọi HTTPS đều đi TCP: HTTP/3 chạy trên QUIC. Lab dùng cổng 8443 và HTTP/1.0 phản hồi từ server Python qua TLS 1.3, không minh họa HTTP/3.

Tên SSL còn xuất hiện trong cách gọi chứng thư, nhưng đó không phải lý do bật giao thức SSL cũ. TLS 1.3 dùng cơ chế bảo vệ bản ghi hiện đại; không mô tả mọi phiên như cùng một công thức mã hóa rồi gắn MAC riêng. Bài này tập trung điều kiện xác minh chứng thư, không hướng dẫn tự thiết kế mật mã.

Một trang lừa đảo vẫn có thể có HTTPS cho tên miền của nó. Cần đối chiếu chính xác hostname với dịch vụ mong muốn và quy trình nghiệp vụ. Đường dẫn sau hostname hoặc biểu tượng kết nối đẹp không chứng minh tổ chức nhận tiền là đúng. Cũng không gửi mật khẩu qua HTTP rồi trông chờ chuyển hướng sẽ bảo vệ phần đã gửi.

Đọc chứng thư theo bốn câu hỏi

Tên có khớp không? Với danh tính DNS, xem SAN loại dNSName; nếu URL dùng địa chỉ IP, cần SAN loại iPAddress phù hợp. Theo RFC 9525, không dựa vào CN thay SAN. Wildcard chỉ là toàn bộ nhãn ngoài cùng bên trái: *.example.test có thể khớp portal.example.test, không khớp example.test hoặc a.portal.example.test. Không dùng ví dụ wildcard một phần như por*.example.test làm quy tắc hiện hành.

Thời gian có hợp lệ không? Validity có notBefore và notAfter. Đồng hồ client sai có thể gây lỗi, nhưng không phải mọi cảnh báo thời gian đều do máy người dùng. Cần kiểm tra thời gian thực tế trước khi đề nghị chủ dịch vụ gia hạn. Không chỉnh lùi đồng hồ để làm chứng thư hết hạn được chấp nhận.

Client tin CA nào? Subject là chủ thể, issuer là bên cấp. Tên hai trường nối được chưa đủ: còn cần kiểm tra chữ ký và các điều kiện của đường dẫn tới trust anchor. Thiếu intermediate cũng có thể gây lỗi dù leaf chưa hết hạn. RFC 5280 mô tả kiểm tra đường dẫn; không phải mọi ứng dụng dùng cùng kho tin cậy.

Chứng thư dùng đúng mục đích không? Kiểm tra extensions liên quan như key usage và extended key usage. Thu hồi là phần của vòng đời; hành vi kiểm tra còn tùy ứng dụng và chính sách. Đừng mặc định mọi trình duyệt đều hỏi cùng dịch vụ OCSP trong mỗi lần truy cập hoặc cứ chưa hết hạn là luôn được chấp nhận.

Cùng địa chỉ kết nối chưa có nghĩa cùng danh tính TLS; CA và SAN được kiểm tra riêng.
Hình 2. Cùng địa chỉ kết nối chưa có nghĩa cùng danh tính TLS; CA và SAN được kiểm tra riêng. Mở hình để xem chi tiết.

Xử lý cảnh báo theo bằng chứng

  1. Dừng nhập thông tin nhạy cảm. Ghi hostname, thời điểm, phiên bản trình duyệt và mã lỗi; tránh chụp cả URL có token hoặc dữ liệu nhân sự.
  2. Kiểm tra ngày, giờ và múi giờ của thiết bị. Xác nhận đang mở đúng tên dịch vụ từ nguồn được tổ chức cung cấp, không thử các tên gần giống.
  3. Xem chi tiết chứng thư nếu trình duyệt cho phép mà không cần tiếp tục truy cập. Ghi SAN, issuer và thời hạn; không cài root vừa tải từ trang báo lỗi.
  4. So phạm vi ảnh hưởng theo quy trình IT: một website hay nhiều website, một thiết bị hay nhiều thiết bị. Các quan sát này giúp chọn giả thuyết, chưa tự xác định có tấn công.
  5. Bàn giao cho chủ dịch vụ hoặc nhóm quản trị thiết bị/mạng cùng thông tin đã thu thập. Chỉ thử lại sau khi nguyên nhân được xử lý hoặc có hướng dẫn đã xác thực.

Tài liệu Chrome chỉ cách xem trạng thái kết nối và nhắc kiểm tra đúng tên website. Biểu tượng, vị trí và câu chữ có thể thay đổi theo nền tảng, phiên bản. Không dạy người học rằng luôn phải có hình ổ khóa mới là HTTPS.

Firefox giải thích mã cảnh báo: lỗi hết hạn, unknown issuer hoặc bad certificate domain gợi các hướng kiểm tra khác nhau. Unknown issuer có thể liên quan thiếu chuỗi, CA nội bộ chưa được quản lý đúng hoặc thiết bị trung gian kiểm tra TLS. Không tự tắt phần mềm bảo vệ hay bỏ qua cảnh báo để phân biệt chúng.

Kiểm tra đúng URL, thời gian và chi tiết chứng thư trước khi bàn giao.
Hình 1. Kiểm tra đúng URL, thời gian và chi tiết chứng thư trước khi bàn giao. Mở hình để xem chi tiết.

Lab cô lập: đúng tên, sai tên và CA không được tin

Chỉ dùng môi trường lab riêng có Bash, OpenSSL, Python và curl. Chạy các khối theo thứ tự trong cùng terminal, không dùng khóa thật. Server chỉ nghe loopback; CA được chỉ định cho từng lệnh, không thêm vào trust store hệ thống. Các khóa không có mật khẩu chỉ phục vụ fixture dùng một lần.

Tạo CA và chứng thư minh họa

umask 077
work=$(mktemp -d)
cd "$work"
openssl req -x509 -newkey ec \
  -pkeyopt ec_paramgen_curve:prime256v1 -noenc \
  -keyout ca.key -out ca.pem -days 10 \
  -subj '/CN=LPI DEMO Root' \
  -addext 'basicConstraints=critical,CA:TRUE' \
  -addext 'keyUsage=critical,keyCertSign,cRLSign'
openssl req -new -newkey ec \
  -pkeyopt ec_paramgen_curve:prime256v1 -noenc \
  -keyout server.key -out server.csr \
  -subj '/CN=lab.example.test'
cat > leaf.ext <<'EXT'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=serverAuth
subjectAltName=DNS:lab.example.test
EXT
openssl x509 -req -in server.csr -CA ca.pem \
  -CAkey ca.key -CAcreateserial -out server.pem \
  -days 2 -sha256 -extfile leaf.ext
openssl verify -CAfile ca.pem -purpose sslserver \
  -verify_hostname lab.example.test server.pem

Kỳ vọng server.pem: OK. CA 10 ngày và leaf 2 ngày chỉ là thông số bài tập, không phải chính sách cấp chứng thư công cộng. Kiểm tra ngoại tuyến này chưa chứng minh server đang sử dụng đúng tệp.

Chạy server riêng

cat > server.py <<'PY'
import ssl, http.server
class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        body = b'LPI-TLS-DEMO-29\n'
        self.send_response(200)
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)
    def log_message(self, *args):
        pass
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.minimum_version = ssl.TLSVersion.TLSv1_3
ctx.maximum_version = ssl.TLSVersion.TLSv1_3
ctx.load_cert_chain('server.pem', 'server.key')
srv = http.server.HTTPServer(('127.0.0.1', 8443), Handler)
srv.socket = ctx.wrap_socket(srv.socket, server_side=True)
srv.serve_forever()
PY
python3 server.py >server.log 2>&1 &
server_pid=$!

Chờ server khởi động trước khi gọi curl. Nếu gặp connection refused, kiểm tra server đã chạy rồi thử lại; chưa thể kết luận lỗi chứng thư. Nếu cổng 8443 đã bận, xem lỗi trong server.log và chọn cổng khác thống nhất cho bài tập; không dừng dịch vụ không thuộc lab. Đây là server học tập tối giản dùng SSLContext của Python, không triển khai ra Internet.

Kiểm tra một lần đúng và hai lần phải bị từ chối

curl --noproxy '*' --connect-timeout 2 --max-time 3 \
  --cacert ca.pem \
  --resolve lab.example.test:8443:127.0.0.1 \
  https://lab.example.test:8443/

Kỳ vọng LPI-TLS-DEMO-29. --resolve chọn địa chỉ kết nối trong fixture, vẫn giữ hostname URL để xác minh. curl xác minh chứng thư mặc định; --cacert chỉ định CA cho lần truyền này. --noproxy '*' giữ phép thử loopback khỏi proxy môi trường.

curl --noproxy '*' --connect-timeout 2 --max-time 3 \
  --resolve lab.example.test:8443:127.0.0.1 \
  https://lab.example.test:8443/
curl --noproxy '*' --connect-timeout 2 --max-time 3 \
  --cacert ca.pem \
  --resolve wrong.example.test:8443:127.0.0.1 \
  https://wrong.example.test:8443/

Trong fixture đã chạy, lệnh đầu bị từ chối vì không tin CA; lệnh sau vì SAN không khớp tên. Cả hai trả mã 60, không nhận HTTP body. Không thêm -k để biến chúng thành thành công: khi đó bạn đã thay điều kiện đang cần kiểm chứng. Đọc chi tiết lỗi, vì mã 60 một mình chưa phân biệt hai nguyên nhân.

Thử thời hạn ngoại tuyến rồi dừng server

future=$(python3 -c 'import time; print(int(time.time())+3*86400)')
openssl verify -CAfile ca.pem -attime "$future" \
  -purpose sslserver -verify_hostname lab.example.test server.pem
kill "$server_pid"
wait "$server_pid" 2>/dev/null || true

Kỳ vọng xác minh thất bại với certificate has expired: leaf 2 ngày đã hết hạn ở thời điểm giả định, root 10 ngày còn hạn. OpenSSL mô tả -attime là thời gian dùng khi kiểm tra, không thay đồng hồ hệ thống. Nếu script bật set -e, đặt lệnh lỗi mong đợi trong if và bảo đảm cleanup vẫn chạy.

Lab đã kiểm thử TLS 1.3 loopback, CA/tên đúng, hai lỗi curl và hạn dùng ngoại tuyến. Chưa kiểm thử cảnh báo giao diện trình duyệt, thu hồi, website thật hay phiên TLS sống với chứng thư hết hạn. Kết thúc bằng hủy môi trường dùng một lần và các khóa minh họa theo quy trình lab.

Tự kiểm tra và xác nhận phục hồi

  • SAN đúng nhưng CA không được client tin có đủ không? Chưa, tên và đường dẫn tin cậy là hai điều kiện riêng.
  • Đổi URL từ tên DNS sang IP có chắc hết lỗi không? Không; danh tính IP cần SAN phù hợp, và còn có thể truy cập nhầm dịch vụ.
  • -attime có kiểm thử trình duyệt không? Không, đó là kiểm tra chứng thư ngoại tuyến bằng OpenSSL.
  • Khi nào đóng ticket? Khi đúng URL hoạt động trên môi trường người dùng cần hỗ trợ, không bỏ qua xác minh, thông tin chứng thư phù hợp và tác vụ nghiệp vụ phục hồi. Thành công của fixture chỉ xác nhận bài tập.

Bài liên quan trong bộ LPI

Tìm hiểu thêm