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

Security Essentials 022.3: Mã hóa Email

Security Essentials 022.3: Mã hóa Email

Học mã hóa email với OpenPGP và S/MIME: xác minh khóa, cấu hình Thunderbird theo tài liệu hãng, thực hành ký, giải mã và phát hiện dữ liệu bị sửa.

Một email báo “đã mã hóa” vẫn có thể dùng khóa chưa được xác nhận của người nhận. Một thư đọc được bình thường có thể mang chữ ký hợp lệ nhưng không được giữ bí mật. Help Desk cần tách hai câu hỏi: ai đọc được nội dung, và bằng chứng nào liên kết nội dung với khóa của người gửi?

Kết quả học tập và phạm vi

Bạn sẽ phân biệt ký với mã hóa, quản lý public key OpenPGP và chứng thư S/MIME, chuẩn bị cấu hình Thunderbird, rồi kiểm tra tệp giả lập. Cần biết khóa công khai/riêng, chứng thư và mã thoát lệnh từ hai bài trước.

Bài độc lập tham chiếu mục 022.3, giáo trình Security Essentials 1.0 tiếng Việt ngày 15/04/2026, trang in 89–115. Kiểm chứng ngày 23/10/2026: Ubuntu 26.04.1 ARM64, GnuPG 2.4.8 và OpenSSL 3.5.5 trong container riêng. Thunderbird 158.0.1 được công bố ngày 20/10/2026; chúng tôi chưa chạy giao diện phiên bản này hoặc gửi email thật. Các bước giao diện dưới đây dựa trên tài liệu hãng, có thể khác theo phiên bản.

Chọn đúng mục đích và công nghệ

Mã hóa cho người nhận sử dụng public key phù hợp của họ trong cơ chế mật mã lai; private key tương ứng cần để giải mã. Ký số dùng private key người ký, public key tương ứng để xác minh. Không gọi thao tác mã hóa cho người nhận là ký, cũng không nói muốn mã hóa thì luôn cần private key người gửi. Khi vừa ký vừa mã hóa, hai vai trò cùng xuất hiện.

TLS của SMTP hoặc IMAP bảo vệ các chặng kết nối theo cấu hình, khác với bảo vệ nội dung giữa ứng dụng đầu cuối. OpenPGP và S/MIME hướng đến lớp nội dung; chúng không làm thiết bị bị mã độc trở nên đáng tin. Nội dung đã giải mã có thể bị sao chép, chụp màn hình hoặc trích vào thư trả lời không mã hóa.

Nội dung cần phân biệt OpenPGP S/MIME
Vật liệu công khai Khóa và thông tin liên quan Chứng thư X.509 chứa public key
Liên kết với người dùng Cần xác minh khóa, danh tính và chấp nhận phù hợp Cần chứng thư, đường dẫn tin cậy và liên kết địa chỉ phù hợp
Vật liệu bí mật Private key, có thể gồm các subkey Private key tương ứng chứng thư
Phần mềm trong bài GnuPG cho fixture tệp OpenSSL CMS cho fixture bổ sung

OpenPGP được đặc tả tại RFC 9580, thay thế các RFC OpenPGP trước đó được liệt kê trong tiêu chuẩn. Có tiêu chuẩn mới không có nghĩa mọi sản phẩm hỗ trợ toàn bộ định dạng hoặc thuật toán mới. Kiểm tra tương thích giữa các client trước khi đổi khóa hoặc gửi dữ liệu nghiệp vụ.

Chữ ký kiểm tra dữ liệu theo khóa người ký; mã hóa cho người nhận có vai trò khác.
Hình 2. Chữ ký kiểm tra dữ liệu theo khóa người ký; mã hóa cho người nhận có vai trò khác. Mở hình để xem chi tiết.

Tìm được khóa chưa đủ để tin khóa

Máy chủ khóa giúp phân phối public key; việc tìm thấy địa chỉ email trong một khóa không tự chứng minh người kiểm soát khóa là người bạn định liên hệ. So fingerprint đầy đủ qua kênh đã xác thực, chẳng hạn quy trình trao đổi khóa của tổ chức. Đừng xác nhận fingerprint chỉ bằng một email khác từ chính cuộc trao đổi đang nghi ngờ.

Thunderbird có thể nhận khóa từ tệp đính kèm, kho khóa hoặc cơ chế khám phá như WKD theo hỗ trợ của sản phẩm. Không cần công bố khóa cá nhân lên keyserver để hoàn thành lab này. Trước khi công bố thật, xem dữ liệu nhận dạng nào sẽ được phân phối và chính sách của dịch vụ.

Phân biệt public key với secret key khi xuất tệp. Public key dùng để chia sẻ; bản sao private key cần bảo vệ và lưu riêng theo quy trình. Lập kế hoạch hết hạn, gia hạn hoặc thay khóa, thu hồi khi cần và thông báo đúng bên. Mất private key giải mã có thể khiến thư cũ không đọc được; thu hồi không xóa các bản sao dữ liệu đã giải mã trước đó.

Chuẩn bị Thunderbird theo tài liệu chính thức

OpenPGP

Trong tài khoản hoặc identity cần dùng, mở Account Settings → End-To-End Encryption → Add Key. Tạo khóa mới hoặc nhập bản sao khóa cá nhân được phép dùng, rồi chọn khóa cho đúng identity. FAQ OpenPGP của Thunderbird mô tả quy trình này; trang còn có nội dung lịch sử về Thunderbird 78, nên không coi mọi ảnh hoặc câu chữ là giao diện hiện tại.

Nhập public key người nhận, xem địa chỉ và fingerprint rồi quyết định chấp nhận theo mức kiểm chứng đã thực hiện. Khi soạn thư thử được tổ chức cho phép, chọn đúng công nghệ, kiểm tra mã hóa và chữ ký trước khi gửi. Bên nhận cần đọc trạng thái chữ ký, không chỉ thấy một biểu tượng rồi suy ra người gửi đã được xác minh ngoài đời.

S/MIME

Theo hướng dẫn CSR của Thunderbird, từ phần S/MIME của End-To-End Encryption có thể tạo CSR, gửi CSR cho CA được tổ chức chấp nhận, nhập chứng thư trả về và chọn chứng thư ký/mã hóa cho identity. Private key tương ứng phải được giữ và sao lưu an toàn; CSR không chứa private key. Tính năng tạo CSR được tài liệu ghi hỗ trợ từ phiên bản 128.

Phân biệt nhập chứng thư gắn với khóa đang có và nhập gói chứa cả khóa như PKCS#12. Không tự đánh dấu intermediate CA là root đáng tin chỉ để hết cảnh báo. Đối chiếu địa chỉ, hạn dùng và mục đích chứng thư; CA tự ký trong lab không phải chứng thư công cộng. Không mặc định sẽ có nhà cung cấp miễn phí với cùng điều kiện vào mọi thời điểm.

Điều kiện gửi thư mã hóa yêu cầu vật liệu khóa/chứng thư phù hợp cho các người nhận, kể cả TO, CC và BCC. OpenPGP và S/MIME không trộn thành hai cơ chế nhận trong cùng một thư mã hóa của Thunderbird. Nếu thiếu khóa, xử lý nguyên nhân hoặc dùng kênh được phê duyệt khác; không âm thầm bỏ mã hóa cho nội dung nhạy cảm.

Kiểm tra identity, công nghệ và khóa cho mọi người nhận trước khi gửi thư mã hóa.
Hình 1. Kiểm tra identity, công nghệ và khóa cho mọi người nhận trước khi gửi thư mã hóa. Mở hình để xem chi tiết.

Lab OpenPGP: hai danh tính hoàn toàn giả

Chỉ chạy trong môi trường dùng một lần có GnuPG. Hai thư mục keyring và tất cả private key dưới đây thuộc fixture; không dùng hồ sơ GPG thật. Khóa không có passphrase chỉ để tự động kiểm thử trong môi trường cô lập. Với khóa công việc, áp dụng cách bảo vệ và sao lưu của tổ chức.

Tạo khóa ký và subkey mã hóa

umask 077
work=$(mktemp -d)
cd "$work"
mkdir alice bob
chmod 700 alice bob
printf 'LPI EMAIL DEMO amount=120\n' > message.txt
for person in alice bob; do
  gpg --homedir "$work/$person" --batch \
    --pinentry-mode loopback --passphrase '' \
    --quick-generate-key "LPI DEMO $person <$person@example.test>" \
    ed25519 sign 1d
  fp=$(gpg --homedir "$work/$person" --with-colons \
    --list-secret-keys | awk -F: '$1=="fpr"{print $10;exit}')
  gpg --homedir "$work/$person" --batch \
    --pinentry-mode loopback --passphrase '' \
    --quick-add-key "$fp" cv25519 encr 1d
  gpg --homedir "$work/$person" --armor --export "$fp" \
    > "$person-public.asc"
  printf '%s\n' "$fp" > "$person.fpr"
done

Kỳ vọng mỗi danh tính có khóa ký Ed25519 và subkey mã hóa cv25519. Thời hạn một ngày là tham số lab. GnuPG mô tả cách tạo khóa tự động, đồng thời phân biệt các lựa chọn dành cho kiểm thử. Phiên bản khác có thể tạo thông báo và định dạng khóa khác.

Nhập và chấp nhận đúng khóa trong fixture

alice_fp=$(cat alice.fpr)
bob_fp=$(cat bob.fpr)
gpg --homedir "$work/alice" --batch --import bob-public.asc
gpg --homedir "$work/bob" --batch --import alice-public.asc
gpg --homedir "$work/alice" --with-colons --fingerprint "$bob_fp"
gpg --homedir "$work/alice" --batch --yes \
  --pinentry-mode loopback --passphrase '' \
  --quick-lsign-key "$bob_fp"

So fingerprint chính với bob.fpr trước lệnh cuối. Ở đây nguồn tham chiếu là khóa vừa tự tạo trong cùng fixture; đó không phải bằng chứng danh tính người thật. --quick-lsign-key tạo chứng nhận cục bộ, không tải lên keyserver. Không áp dụng thao tác chấp nhận này cho khóa chưa xác minh trong hồ sơ công việc.

Ký, xác minh và mã hóa cho Bob

gpg --homedir "$work/alice" --batch --yes \
  --local-user "$alice_fp" --detach-sign \
  --output message.sig message.txt
gpg --homedir "$work/bob" --batch --verify message.sig message.txt
gpg --homedir "$work/alice" --batch --yes \
  --recipient "$bob_fp" --encrypt --output message.gpg message.txt
gpg --homedir "$work/bob" --batch --yes \
  --decrypt --output recovered.txt message.gpg
cmp message.txt recovered.txt

Kỳ vọng chữ ký phù hợp với public key Alice và cmp không báo khác biệt, mã thoát 0. GPG có thể đồng thời cảnh báo mức tin cậy danh tính: chữ ký đúng về toán học và danh tính được tin là hai kết luận khác nhau. Tệp mã hóa này chỉ chọn Bob; đừng giả định Alice luôn đọc được mọi bản đã gửi nếu không có bản mã cho khóa phù hợp của mình.

Sửa nội dung rồi xác minh lại

printf 'LPI EMAIL DEMO amount=900\n' > changed.txt
gpg --homedir "$work/bob" --batch --verify message.sig changed.txt

Kỳ vọng lỗi chữ ký và mã thoát khác 0. Script bật set -e cần đặt lỗi mong đợi trong if để vẫn thực hiện cleanup. Lab bổ sung đã thử keyring rỗng giải mã tệp dành cho Bob và bị từ chối. Kết thúc bằng dừng agent của hai keyring qua gpgconf --homedir "$work/alice" --kill all và lệnh tương tự cho Bob, rồi hủy môi trường lab cùng dữ liệu dùng một lần.

S/MIME: bằng chứng đã thử và giới hạn

Fixture riêng tạo CA minh họa và hai chứng thư có emailProtection, địa chỉ email giả và private key tách biệt. OpenSSL CMS xác minh chữ ký rời trên dữ liệu gốc thành công, từ chối dữ liệu bị sửa; Bob giải mã đúng byte, khóa Alice không giải mã được phong bì chỉ dành Bob. Không suy ra mã hóa đơn thuần xác thực người gửi.

Đây là kiểm thử cấu trúc CMS bằng OpenSSL, chưa phải kiểm thử tương thích email giữa Thunderbird và hệ thống khác. Không gửi SMTP, không nhận IMAP, không cấp chứng thư CA công cộng, không kiểm thử thu hồi hoặc toàn bộ RFC 9580. Không đưa nội dung vào xử lý tiếp khi xác minh thất bại, dù công cụ đã ghi ra tệp đầu ra.

Tự kiểm tra và xử lý sự cố

Nếu không mã hóa được, kiểm tra đúng identity, công nghệ, hạn dùng và khóa của mọi người nhận. Nếu không giải mã được, xác định khóa bí mật phù hợp còn tồn tại và bản sao lưu có khôi phục được không; public key đơn thuần không thay thế nó. Không gửi private key cho Help Desk để nhờ đọc thư.

  1. Thư được mã hóa có chắc do trưởng phòng gửi? Chưa; cần chữ ký và liên kết khóa với danh tính đã xác minh.
  2. Import khóa có nghĩa đã xác minh fingerprint? Không, đó là hai bước riêng.
  3. Sao lưu thư mã hóa mà mất khóa có đủ phục hồi? Không bảo đảm; cần kế hoạch phục hồi khóa phù hợp.
  4. Lab thành công có chứng minh mọi email được bảo vệ? Không, cần kiểm chứng client, người nhận và trạng thái bảo mật của chính cuộc trao đổi.

Bài liên quan trong bộ LPI

Tìm hiểu thêm