BẢO MẬTCĂN BẢNTUẦN 01–04
BÀI 07

Gắn domain vào website: DNS, hosting, virtual host và TLS

Câu hỏi xuyên suốt: câu lạc bộ mua thêm một tên miền và trỏ về cùng máy chủ với website cũ, nhưng mở ra lại thấy trang sai hoặc cảnh báo chứng chỉ. Vì sao trỏ đúng IP chưa chắc mở đúng website?

Thời lượng: khoảng 100 phút (giảng và thực hành xen kẽ, 7 bài tập, bài cuối làm ở nhà)

Ba lớp độc lập cùng phải đúng. Trỏ DNS đúng IP mới chỉ là lớp đầu tiên.
Ba lớp độc lập cùng phải đúng. Trỏ DNS đúng IP mới chỉ là lớp đầu tiên.
01

Mạch bài: một tên miền mới, ba lớp phải đúng

5 phút
DNSTên → IP
Web serverTên thuộc site nào
TLSChứng chỉ có tên này

Bài 6 đi theo đường dữ liệu từ trình duyệt đến máy chủ. Bài này nhìn từ phía người quản trị: khi gắn một tên miền mới vào website, bạn phải làm gì và kiểm tra ở đâu.

Tình huốngCâu lạc bộ mua tên miền clb-moi.example cho trang sự kiện. Quản trị viên thêm bản ghi A trỏ về 203.0.113.10, cùng máy chủ với clb.example. Mở tên mới: lúc thì ra trang của website cũ, lúc báo lỗi chứng chỉ, lúc báo 404. "Bản ghi A đúng rồi mà?" Vì sao vẫn lỗi?

Vì "tên miền mở được website" là kết quả của nhiều quyết định độc lập, do các bên khác nhau nắm:

LớpCâu hỏiAi quyết địnhNếu sai
DNSTên này trỏ tới IP nào?Nơi giữ bản ghi DNSNgười dùng tới sai máy hoặc không tới được
Web serverTên này thuộc website nào?Cấu hình virtual host trên hostingTrang mặc định, site khác hoặc 404
TLSServer có chứng chỉ cho tên này không?Chứng chỉ đã cấp và càiCảnh báo chứng chỉ, không vào được
Ứng dụngURL chuẩn, cookie, chuyển hướng có đúng tên mới không?Cấu hình ứng dụngBị đẩy về tên cũ, mất đăng nhập

Bài đi theo thứ tự: A ai giữ phần nào, B bản ghi DNS và TTL, C lab đọc DNS, D virtual host và lab dựng hai website trên một IP, E chứng chỉ TLS cho nhiều tên, F quy trình gắn domain và chẩn đoán. Cuối bài bạn tự trả lời được câu hỏi ở trên.

Chỉ thực hành trên tên miền của bạn, tên miền công khai dành cho tài liệu như example.com, hoặc tên .test trong máy mình. Không dùng các lệnh này để dò quét hệ thống của người khác.

02

A. Ai giữ phần nào: nhà đăng ký, DNS và hosting

10 phút
Nhà đăng kýTên miền thuộc ai
Máy chủ tênGiữ bản ghi DNS
HostingChạy website

Bài 2 đã nói: tên miền, DNS và hosting là ba thứ khác nhau. Giờ ta xem mỗi thứ nằm ở đâu và việc gì cần quyền nào.

Vai tròGiữ gìViệc thường làm ở đâyNếu kẻ xấu chiếm được
Quyền sở hữu tên, hạn gia hạn, danh sách NSGia hạn, đổi NSLấy mất tên miền, chuyển cả website và thư
(DNS)Các : A, MX, TXT…Thêm, sửa bản ghiĐổi nơi nhận lưu lượng và thư, xin được chứng chỉ
Web server, file, cơ sở dữ liệuCấu hình website, cài chứng chỉSửa nội dung, đọc dữ liệu

Ba thứ này có thể cùng một nhà cung cấp hoặc ba nơi khác nhau. Ví dụ: mua tên ở nơi A, đặt DNS ở nơi B, chạy web ở nơi C. Người có quyền vào hosting không nhất thiết có quyền DNS, và ngược lại.

Lỗi hay gặp: sửa bản ghi mà không có tác dụng

Bản ghi chỉ có hiệu lực ở nơi mà NS đang trỏ tới. Nếu tên miền mua ở nơi A, NS đã đổi sang nơi B, thì bản ghi bạn thêm ở trang quản lý của A bị bỏ qua. Trước khi sửa bản ghi, luôn kiểm tra NS: dig NS ten-mien +short.

Liên hệ bài 2Vì vậy tài khoản nhà đăng ký và nơi giữ DNS đều cần MFA, email khôi phục còn thuộc quyền, và ít người có quyền. Mất một trong hai là mất quyền điều hướng website.

BÀI TẬP 1 · 5 PHÚT

Xác định ai giữ phần nào cho tên miền của bạn

Với tên miền của bạn (hoặc của câu lạc bộ), điền bảng:

Vai tròNhà cung cấpAi có tài khoảnCó MFA chưa
Nhà đăng ký???
Máy chủ tên (DNS)???
Hosting???

Gợi ý: chạy dig NS ten-mien-cua-ban +short (hoặc nslookup -type=NS ten-mien-cua-ban trên Windows) để biết DNS đang ở đâu.

Xem đáp án

Mẫu trả lời đúng hướng: nhà đăng ký là nơi bạn trả phí gia hạn tên; máy chủ tên là tên trong kết quả lệnh NS (thường có tên nhà cung cấp, ví dụ chứa cloudflare, dnsprovider…); hosting là nơi chạy website.

Nếu NS trỏ sang nhà cung cấp khác nơi bạn mua tên, thì bản ghi phải sửa ở nơi NS trỏ tới. Ô nào "Chưa có MFA" hoặc "Không biết ai có tài khoản" là rủi ro ưu tiên cao nhất cần xử lý trước (bài 2, bài 3).

03

B. Các loại bản ghi DNS và TTL

12 phút

Mỗi trả lời một loại câu hỏi. Sáu loại cần biết:

LoạiTrả lời câu hỏiVí dụ (minh họa)Lưu ý bảo mật
ATên này ở IPv4 nào?clb.example A 203.0.113.10Trỏ nhầm IP là đưa người dùng sang máy khác
AAAATên này ở IPv6 nào?clb.example AAAA 2001:db8::10Có AAAA trỏ sai trong khi A đúng: một số người dùng vào sai máy, rất khó tái hiện
CNAMETên này là bí danh của tên khácwww.clb.example CNAME clb.exampleBản ghi còn nhưng đích đã xóa: nguy cơ chiếm quyền tên phụ (xem dưới)
MXThư gửi tới @clb.example do máy nào nhận?clb.example MX 10 mail.mailhost.exampleSửa MX là đổi nơi nhận thư, kể cả thư đặt lại mật khẩu (bài 3)
TXTVăn bản tùy ý, dùng để xác minh và khai báo chính sách"v=spf1 include:mailhost.example -all"SPF, DKIM, DMARC giúp chống giả mạo thư; thêm mã xác minh dịch vụ cũng ở đây
NSMáy chủ tên nào quản lý tên miền này?clb.example NS ns1.dnsprovider.exampleSai NS là mất hiệu lực của mọi bản ghi khác

Chú ý: .example chỉ là tên minh họa. Một vài quy tắc nên nhớ: CNAME không đặt cùng tên với bản ghi khác (không đặt được trên chính tên gốc clb.example theo chuẩn DNS, nhiều nhà cung cấp có cách xử lý riêng); một tên có thể có nhiều bản ghi A.

Đọc một dòng bản ghi

MỘT DÒNG BẢN GHI · MINH HỌA
clb.example.   300   IN   A   203.0.113.10
PhầnÝ nghĩa
clb.example.Tên (dấu chấm cuối là gốc DNS).
300: 300 giây (5 phút).
INLớp Internet, hầu như luôn là IN.
ALoại bản ghi.
203.0.113.10Giá trị. Với địa chỉ tài liệu, không phải máy để thử kết nối.

TTL: vì sao đổi bản ghi mà chưa thấy tác dụng

Resolver lưu câu trả lời trong đúng giây. Bạn sửa bản ghi xong, nơi nào còn cache cũ vẫn trả giá trị cũ cho tới khi hết hạn. Cái người ta hay gọi là "chờ DNS lan truyền" phần lớn là chờ cache hết hạn, không phải bản ghi đang "đi" khắp nơi.

  1. Trước ngày chuyển, hạ TTL (ví dụ 300) và chờ ít nhất bằng TTL cũ.
  2. Đổi bản ghi.
  3. Kiểm tra bằng dig; hỏi thẳng máy chủ tên để biết giá trị gốc đã đúng chưa.
  4. Ổn định rồi mới tăng TTL lại.

Bản ghi "bị bỏ quên" là điểm yếu

Chiếm quyền tên phụ ()Câu lạc bộ từng dùng một dịch vụ bên ngoài cho trang thử nghiệm: demo.clb.example CNAME clb-demo.apphost.example. Sau đó dịch vụ bị xóa nhưng bản ghi CNAME vẫn còn. Người khác đăng ký đúng tên clb-demo ở nhà cung cấp đó và nay nội dung của họ hiện trên demo.clb.example, một tên thuộc câu lạc bộ. Họ có thể dùng nó để lừa thành viên. Cách phòng: xóa bản ghi cùng lúc xóa dịch vụ, và rà soát bản ghi định kỳ.

BÀI TẬP 2 · 5 PHÚT

Đọc một vùng DNS

Cho các bản ghi minh họa:

MINH HỌA
clb.example.       300   IN  A      203.0.113.10
www.clb.example.   300   IN  CNAME  clb.example.
clb.example.       3600  IN  MX     10 mail.mailhost.example.
clb.example.       3600  IN  TXT    "v=spf1 include:mailhost.example -all"
demo.clb.example.  300   IN  CNAME  clb-demo.apphost.example.
  1. Thư gửi tới [email protected] đi tới đâu?
  2. www.clb.example trỏ vào đâu?
  3. Bản ghi nào bạn muốn xác minh còn dùng hay không, và vì sao?
  4. Muốn đổi máy chủ sang IP mới, bạn đổi bản ghi nào và nên làm gì với TTL trước?
Xem đáp án
  1. Tới máy mail.mailhost.example theo bản ghi MX. Nếu MX bị sửa, thư (kể cả thư đặt lại mật khẩu) đi chỗ khác.
  2. Là bí danh của clb.example, nên đi theo bản ghi A của tên gốc: đổi A là cả hai tên cùng đổi.
  3. demo.clb.example: nó trỏ tới dịch vụ ngoài. Phải kiểm tra dịch vụ clb-demo còn tồn tại và còn thuộc quyền của câu lạc bộ không; nếu không còn dùng thì xóa bản ghi (nguy cơ chiếm quyền tên phụ).
  4. Đổi bản ghi A của clb.example (CNAME của www tự theo). TTL hiện là 300 giây, đã thấp nên đổi được ngay. Nếu TTL đang là 86400 (một ngày), phải hạ xuống 300 trước ít nhất một ngày rồi mới đổi, sau khi ổn định thì nâng lại.
04

C. Lab 1: đọc DNS bằng dig và nslookup

15 phút

Lab này chỉ gửi truy vấn DNS thông thường, giống mọi trình duyệt vẫn làm. Ta dùng example.com làm tên mẫu vì đây là tên miền công khai dành cho tài liệu.

  1. Mở Terminal. Hỏi từng loại bản ghi của example.com (tên miền công khai dành cho tài liệu):
TERMINAL
dig example.com A +noall +answer
dig example.com AAAA +noall +answer
dig example.com MX +noall +answer
dig example.com TXT +noall +answer
dig example.com NS +noall +answer
PhầnÝ nghĩa
example.comTên cần hỏi. Thay bằng tên miền của bạn khi làm bài tập 3.
A, MX, TXT…Loại bản ghi cần hỏi.
+noall +answerChỉ in phần trả lời, bỏ phần thông tin phụ cho dễ đọc.
  1. Mỗi dòng trả lời có năm cột: tên · TTL còn lại (giây) · IN · loại · giá trị. Chạy lại lệnh A hai lần cách nhau vài giây và so cột TTL.
  2. Lấy danh sách máy chủ tên rồi hỏi thẳng máy chủ tên, bỏ qua cache của resolver:
TERMINAL
dig example.com NS +short
dig example.com A +noall +answer @TEN-MAY-CHU-TEN

Thay TEN-MAY-CHU-TEN bằng một tên ở kết quả lệnh trước. Câu trả lời trực tiếp luôn có TTL đầy đủ (không đếm ngược), vì đây là nguồn gốc, không phải bản lưu.

Nếu báo dig: command not found trên Linux, cài gói dnsutils (Debian/Ubuntu) hoặc bind-utils (Fedora).

  1. Mở Command Prompt hoặc PowerShell. Hỏi từng loại bản ghi của example.com (tên miền công khai dành cho tài liệu):
COMMAND PROMPT / POWERSHELL
nslookup -type=A example.com
nslookup -type=AAAA example.com
nslookup -type=MX example.com
nslookup -type=TXT example.com
nslookup -type=NS example.com

-type= chọn loại bản ghi. Dòng Non-authoritative answer nghĩa là câu trả lời đến từ cache của resolver, không phải từ máy chủ tên gốc.

  1. nslookup không hiện TTL. Muốn xem TTL, dùng PowerShell:
POWERSHELL
Resolve-DnsName example.com -Type A | Select-Object Name, Type, TTL, IPAddress
  1. Hỏi thẳng một máy chủ tên (lấy tên từ kết quả lệnh NS):
COMMAND PROMPT / POWERSHELL
nslookup -type=A example.com TEN-MAY-CHU-TEN
  1. Mở Terminal. Hỏi từng loại bản ghi của example.com (tên miền công khai dành cho tài liệu):
TERMINAL
dig example.com A +noall +answer
dig example.com AAAA +noall +answer
dig example.com MX +noall +answer
dig example.com TXT +noall +answer
dig example.com NS +noall +answer
PhầnÝ nghĩa
example.comTên cần hỏi. Thay bằng tên miền của bạn khi làm bài tập 3.
A, MX, TXT…Loại bản ghi cần hỏi.
+noall +answerChỉ in phần trả lời, bỏ phần thông tin phụ cho dễ đọc.
  1. Mỗi dòng trả lời có năm cột: tên · TTL còn lại (giây) · IN · loại · giá trị. Chạy lại lệnh A hai lần cách nhau vài giây và so cột TTL.
  2. Lấy danh sách máy chủ tên rồi hỏi thẳng máy chủ tên, bỏ qua cache của resolver:
TERMINAL
dig example.com NS +short
dig example.com A +noall +answer @TEN-MAY-CHU-TEN

Thay TEN-MAY-CHU-TEN bằng một tên ở kết quả lệnh trước. Câu trả lời trực tiếp luôn có TTL đầy đủ (không đếm ngược), vì đây là nguồn gốc, không phải bản lưu.

Nếu báo dig: command not found trên Linux, cài gói dnsutils (Debian/Ubuntu) hoặc bind-utils (Fedora).

Đọc kết quả

Với example.com, bạn có thể gặp hai bản ghi đáng chú ý, vì chúng cho thấy cách khai báo chính sách bằng DNS:

  • MX 0 .: dấu chấm đơn nghĩa là tên miền này cố ý khai báo không nhận thư.
  • TXT "v=spf1 -all": chính sách SPF nói không máy nào được gửi thư mang tên miền này. Tên miền không dùng email nên khóa như vậy là thói quen tốt chống giả mạo.

Số bản ghi, IP và TTL của bạn sẽ khác vì nhà cung cấp có thể thay đổi bất cứ lúc nào. Mục đích là tập đọc từng cột, không phải ghi nhớ số.

BÀI TẬP 3 · 10 PHÚT

Lập bảng bản ghi của tên miền bạn quản lý

Chạy năm lệnh (A, AAAA, MX, TXT, NS) cho tên miền của bạn và cho cả www.ten-mien-cua-ban. Lập bảng:

TênLoạiGiá trịTTLCòn dùng? (Có / Không rõ / Nên xóa)
?????

Sau đó trả lời: bản ghi nào trỏ tới dịch vụ bên ngoài? Có bản ghi nào bạn không nhận ra không?

Xem đáp án

Các bản ghi hay gặp: A/AAAA (website), MX (thư), TXT (SPF, DKIM, DMARC, mã xác minh), NS. Với mỗi bản ghi, câu hỏi là "ai đặt, để làm gì, còn dùng không".

Bản ghi trỏ tới dịch vụ ngoài (CNAME, MX, TXT include:) cần kiểm tra dịch vụ đó còn tồn tại và còn thuộc quyền của bạn. Bản ghi "Không rõ" chưa nên xóa ngay vì có thể đang chạy thư hoặc dịch vụ khác: hỏi người đã đặt, ghi lại, rồi quyết định. Ghi chú trong bảng này là bước đầu của quy trình rà soát DNS định kỳ.

05

D. Virtual host: một IP, nhiều website

10 phút
Yêu cầuHost: clb-moi.example
Một web server203.0.113.10:443
Site đúngChọn theo tên

Sau khi DNS đưa yêu cầu đến 203.0.113.10, ta mới tới một câu hỏi khác: máy này chạy website của cả clb.example lẫn clb-moi.example, vậy phục vụ trang nào? Câu trả lời nằm trong chính yêu cầu HTTP:

YÊU CẦU HTTP · MINH HỌA
GET / HTTP/1.1
Host: clb-moi.example

Dòng Host là tên mà trình duyệt đã gõ. Web server đọc nó và chọn website tương ứng. Cách làm này gọi là . Trong cấu hình web server, tên được khai ở các chỉ thị như server_name (nginx) hoặc ServerName (Apache).

CẤU HÌNH NGINX · MINH HỌA CHO ĐỌC HIỂU, KHÔNG CHÉP VÀO SERVER ĐANG CHẠY
server { listen 80 default_server; return 444; }
server { listen 80; server_name clb.example www.clb.example; root /var/www/clb; }
server { listen 80; server_name clb-moi.example; root /var/www/su-kien; }
  • Dòng 2 và 3: mỗi website khai tên của mình.
  • Dòng 1: default_server là website phục vụ khi không tên nào khớp. Ở đây cho đóng kết nối (return 444 là cách riêng của nginx).

Hệ quả cho bài toán mở đầu

Nếu bạn trỏ DNS của clb-moi.example về máy chủ trước khi khai tên đó trong web server, yêu cầu sẽ rơi vào site mặc định. Nếu site mặc định chính là website cũ của câu lạc bộ (nhiều hosting đặt site đầu tiên làm mặc định), người dùng thấy trang cũ dưới tên mới. Đó là triệu chứng "trỏ đúng IP mà ra sai website".

Rủi ro bảo mật của site mặc địnhAi cũng gửi được tên Host tùy ý, hoặc truy cập thẳng bằng IP. Nếu site mặc định là bản staging, trang quản trị hay thư mục sao lưu, nó bị lộ cho người chỉ cần biết IP. Hãy đặt site mặc định là trang trống, 404 hoặc đóng kết nối.
06

D2. Lab 2: hai website trên cùng một IP

15 phút
curlHost: clb.test
vhost.py127.0.0.1:8000

Ta dựng đúng cơ chế ở phần D bằng vài dòng Python, trong máy mình, không ra mạng. Dùng tên .test: đây là đuôi tên miền dành riêng cho thử nghiệm (RFC 2606), sẽ không trùng với website thật.

Bước 1. Tạo server

  1. Tạo thư mục trống vhost-lab, tạo file vhost.py với nội dung dưới đây:
NỘI DUNG vhost.py
from http.server import BaseHTTPRequestHandler, HTTPServer

SITES = {
    "clb.test": "<h1>Website CLB</h1>",
    "clb-moi.test": "<h1>Website su kien</h1>",
}


class VirtualHost(BaseHTTPRequestHandler):
    def do_GET(self):
        host = (self.headers.get("Host") or "").split(":")[0]
        page = SITES.get(host)
        status = 200 if page else 404
        body = (page or "<h1>Khong co website cho ten nay</h1>").encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)

    def log_message(self, fmt, *args):
        print("Host=" + str(self.headers.get("Host")), fmt % args, flush=True)


HTTPServer(("127.0.0.1", 8000), VirtualHost).serve_forever()
  1. Mở terminal đúng trong thư mục đó và chạy, giữ cửa sổ này mở:
macOS / LINUX
python3 vhost.py
WINDOWS POWERSHELL
py vhost.py

Server chỉ lắng nghe 127.0.0.1:8000 nên chỉ máy này truy cập được. Nếu báo "Address already in use", port 8000 đang bị dùng (có thể do lab bài 6 chưa tắt): dừng nó bằng Ctrl+C hoặc đổi số port trong file.

Bước 2. Gửi bốn yêu cầu

Mở terminal thứ hai. Trên Windows PowerShell dùng curl.exe thay cho curl.

TERMINAL
curl -i -H "Host: clb.test" http://127.0.0.1:8000/
curl -i -H "Host: clb-moi.test" http://127.0.0.1:8000/
curl -i -H "Host: la.test" http://127.0.0.1:8000/
curl -i http://127.0.0.1:8000/
PhầnÝ nghĩa
-iIn cả dòng trạng thái và header của phản hồi.
-H "Host: clb.test"Tự đặt dòng Host trong yêu cầu. IP đích vẫn là 127.0.0.1.
dòng cuối, không có -Hcurl dùng Host mặc định là địa chỉ đã gõ (127.0.0.1:8000), giống truy cập thẳng bằng IP.

Một cách khác, sát với thực tế hơn: để curl tự tạo Host từ tên trong URL, và chỉ "giả lập DNS" bằng một dòng gán tên với IP:

TERMINAL
curl --resolve clb.test:8000:127.0.0.1 http://clb.test:8000/

--resolve nói với curl "tên này có IP kia", thay vai trò DNS mà không sửa file hệ thống. Lúc này curl gửi Host: clb.test:8000; script đã cắt phần port nên vẫn nhận ra tên.

Kết quả mong đợi

Yêu cầuTrạng tháiNội dung
Host: clb.test200 OKWebsite CLB
Host: clb-moi.test200 OKWebsite su kien
Host: la.test404Khong co website cho ten nay
Không đặt Host (truy cập bằng IP)404Khong co website cho ten nay

Cả bốn yêu cầu đều tới cùng một IP và port, chỉ khác dòng Host mà nhận về nội dung khác nhau. Terminal của server in dòng log kèm Host=, nên bạn thấy server đã nhận tên nào. Xong thì dừng server bằng Ctrl+C.

BÀI TẬP 4 · 10 PHÚT

Quan sát và sửa

  1. Điều gì chứng minh rằng DNS không phải thứ chọn website ở lab này?
  2. Nếu la.test được trả về website CLB thay vì 404, rủi ro là gì? Sửa script thế nào để tên lạ không nhận được nội dung nào cả?
Xem đáp án
  1. Cả bốn yêu cầu đều tới cùng 127.0.0.1:8000 và hoàn toàn không dùng DNS (ta tự đặt Host hoặc dùng --resolve). Server chỉ nhìn dòng Host để chọn nội dung. DNS chỉ giúp người dùng biết IP để gửi yêu cầu.
  2. Rủi ro: tên lạ hoặc truy cập bằng IP cũng thấy website thật; nếu thay website CLB bằng trang quản trị hay bản staging thì chúng bị lộ. Sửa: đổi trang mặc định thành nội dung rỗng, ví dụ body = (page or "").encode("utf-8"), giữ mã 404; hoặc đóng kết nối như nginx với return 444.
07

E. TLS cho nhiều tên miền

12 phút

Lớp cuối là , từ bài 6. Bài 6 nói chứng chỉ gắn một tên với khóa công khai. Ở đây ta xem điều đó gây ra gì khi một máy phục vụ nhiều tên.

Chứng chỉ liệt kê rõ những tên nó phủ

Trong có danh sách tên gọi là Subject Alternative Name (SAN). Trình duyệt so tên đang truy cập với danh sách đó. Cấp cho clb.example không tự phủ clb-moi.example: vào tên mới sẽ báo "name mismatch" dù DNS và virtual host đã đúng. Có hai cách phủ nhiều tên:

  • Một chứng chỉ nhiều tên: liệt kê từng tên (clb.example, www.clb.example, clb-moi.example).
  • Chứng chỉ wildcard: *.clb.example phủ api.clb.example hay www.clb.example (một cấp), nhưng không phủ clb.example và không phủ a.b.clb.example. Khóa của wildcard dùng cho nhiều tên, nên lộ khóa là lộ cả nhóm tên đó.

Server chọn chứng chỉ nào khi nhiều tên dùng chung IP?

Việc chọn chứng chỉ diễn ra trước khi có HTTP, nên server chưa đọc được dòng Host. Vì vậy client nói tên ngay trong bắt tay TLS, qua trường . Bạn đã thấy trường này ở Lab 2 của bài 6 (Client Hello có Server Name). Server dùng SNI để chọn chứng chỉ, rồi sau khi giải mã mới dùng Host để chọn website: hai bước, hai lần nhìn tên.

Xin chứng chỉ cho tên mới

chỉ cấp khi chứng minh được bạn kiểm soát tên đó, ví dụ bằng cách đặt một file ở địa chỉ web của tên đó, hoặc thêm một bản ghi TXT. Hai hệ quả:

  • Với cách xác minh qua web, DNS phải trỏ về máy chủ và virtual host đã chạy trước, nếu không CA không tới được file xác minh.
  • Ai điều khiển được DNS thì xin được chứng chỉ cho tên đó. Đây là thêm một lý do để bảo vệ tài khoản DNS (phần A).

Chứng chỉ thường chỉ có hạn vài tháng và nhiều hệ thống tự gia hạn. Tự động không có nghĩa là không cần theo dõi: ghi hạn vào lịch và kiểm tra khi gia hạn lỗi.

Lab 3. Xem chứng chỉ thật

Bạn chỉ đọc chứng chỉ mà server công khai gửi cho mọi người, như trình duyệt vẫn làm.

  1. Lấy chứng chỉ mà server trả về khi ta nói rõ tên cần vào (-servername chính là SNI):
TERMINAL
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
  1. Xem danh sách tên mà chứng chỉ này phủ (Subject Alternative Name):
TERMINAL
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
KẾT QUẢ MINH HỌA · THỰC TẾ SẼ KHÁC
subject= /CN=example.com
issuer= /C=US/O=Ten-to-chuc-cap-chung-chi/CN=Ten-CA
notBefore=Sep 26 22:49:11 2026 GMT
notAfter=Dec 25 22:56:35 2026 GMT

            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:*.example.com
PhầnÝ nghĩa
subjectTên chính mà chứng chỉ được cấp cho.
issuerTổ chức cấp (CA) đã ký.
notAfterNgày hết hạn. Qua ngày này trình duyệt cảnh báo.
DNS:…Các tên chứng chỉ phủ. Tên bạn truy cập phải khớp một trong số này.

Windows không có sẵn openssl, nhưng trình duyệt cho cùng thông tin:

  1. Mở https://example.com trong Chrome hoặc Edge.
  2. Bấm biểu tượng bên trái thanh địa chỉ → Connection is secure → Certificate is valid.
  3. Mở thẻ Details, chọn mục Subject Alternative Name để xem danh sách tên, và Validity để xem ngày hết hạn.

Firefox: bấm ổ khóa → Connection secure → More information → View Certificate. Tên các mục có thể khác chút theo phiên bản.

  1. Lấy chứng chỉ mà server trả về khi ta nói rõ tên cần vào (-servername chính là SNI):
TERMINAL
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
  1. Xem danh sách tên mà chứng chỉ này phủ (Subject Alternative Name):
TERMINAL
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
KẾT QUẢ MINH HỌA · THỰC TẾ SẼ KHÁC
subject= /CN=example.com
issuer= /C=US/O=Ten-to-chuc-cap-chung-chi/CN=Ten-CA
notBefore=Sep 26 22:49:11 2026 GMT
notAfter=Dec 25 22:56:35 2026 GMT

            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:*.example.com
PhầnÝ nghĩa
subjectTên chính mà chứng chỉ được cấp cho.
issuerTổ chức cấp (CA) đã ký.
notAfterNgày hết hạn. Qua ngày này trình duyệt cảnh báo.
DNS:…Các tên chứng chỉ phủ. Tên bạn truy cập phải khớp một trong số này.

BÀI TẬP 5 · 8 PHÚT

Chứng chỉ này có hợp lệ cho tên đó không?

Một chứng chỉ có SAN là clb.example, www.clb.example. Trình duyệt có chấp nhận chứng chỉ này cho từng tên sau không?

  1. https://clb.example
  2. https://www.clb.example
  3. https://clb-moi.example
  4. https://api.clb.example

Rồi xét chứng chỉ khác chỉ có SAN *.clb.example: tên nào trong bốn tên trên được chấp nhận?

Xem đáp án

Chứng chỉ thứ nhất: (1) có, (2) có, (3) không, (4) không, vì danh sách không có tên đó.

Chứng chỉ wildcard *.clb.example: chỉ (2) và (4) được. Tên gốc (1) không được phủ (nên nhiều chứng chỉ thường liệt kê cả clb.example và *.clb.example), còn (3) là tên miền khác hẳn.

08

F. Quy trình gắn domain mới và chẩn đoán

15 phút
Web serverKhai tên mới
DNSTrỏ tên về máy
Chứng chỉGồm tên mới
Chuyển hướngChốt tên chuẩn

Từ các phần trên rút ra thứ tự làm việc an toàn. Thứ tự này không ngẫu nhiên: mỗi bước đặt nền cho bước sau.

  1. Xác nhận quyền. Tên miền thuộc ai, ai có quyền DNS và hosting, đã bật MFA chưa (phần A).
  2. Làm trên staging trước nếu là website đang chạy thật; ghi lại cấu hình cũ để quay lại.
  3. Khai tên mới trong web server (virtual host) và đặt site mặc định an toàn. Làm bước này trước DNS để người dùng không rơi vào site sai.
  4. Thêm bản ghi DNS (A/AAAA hoặc CNAME) với TTL thấp. Kiểm tra bằng dig cả ở resolver thường lẫn hỏi thẳng máy chủ tên.
  5. Cấp chứng chỉ gồm tên mới, bật chuyển hướng HTTP sang HTTPS.
  6. Chốt tên chuẩn. Chọn một tên chính (ví dụ có hoặc không có www), chuyển hướng các tên còn lại về đó; chỉnh URL chuẩn và phạm vi cookie trong ứng dụng.
  7. Ghi lại và dọn dẹp. Ghi bản ghi đã thêm, ngày hết hạn tên miền và chứng chỉ, người phụ trách; nâng TTL; xóa bản ghi tạm.

Khi mở tên mới mà vẫn lỗi: đọc triệu chứng để chọn lớp

Triệu chứngLớp nghi ngờKiểm tra
dig không ra hoặc ra IP cũDNSNS có đúng nơi sửa không; TTL; hỏi thẳng máy chủ tên
IP đúng nhưng ra website khác hoặc trang mặc địnhVirtual hostcurl -H "Host: …"; kiểm tra tên trong server_name
IP đúng, server trả 404 hoặc 403Virtual host, đường dẫn, quyềnLog truy cập và log lỗi của server
Cảnh báo "name mismatch"TLSXem SAN của chứng chỉ có tên mới không
Vào được nhưng bị đẩy về tên cũ, mất đăng nhậpỨng dụngHeader Location của chuyển hướng; Domain trong Set-Cookie
Chỉ một số người bị lỗiCache DNS hoặc IPv6Khác resolver; dig AAAA có trỏ sai không

BÀI TẬP 6 · 8 PHÚT

Chẩn đoán năm tình huống

Với mỗi tình huống, nêu lớp nghi ngờ nhất và việc kiểm tra đầu tiên:

  1. Bạn sửa bản ghi A ở trang của nhà đăng ký, nhưng dig vẫn ra IP cũ sau nhiều giờ dù TTL là 300.
  2. dig ra IP đúng; mở trình duyệt thấy đúng website cũ của câu lạc bộ thay vì trang sự kiện.
  3. IP đúng, trang sự kiện hiện ra nhưng trình duyệt báo "name mismatch".
  4. Mọi thứ chạy tốt, nhưng bấm đăng nhập trên tên mới thì bị đưa sang clb.example và yêu cầu đăng nhập lại.
  5. Một thành viên ở nhà vào được, một thành viên khác ở trường không vào được, cùng tên và cùng IP v4.
Xem đáp án
  1. NS: nhiều khả năng DNS đang do nơi khác giữ. Chạy dig NS rồi sửa ở nơi NS trỏ tới.
  2. Virtual host: tên mới chưa khai trong web server nên rơi vào site mặc định. Kiểm tra bằng curl -H "Host: clb-moi.example" tới IP đó.
  3. TLS: chứng chỉ chưa có tên mới. Xem SAN, cấp lại chứng chỉ gồm tên mới.
  4. Ứng dụng: URL chuẩn hoặc cookie đang gắn với tên cũ. Xem header Location và Set-Cookie.
  5. DNS (cache hoặc IPv6): hai người dùng resolver khác nhau, hoặc một bên có bản ghi AAAA trỏ sai. So sánh dig A và dig AAAA qua hai resolver.

BÀI TẬP 7 · Về nhà, 25 PHÚT

Vẽ quy trình gắn một tên miền mới và trả lời câu hỏi mở đầu

Chọn tên miền của bạn (hoặc tên giả như clb-moi.example). Làm ba việc, ghi vào thư mục notes/ của bạn:

  1. Vẽ sơ đồ bốn lớp: nhà đăng ký → máy chủ tên (DNS) → web server → TLS → ứng dụng. Ghi ai giữ từng lớp và kiểm tra bằng lệnh nào.
  2. Viết danh sách bản ghi hiện có (từ bài tập 3) kèm trạng thái, đánh dấu bản ghi cần rà soát.
  3. Trả lời bằng năm câu văn của riêng bạn: "Vì sao domain mới trỏ cùng IP chưa chắc mở đúng website?" Dùng đủ ba lớp DNS, virtual host và TLS.

Không ghi mật khẩu, mã khôi phục hay token API vào ghi chú.

Xem đáp án

Mẫu trả lời ngắn: "Bản ghi A chỉ cho trình duyệt biết gửi yêu cầu đến máy nào. Máy đó có thể chạy nhiều website, nên web server phải khai tên mới trong virtual host, nếu không yêu cầu rơi vào site mặc định. Kể cả khi đúng site, kết nối HTTPS cần chứng chỉ có tên mới nên chưa cấp thì trình duyệt báo lỗi. Cuối cùng ứng dụng còn có thể chuyển hướng hoặc gắn cookie theo tên cũ. Ba lớp này do các bên khác nhau cấu hình, nên đúng một lớp chưa chứng tỏ đúng cả quy trình."

Mốc đạt: sơ đồ nêu đúng ai giữ lớp nào; danh sách bản ghi có ít nhất một bản ghi được đánh dấu để xác minh; câu trả lời phân biệt được DNS, virtual host và TLS.

Tóm tắt

Tự kiểm tra · 5 câu có giải thích +
1. Đã đặt bản ghi A cho tên mới trỏ về cùng IP với website cũ, nhưng mở ra thấy website cũ. Lớp nào nhiều khả năng chưa cấu hình?
2. Bạn sửa bản ghi ở trang nhà đăng ký nhưng dig vẫn ra giá trị cũ nhiều giờ sau, TTL chỉ 300. Cần kiểm tra gì trước?
3. Bản ghi demo.clb.example CNAME tới một dịch vụ ngoài đã bị xóa. Rủi ro chính là gì?
4. Chứng chỉ chỉ có SAN là *.clb.example. Tên nào được phủ?
5. Vì sao site mặc định của web server nên là trang trống hoặc 404?

Ghi chú cá nhân +

Tự lưu trên trình duyệt. Không nhập thông tin bí mật.

Có thể bỏ đánh dấu bất cứ lúc nào.
Tài liệu tham khảo chính thức

Tra thuật ngữ