Giải Thích SSH và RSA Keys: Tạo, Sử Dụng và Bảo Mật Cặp Khóa Của Bạn
Hướng dẫn thực tế về cặp khóa SSH và RSA — cách chúng hoạt động, cách tạo chúng ngay trên trình duyệt, và cách sử dụng chúng để truy cập máy chủ an toàn và mã hóa dữ liệu.
Mật mã học khóa công khai là nền tảng của giao tiếp internet an toàn — kết nối SSH, HTTPS, ký JWT và email được mã hóa đều dựa vào nó. Hiểu cách cặp khóa hoạt động sẽ giúp bạn trở thành một lập trình viên hiệu quả hơn và người dùng có ý thức bảo mật tốt hơn.
Khái niệm cốt lõi: khóa công khai và khóa riêng tư
Một cặp khóa bao gồm hai khóa được liên kết về mặt toán học:
- Khóa riêng tư (Private key) — Lưu trên máy của bạn. Không bao giờ chia sẻ nó. Hãy coi đây là danh tính của bạn.
- Khóa công khai (Public key) — Chia sẻ tự do. Bạn đặt nó trên các máy chủ, trong GitHub, trong cấu hình JWT.
Các phép tính toán hoạt động theo một chiều: dữ liệu được mã hóa bằng khóa công khai chỉ có thể được giải mã bằng khóa riêng tư tương ứng. Và dữ liệu được ký bằng khóa riêng tư có thể được xác minh bằng khóa công khai — mà không tiết lộ khóa riêng tư.
SSH keys: truy cập máy chủ không cần mật khẩu
SSH (Secure Shell) là tiêu chuẩn để truy cập máy chủ từ xa. Xác thực bằng mật khẩu hoạt động được nhưng có những điểm yếu — mật khẩu có thể bị đoán, bị lừa đảo (phishing) hoặc bị rò rỉ. Xác thực bằng SSH key mạnh hơn về bản chất:
- Client của bạn trình bày một bằng chứng mật mã sử dụng khóa riêng tư
- Máy chủ xác minh bằng chứng với khóa công khai mà bạn đã cài đặt
- Không có mật khẩu nào truyền qua mạng — không có gì để bị chặn lại
Thiết lập xác thực SSH key:
# Tạo cặp khóa (Ed25519 là tiêu chuẩn hiện đại)
ssh-keygen -t ed25519 -C "your-email@example.com"
# Sao chép khóa công khai lên máy chủ
ssh-copy-id user@yourserver.com
# Kết nối — không cần mật khẩu
ssh user@yourserver.com
Khóa công khai được đặt vào ~/.ssh/authorized_keys trên máy chủ. Khóa riêng tư không bao giờ rời khỏi máy của bạn.
Ed25519 vs RSA cho SSH
Ed25519 là khuyến nghị hiện tại:
- Khóa nhỏ hơn (256-bit) với mức bảo mật tương đương hoặc tốt hơn RSA-4096
- Tạo và xác minh chữ ký nhanh hơn
- Được hỗ trợ bởi tất cả các máy chủ SSH hiện đại
RSA vẫn được sử dụng rộng rãi, đặc biệt trong môi trường doanh nghiệp với các hệ thống cũ hơn:
- 2048-bit là kích thước tối thiểu chấp nhận được hiện nay
- 4096-bit cung cấp độ an toàn dự phòng cho các khóa tồn tại lâu dài
- Kích thước khóa lớn hơn đồng nghĩa với xác thực chậm hơn một chút
Tạo SSH keys ngay trên trình duyệt với SSH Key Generator của chúng tôi — Ed25519 và ECDSA, sử dụng Web Crypto API. Không có dữ liệu khóa nào rời khỏi trình duyệt của bạn.
RSA keys: mã hóa và ký số
RSA keys được sử dụng ngoài SSH — cho chứng chỉ TLS, ký JWT, email được mã hóa (PGP) và xác thực API.
Các trường hợp sử dụng RSA phổ biến:
JWT (JSON Web Tokens) với RS256:
- Ký token bằng khóa RSA riêng tư của bạn
- Clients xác minh bằng khóa công khai
- Khác với HS256 (đối xứng), bên xác minh không cần biết bí mật ký
Ký mã (Code signing):
- Ký một artifact phát hành bằng khóa riêng tư của bạn
- Người dùng xác minh chữ ký bằng khóa công khai đã được công bố
- Chứng minh artifact đến từ bạn và chưa bị giả mạo
Chứng chỉ TLS/SSL:
- Các tổ chức cấp chứng chỉ (CA) ký khóa công khai của bạn bằng khóa riêng tư của họ
- Trình duyệt xác minh bằng khóa công khai của CA (được tích hợp sẵn trong trình duyệt)
Tạo cặp khóa RSA ở định dạng PEM với RSA Key Generator của chúng tôi — 2048-bit hoặc 4096-bit, hoàn toàn trên trình duyệt của bạn.
Giải thích định dạng PEM
Khóa RSA và SSH thường được phân phối ở định dạng PEM (Privacy Enhanced Mail):
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7o4qne60...
-----END PRIVATE KEY-----
Phần tiêu đề và kết thúc xác định loại khóa. Phần giữa là dữ liệu khóa được mã hóa base64. Các tiêu đề khác nhau biểu thị các loại khóa khác nhau:
BEGIN RSA PRIVATE KEY— Định dạng PKCS#1 truyền thốngBEGIN PRIVATE KEY— Định dạng PKCS#8 (phổ biến hơn trong các công cụ hiện đại)BEGIN PUBLIC KEY— Khóa công khai ở định dạng PKCS#8BEGIN OPENSSH PRIVATE KEY— Định dạng riêng của OpenSSH cho SSH keys
Bảo vệ khóa riêng tư của bạn
Bảo mật khóa riêng tư là điều tối quan trọng:
- Không bao giờ commit lên git — Thêm
*.pem,id_rsavàid_ed25519vào.gitignore - Dùng passphrase — Mã hóa khóa khi lưu trữ. Ngay cả khi ai đó lấy được file, họ không thể sử dụng nếu không có passphrase.
- Giới hạn quyền truy cập — SSH yêu cầu
chmod 600trên file khóa riêng tư; nó từ chối sử dụng các khóa mà người khác có thể đọc được - Thay thế nếu bị lộ — Tạo cặp khóa mới và xóa khóa công khai cũ khỏi tất cả các máy chủ
# Đặt quyền chính xác cho khóa riêng tư của bạn
chmod 600 ~/.ssh/id_ed25519
Dấu vân tay khóa (Key fingerprints)
Fingerprint là một hash ngắn của khóa công khai dùng để xác minh danh tính mà không cần so sánh toàn bộ khóa:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# Output: 256 SHA256:abc123... your-email@example.com (ED25519)
Khi kết nối lần đầu đến một máy chủ, SSH hiển thị fingerprint của máy chủ và yêu cầu bạn xác nhận. Hãy xác minh fingerprint này qua một kênh riêng biệt (tài liệu của nhà cung cấp máy chủ) trước khi chấp nhận.
Tóm tắt
Cặp khóa SSH và RSA cung cấp xác thực và mã hóa mạnh hơn về bản chất so với mật khẩu. Sử dụng Ed25519 cho SSH, RSA-4096 cho ký số và mã hóa, luôn bảo vệ khóa riêng tư bằng passphrase, và tạo khóa trên máy của bạn — không bao giờ để dịch vụ của bên thứ ba tạo khóa riêng tư cho bạn.