Đăng nhập VPS bằng mật khẩu vừa bất tiện vừa dễ bị dò mật khẩu. Cách an toàn hơn là tạo SSH key trên Windows, đưa public key lên máy chủ và dùng private key để xác thực. Windows 10 và 11 đã có sẵn OpenSSH Client, nên bạn không cần cài thêm phần mềm. Bài này hướng dẫn cả hai cách tạo key bằng OpenSSH và PuTTYgen, chép key lên VPS khi Windows không có ssh-copy-id, cấu hình ~/.ssh/config, và tắt đăng nhập mật khẩu mà không tự khóa mình ngoài máy chủ.

SSH key hoạt động thế nào

Một cặp SSH key gồm hai file:

  • Private key (ví dụ id_ed25519): giữ trên máy tính của bạn, tương đương mật khẩu, không bao giờ gửi cho ai.
  • Public key (ví dụ id_ed25519.pub): đặt trên máy chủ trong file ~/.ssh/authorized_keys, có thể chia sẻ.

Khi đăng nhập, máy chủ dùng public key để xác minh rằng bạn đang giữ private key tương ứng, mà private key không phải truyền qua mạng.

Cách 1: Tạo SSH key bằng OpenSSH có sẵn trên Windows

Kiểm tra OpenSSH Client

Mở PowerShell hoặc Windows Terminal và chạy:

ssh -V

Nếu báo không tìm thấy lệnh, cài OpenSSH Client trong Settings, mục System, chọn Optional features. Hoặc chạy PowerShell với quyền Administrator:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Tạo cặp key ed25519

ssh-keygen -t ed25519 -C "laptop-cua-ban"

Phần -C là ghi chú để bạn nhận ra key này trên máy chủ. Khi được hỏi nơi lưu, bấm Enter để dùng đường dẫn mặc định C:\Users\TenBan\.ssh\id_ed25519. Sau đó nhập passphrase. Tài liệu Microsoft không khuyến khích để trống passphrase, vì passphrase kết hợp với file key tạo thành lớp bảo vệ thứ hai.

Xem nội dung public key:

Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub

Lưu key vào ssh-agent

Để không phải nhập passphrase mỗi lần kết nối, bật dịch vụ ssh-agent. Chạy PowerShell với quyền Administrator:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent

Sau đó, trong PowerShell thường, nạp key:

ssh-add $env:USERPROFILE\.ssh\id_ed25519

Chép public key lên VPS (thay cho ssh-copy-id)

Trên Linux và macOS có lệnh ssh-copy-id, nhưng OpenSSH của Windows không có lệnh này. Có ba cách thay thế.

Cách A: Một lệnh PowerShell

Lệnh sau đọc public key và truyền qua SSH, tạo thư mục ~/.ssh trên VPS nếu chưa có, ghi thêm key vào authorized_keys và đặt đúng quyền. Lần này bạn vẫn phải nhập mật khẩu VPS:

Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Thay user và IP bằng thông tin VPS của bạn. Chuỗi lệnh trong dấu nháy kép chạy trên máy chủ Linux, nên dùng cú pháp bash.

Cách B: Dán thủ công

Đăng nhập VPS bằng mật khẩu, rồi chạy:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Dán toàn bộ nội dung file .pub trên một dòng duy nhất, lưu file. Mỗi key một dòng.

Cách C: Nhập key khi tạo VPS

Nhiều nhà cung cấp cho phép thêm public key ngay lúc tạo VPS hoặc trong trang quản trị. Key sẽ được cloud-init ghi vào authorized_keys khi máy khởi tạo.

Kiểm tra bằng cách mở một cửa sổ mới và đăng nhập:

ssh user@203.0.113.10

Nếu vào được mà không bị hỏi mật khẩu VPS (chỉ hỏi passphrase nếu key chưa nạp vào agent), key đã hoạt động.

Cách 2: Tạo SSH key bằng PuTTYgen

Nếu bạn quen dùng PuTTY, hãy dùng PuTTYgen đi kèm bộ cài PuTTY:

  1. Mở PuTTYgen, ở mục Type of key to generate chọn EdDSA, rồi chọn Ed25519 ở ô bên cạnh.
  2. Bấm Generate và di chuột trong khung trống để tạo dữ liệu ngẫu nhiên.
  3. Điền Key comment và Key passphrase.
  4. Bấm Save private key để lưu file .ppk.
  5. Sao chép nội dung ô "Public key for pasting into OpenSSH authorized_keys file" và dán vào ~/.ssh/authorized_keys trên VPS như Cách B.

Trong PuTTY, mở Connection, chọn SSH, Auth, Credentials, rồi chọn file .ppk ở ô Private key file for authentication. Lưu lại session để lần sau chỉ cần bấm Load. Pageant (đi kèm PuTTY) đóng vai trò giống ssh-agent.

Hai định dạng key không dùng lẫn trực tiếp. PuTTY dùng .ppk, còn OpenSSH dùng định dạng OpenSSH. Trong PuTTYgen, menu Conversions cho phép nhập key OpenSSH để lưu sang .ppk, hoặc xuất .ppk sang định dạng OpenSSH.

Tiêu chíOpenSSH (Windows)PuTTY
Cài đặtCó sẵn trên Windows 10/11Cài thêm từ trang chính thức
Tạo keyssh-keygenPuTTYgen
Định dạng private keyOpenSSH.ppk
Lưu passphraseDịch vụ ssh-agentPageant
Cấu hình hostFile ~/.ssh/configSaved Sessions

Cấu hình ~/.ssh/config cho gọn

Tạo file C:\Users\TenBan\.ssh\config (không có đuôi mở rộng):

Host vps-web
    HostName 203.0.113.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    ServerAliveInterval 60

Từ giờ chỉ cần gõ ssh vps-web. Các lệnh scp, sftp và extension Remote SSH của VS Code cũng đọc file này. IdentitiesOnly yes buộc SSH chỉ thử key đã chỉ định, tránh bị máy chủ từ chối vì thử quá nhiều key.

Tắt đăng nhập bằng mật khẩu an toàn

Chỉ làm bước này khi đã đăng nhập bằng key thành công. Giữ nguyên một phiên SSH đang mở trong suốt quá trình để có đường lui nếu cấu hình sai.

Kiểm tra các file cấu hình con

Trên Ubuntu, sshd_config có dòng Include /etc/ssh/sshd_config.d/*.conf ở đầu. OpenSSH dùng giá trị xuất hiện đầu tiên cho mỗi tùy chọn, nên file trong thư mục này có thể ghi đè dòng bạn sửa trong sshd_config. Ảnh VPS dùng cloud-init thường có file 50-cloud-init.conf đặt PasswordAuthentication yes.

sudo grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

Tạo file cấu hình ưu tiên

Tạo file có tên bắt đầu bằng số nhỏ để được đọc trước:

sudo nano /etc/ssh/sshd_config.d/00-chi-dung-key.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password

Nếu bạn đăng nhập bằng user thường có sudo, có thể đặt PermitRootLogin no. Kiểm tra cú pháp và giá trị thực tế, rồi khởi động lại dịch vụ:

sudo sshd -t
sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractive|permitrootlogin'
sudo systemctl restart ssh

Trên Ubuntu, dịch vụ tên là ssh. Mở một cửa sổ PowerShell mới, thử đăng nhập bằng key. Sau đó thử ép dùng mật khẩu để chắc chắn đã bị từ chối:

ssh -o PubkeyAuthentication=no user@203.0.113.10

Kết quả mong đợi là Permission denied (publickey). Lúc này mới đóng phiên cũ. Bước tiếp theo nên làm là cài Fail2ban, bật UFW và các thiết lập khác trong bài bảo mật VPS Ubuntu 24.04 trong 30 phút đầu.

Lỗi thường gặp

  • Vẫn bị hỏi mật khẩu: sai quyền thư mục. ~/.ssh phải là 700, authorized_keys là 600 và thuộc đúng user. Xem log bằng sudo journalctl -u ssh -n 50.
  • "UNPROTECTED PRIVATE KEY FILE": trên Windows, file private key bị cấp quyền đọc cho user khác. Chỉ giữ quyền cho tài khoản của bạn trong tab Security của file.
  • PuTTY báo key không hợp lệ: bạn đang chọn file OpenSSH thay vì .ppk. Dùng PuTTYgen để chuyển đổi.
  • Tự khóa mình ngoài VPS: dùng console VNC/web console của nhà cung cấp để sửa lại cấu hình.

Nếu đang tìm VPS để thực hành, Canh Deal đề xuất VPS giá rẻ TDCloud từ 55.000đ/tháng cho gói 1 vCPU/1GB/20GB (giá tham khảo ngày 24/10/2026, chưa gồm VAT). Mã ưu đãi hiện có được cập nhật tại trang mã giảm giá TDCloud.

Nguồn tham khảo