Khi bạn SSH vào VPS bằng key, cơ chế “ký” (signing) thực chất là một quá trình xác thực bằng mật mã bất đối xứng, không phải gửi mật khẩu hay gửi private key lên server.

Mình sẽ giải thích theo đúng bản chất kỹ thuật bên trong, để bạn hiểu rõ cơ chế hoạt động.


1. SSH dùng mô hình mật mã bất đối xứng

SSH sử dụng cặp khóa:

  • Private key → giữ ở máy local của bạn
  • Public key → đặt trong VPS (thường ở ~/.ssh/authorized_keys)

Ví dụ bạn dùng:

  • RSA
  • ECDSA
  • Ed25519 (hiện đại và an toàn hơn)

2. Khi bạn SSH vào VPS thì chuyện gì xảy ra?

Giả sử bạn chạy:

ssh root@your_vps_ip

Quy trình xác thực bằng chữ ký diễn ra như sau:


Bước 1: Client gửi yêu cầu kết nối

Máy bạn (SSH client) kết nối tới:

TCP port 22 của VPS

Sau đó hai bên sẽ:

  • Thương lượng thuật toán mã hóa
  • Trao đổi key tạm thời bằng Diffie-Hellman
  • Tạo kênh mã hóa an toàn

⚠ Lưu ý: Đây mới chỉ là tạo đường truyền mã hóa. Chưa xác thực người dùng.


Bước 2: Server yêu cầu xác thực

Server hỏi:

Bạn là ai?

Client trả lời:

Tôi muốn đăng nhập bằng public key này

Client gửi:

  • Public key
  • Loại thuật toán (RSA, Ed25519...)

Server kiểm tra:

Public key này có nằm trong ~/.ssh/authorized_keys không?

Nếu có → chuyển sang bước ký


3. Cơ chế ký thực sự diễn ra như nào?

Đây là phần quan trọng nhất.

Server KHÔNG yêu cầu bạn gửi private key.

Thay vào đó:

Server tạo một chuỗi dữ liệu ngẫu nhiên (challenge)

Ví dụ:

abcxyz123random_data

Sau đó gửi cho client.


Client dùng private key để ký chuỗi đó

Client thực hiện:

signature = sign(challenge, private_key)

Signature này là một giá trị mật mã.


Client gửi chữ ký lên server

Server nhận chữ ký và dùng public key để kiểm tra:

verify(signature, challenge, public_key)

Nếu:

Đúng → bạn chứng minh được bạn có private key
Sai → từ chối

4. Tại sao an toàn?

  • Private key không bao giờ rời khỏi máy bạn
  • Server chỉ xác thực chữ ký
  • Hacker không thể tạo chữ ký hợp lệ nếu không có private key
  • Ngay cả khi nghe lén cũng không dùng lại được vì challenge mỗi lần khác nhau

Đây gọi là:

Challenge-Response Authentication

5. Minh họa trực quan

Quy trình thực tế:

Client  →  Server  : Tôi có public key này
Server  →  Client  : Đây là challenge ngẫu nhiên
Client  →  Server  : Đây là chữ ký của challenge
Server  →  Client  : OK, đăng nhập thành công

6. So sánh với đăng nhập bằng password

Password login

  • Client gửi mật khẩu qua kênh mã hóa
  • Nếu mật khẩu lộ → nguy hiểm

SSH key login

  • Không gửi mật khẩu
  • Không gửi private key
  • Chỉ gửi chữ ký

An toàn hơn rất nhiều.


7. Nếu private key có passphrase thì sao?

Nếu bạn đặt passphrase cho private key:

  • Private key được mã hóa
  • SSH client phải giải mã private key trước khi ký
  • ssh-agent có thể giữ key đã mở khóa trong RAM

8. Các thuật toán ký phổ biến

Hiện nay nên dùng:

  • Ed25519 (nhanh, an toàn)
  • RSA 4096 (vẫn ổn)

Tạo key:

ssh-keygen -t ed25519

9. Tóm lại cơ chế ký là gì?

SSH không gửi private key.

Nó hoạt động theo cơ chế:

Server đưa ra thử thách
Client dùng private key ký thử thách
Server dùng public key xác minh

Đây là cơ chế chữ ký số dựa trên mật mã bất đối xứng.