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à)
Mạch bài: một tên miền mới, ba lớp phải đúng
5 phútBà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.
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ớp | Câu hỏi | Ai quyết định | Nếu sai |
|---|---|---|---|
| DNS | Tên này trỏ tới IP nào? | Nơi giữ bản ghi DNS | Người dùng tới sai máy hoặc không tới được |
| Web server | Tên này thuộc website nào? | Cấu hình virtual host trên hosting | Trang mặc định, site khác hoặc 404 |
| TLS | Server có chứng chỉ cho tên này không? | Chứng chỉ đã cấp và cài | Cảnh báo chứng chỉ, không vào được |
| Ứng dụng | URL chuẩn, cookie, chuyển hướng có đúng tên mới không? | Cấu hình ứng dụng | Bị đẩ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.
A. Ai giữ phần nào: nhà đăng ký, DNS và hosting
10 phútBà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 ở đây | Nếu kẻ xấu chiếm được |
|---|---|---|---|
| Quyền sở hữu tên, hạn gia hạn, danh sách NS | Gia hạn, đổi NS | Lấ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ệu | Cấ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.
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ấp | Ai có tài khoản | Có 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).
B. Các loại bản ghi DNS và TTL
12 phútMỗi trả lời một loại câu hỏi. Sáu loại cần biết:
| Loại | Trả lời câu hỏi | Ví dụ (minh họa) | Lưu ý bảo mật |
|---|---|---|---|
| A | Tên này ở IPv4 nào? | clb.example A 203.0.113.10 | Trỏ nhầm IP là đưa người dùng sang máy khác |
| AAAA | Tên này ở IPv6 nào? | clb.example AAAA 2001:db8::10 | Có 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 |
| CNAME | Tên này là bí danh của tên khác | www.clb.example CNAME clb.example | Bản ghi còn nhưng đích đã xóa: nguy cơ chiếm quyền tên phụ (xem dưới) |
| MX | Thư gửi tới @clb.example do máy nào nhận? | clb.example MX 10 mail.mailhost.example | Sửa MX là đổi nơi nhận thư, kể cả thư đặt lại mật khẩu (bài 3) |
| TXT | Vă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 |
| NS | Máy chủ tên nào quản lý tên miền này? | clb.example NS ns1.dnsprovider.example | Sai 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
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). |
IN | Lớp Internet, hầu như luôn là IN. |
A | Loại bản ghi. |
203.0.113.10 | Giá 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.
- Trước ngày chuyển, hạ TTL (ví dụ 300) và chờ ít nhất bằng TTL cũ.
- Đổi bản ghi.
- Kiểm tra bằng
dig; hỏi thẳng máy chủ tên để biết giá trị gốc đã đúng chưa. - Ổn định rồi mới tăng TTL lại.
Bản ghi "bị bỏ quên" là điểm yếu
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:
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.- Thư gửi tới
[email protected]đi tới đâu? www.clb.exampletrỏ vào đâu?- Bản ghi nào bạn muốn xác minh còn dùng hay không, và vì sao?
- 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
- Tới máy
mail.mailhost.exampletheo 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. - 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. demo.clb.example: nó trỏ tới dịch vụ ngoài. Phải kiểm tra dịch vụclb-democò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ụ).- Đổ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.
C. Lab 1: đọc DNS bằng dig và nslookup
15 phútLab 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.
- 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):
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.com | Tê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 +answer | Chỉ in phần trả lời, bỏ phần thông tin phụ cho dễ đọc. |
- 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
Ahai lần cách nhau vài giây và so cột TTL. - 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:
dig example.com NS +short
dig example.com A +noall +answer @TEN-MAY-CHU-TENThay 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).
- 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):
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.
nslookupkhông hiện TTL. Muốn xem TTL, dùng PowerShell:
Resolve-DnsName example.com -Type A | Select-Object Name, Type, TTL, IPAddress- Hỏi thẳng một máy chủ tên (lấy tên từ kết quả lệnh
NS):
nslookup -type=A example.com TEN-MAY-CHU-TEN- 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):
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.com | Tê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 +answer | Chỉ in phần trả lời, bỏ phần thông tin phụ cho dễ đọc. |
- 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
Ahai lần cách nhau vài giây và so cột TTL. - 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:
dig example.com NS +short
dig example.com A +noall +answer @TEN-MAY-CHU-TENThay 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ên | Loại | Giá trị | TTL | Cò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ỳ.
D. Virtual host: một IP, nhiều website
10 phútSau 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:
GET / HTTP/1.1
Host: clb-moi.exampleDò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).
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_serverlà website phục vụ khi không tên nào khớp. Ở đây cho đóng kết nối (return 444là 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".
D2. Lab 2: hai website trên cùng một IP
15 phútTa 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
- Tạo thư mục trống
vhost-lab, tạo filevhost.pyvới nội dung dưới đây:
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()- Mở terminal đúng trong thư mục đó và chạy, giữ cửa sổ này mở:
python3 vhost.pypy vhost.pyServer 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.
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 |
|---|---|
-i | In 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ó -H | curl 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:
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ầu | Trạng thái | Nội dung |
|---|---|---|
| Host: clb.test | 200 OK | Website CLB |
| Host: clb-moi.test | 200 OK | Website su kien |
| Host: la.test | 404 | Khong co website cho ten nay |
| Không đặt Host (truy cập bằng IP) | 404 | Khong 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
- Điều gì chứng minh rằng DNS không phải thứ chọn website ở lab này?
- 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
- Cả bốn yêu cầu đều tới cùng
127.0.0.1:8000và 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. - 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ớireturn 444.
E. TLS cho nhiều tên miền
12 phútLớ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.examplephủapi.clb.examplehaywww.clb.example(một cấp), nhưng không phủclb.examplevà 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.
- Lấy chứng chỉ mà server trả về khi ta nói rõ tên cần vào (
-servernamechính là SNI):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates- Xem danh sách tên mà chứng chỉ này phủ (Subject Alternative Name):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"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 |
|---|---|
subject | Tên chính mà chứng chỉ được cấp cho. |
issuer | Tổ chức cấp (CA) đã ký. |
notAfter | Ngà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:
- Mở
https://example.comtrong Chrome hoặc Edge. - Bấm biểu tượng bên trái thanh địa chỉ → Connection is secure → Certificate is valid.
- 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.
- Lấy chứng chỉ mà server trả về khi ta nói rõ tên cần vào (
-servernamechính là SNI):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates- Xem danh sách tên mà chứng chỉ này phủ (Subject Alternative Name):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"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 |
|---|---|
subject | Tên chính mà chứng chỉ được cấp cho. |
issuer | Tổ chức cấp (CA) đã ký. |
notAfter | Ngà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?
https://clb.examplehttps://www.clb.examplehttps://clb-moi.examplehttps://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.
F. Quy trình gắn domain mới và chẩn đoán
15 phútTừ 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.
- 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).
- 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.
- 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.
- Thêm bản ghi DNS (A/AAAA hoặc CNAME) với TTL thấp. Kiểm tra bằng
digcả ở resolver thường lẫn hỏi thẳng máy chủ tên. - Cấp chứng chỉ gồm tên mới, bật chuyển hướng HTTP sang HTTPS.
- 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. - 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ứng | Lớp nghi ngờ | Kiểm tra |
|---|---|---|
dig không ra hoặc ra IP cũ | DNS | NS 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 định | Virtual host | curl -H "Host: …"; kiểm tra tên trong server_name |
| IP đúng, server trả 404 hoặc 403 | Virtual host, đường dẫn, quyền | Log truy cập và log lỗi của server |
| Cảnh báo "name mismatch" | TLS | Xem 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ụng | Header Location của chuyển hướng; Domain trong Set-Cookie |
| Chỉ một số người bị lỗi | Cache DNS hoặc IPv6 | Khá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:
- Bạn sửa bản ghi A ở trang của nhà đăng ký, nhưng
digvẫn ra IP cũ sau nhiều giờ dù TTL là 300. digra 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.- IP đúng, trang sự kiện hiện ra nhưng trình duyệt báo "name mismatch".
- 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.examplevà yêu cầu đăng nhập lại. - 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
- NS: nhiều khả năng DNS đang do nơi khác giữ. Chạy
dig NSrồi sửa ở nơi NS trỏ tới. - 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 đó. - 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.
- Ứng dụng: URL chuẩn hoặc cookie đang gắn với tên cũ. Xem header
LocationvàSet-Cookie. - 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 Avàdig AAAAqua 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:
- 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.
- 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.
- 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
- Mở được website cần nhiều lớp đúng cùng lúc: DNS, virtual host, TLS, rồi ứng dụng. Trỏ A đúng chỉ là lớp đầu.
- , và là ba nơi quyền khác nhau; bản ghi chỉ có hiệu lực ở nơi NS đang trỏ tới. Tài khoản ở các nơi đó cần MFA.
- Sáu loại bản ghi cần biết: A, AAAA, CNAME, MX, TXT, NS. quyết định thời gian cache cũ còn tồn tại sau khi đổi bản ghi.
- Bản ghi bị bỏ quên có thể dẫn tới ; xóa bản ghi cùng lúc xóa dịch vụ.
- chọn website theo dòng Host. Site mặc định nên là trang trống, không phải site nội bộ.
- Chứng chỉ liệt kê tên nó phủ; giúp server chọn đúng chứng chỉ; chỉ cấp khi chứng minh được quyền với tên.
- Thứ tự an toàn: khai tên trong web server, rồi DNS, rồi chứng chỉ, rồi chuyển hướng và cấu hình ứng dụng. Chẩn đoán theo lớp.
Tự kiểm tra · 5 câu có giải thích +
Ghi chú cá nhân +
Tự lưu trên trình duyệt. Không nhập thông tin bí mật.