ssh-keygen: สร้างคีย์ SSH ลงทะเบียนคีย์สาธารณะ และวิธีใช้ ssh-copy-id

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบเมื่อ 2026-11-05
คำสั่งเครือข่ายssh-keygenssh-copy-idตำแหน่ง/usr/bin/ssh-keygen

ssh-keygen คือคำสั่งของ OpenSSH ที่สร้างคู่คีย์ส่วนตัวกับคีย์สาธารณะสำหรับเชื่อมต่อ SSH และยังดูแลการตรวจลายนิ้วมือ การเปลี่ยนพาสเฟรส ไปจนถึงการจัดการ known_hosts เมื่อสร้างคีย์ ed25519 และ rsa บนเซิร์ฟเวอร์ AlmaLinux 9 ตรวจลายนิ้วมือ เปลี่ยนพาสเฟรสและคอมเมนต์ แล้วลองใช้ ssh-copy-id แบบ dry-run พบว่าสิ่งที่ถูกส่งไปยังเซิร์ฟเวอร์มีเพียงคีย์สาธารณะหนึ่งบรรทัดในไฟล์ .pub

ชื่อบัญชีและพาธไฟล์คีย์ในผลลัพธ์ด้านล่างเป็นค่าตัวอย่าง ส่วนลายนิ้วมือ คีย์สาธารณะ และ randomart มาจากคีย์ที่สร้างขึ้นระหว่างเขียนบทความแล้วลบทิ้ง คำสั่งที่ลงทะเบียนคีย์สาธารณะบนเซิร์ฟเวอร์จริงแสดงไว้เฉพาะตัวคำสั่งและไม่ได้รัน

1️⃣ สร้างคีย์ด้วย ssh-keygen: -t ed25519 และคอมเมนต์ -C

คีย์สร้างในรูปแบบ ssh-keygen -t ชนิด -C คอมเมนต์ โดย -t คือชนิดของคีย์ และ -C คือคอมเมนต์ที่ต่อท้ายคีย์สาธารณะ มักใส่อีเมลหรือการใช้งานของคีย์ ด้านล่างคือผลลัพธ์ทั้งหมดเมื่อระบุไฟล์ด้วย -f และกด Enter ผ่านคำถามพาสเฟรสทั้งสองครั้ง

ssh-keygen -t ed25519 -C "user@example.com" -f ~/.ssh/id_ed25519
Generating public/private ed25519 key pair.
Enter passphrase for "/home/user/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

ถ้ากดแค่ Enter ที่คำถามพาสเฟรส จะได้คีย์ที่ไม่มีพาสเฟรส ถ้าไม่ใส่ -f จะมีบรรทัดถามตำแหน่งบันทึกไฟล์ขึ้นมาก่อนคำถามพาสเฟรส ในวงเล็บเป็นพาธเริ่มต้น .ssh/id_ed25519 ใต้โฟลเดอร์โฮม และกดแค่ Enter ก็จะบันทึกไว้ที่พาธนั้น

randomart ท้ายผลลัพธ์คือลายนิ้วมือที่แปลงเป็นภาพ ตอนสร้างคีย์และตอนตรวจซ้ำด้วย -lv ได้ภาพเดียวกัน

ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
-rw------- 1 user user 411 Oct 29 08:22 /home/user/.ssh/id_ed25519
-rw-r--r-- 1 user user  98 Oct 29 08:22 /home/user/.ssh/id_ed25519.pub

คีย์ส่วนตัวถูกสร้างด้วยสิทธิ์ 600 และคีย์สาธารณะด้วยสิทธิ์ 644 คีย์ส่วนตัวเก็บไว้ในคอมพิวเตอร์ของคุณเท่านั้นและไม่ส่งออกไปที่ไหน

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

คีย์สาธารณะคือบรรทัดเดียวที่มีชนิดคีย์ ค่าคีย์ และคอมเมนต์คั่นด้วยช่องว่าง บรรทัดนี้แหละที่จะเข้าไปอยู่ใน authorized_keys ของเซิร์ฟเวอร์ที่จะเชื่อมต่อ หน้าที่ของแต่ละไฟล์ในโฟลเดอร์สรุปไว้เป็นแผนผังต้นไม้

~/.sshโฟลเดอร์ที่รวมคีย์และบันทึกการเชื่อมต่อ · สิทธิ์ 700
id_ed25519คีย์ส่วนตัว · ไฟล์ที่อยู่ในคอมพิวเตอร์ของคุณเท่านั้น · สิทธิ์ 600
id_ed25519.pubคีย์สาธารณะหนึ่งบรรทัด · ใส่ใน authorized_keys ของเซิร์ฟเวอร์ปลายทาง · สิทธิ์ 644
authorized_keysรายการคีย์สาธารณะที่เข้าสู่เซิร์ฟเวอร์นี้ได้ (อยู่บนเซิร์ฟเวอร์ฝั่งรับ)
known_hostsโฮสต์คีย์ของเซิร์ฟเวอร์ที่เคยเชื่อมต่อ · ssh-keygen -R ลบทีละบรรทัด
configชื่อเล่น พอร์ต และไฟล์คีย์แยกตามเซิร์ฟเวอร์ (ssh_config)

2️⃣ ตัวเลือกของ ssh-keygen: -f, -N, -b, -q

การสร้างแบบตอบคำถามสะดวกเมื่อพิมพ์เอง แต่ในสคริปต์ต้องตัดคำถามออกไปทั้งหมด ถ้ากำหนดไฟล์ด้วย -f และให้พาสเฟรสด้วย -N คีย์จะถูกสร้างทันทีโดยไม่ถามอะไร

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N "" -C "deploy@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/deploy_key
Your public key has been saved in /home/user/.ssh/deploy_key.pub
The key fingerprint is:
SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com
The key's randomart image is:
+--[ED25519 256]--+
|        +        |
|       o +       |
|        +    .   |
|       . +  o    |
|    . o S ++o    |
|   . + +   B+    |
|  .oo * + .=+    |
|  E+o* Boo=++.   |
|   .=.=oo=o++.   |
+----[SHA256]-----+

ถ้าใส่เครื่องหมายคำพูดว่างหลัง -N จะได้คีย์ที่ไม่มีพาสเฟรส และตำแหน่งบันทึกกับลายนิ้วมือแสดงออกมาพร้อมกันโดยไม่มีคำถามเลย

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
Generating public/private ed25519 key pair.
/home/user/.ssh/deploy_key already exists.
Overwrite (y/n)?

ถ้ารันซ้ำด้วยชื่อเดิม จะมีคำถามว่าจะเขียนทับหรือไม่ต่อจาก already exists พอกด n ก็ไม่มีอะไรเปลี่ยนและจบด้วยรหัสออก 1 เพื่อไม่ให้เผลอเขียนทับคีย์ที่ใช้งานอยู่ ให้สร้างคีย์ใหม่ด้วยชื่ออื่น

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "user@example.com"
Generating public/private rsa key pair.
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:f+uwCSQjMka1BEHzXADwIWbrlbVRiP6Z4tjnwNwPVAA user@example.com
The key's randomart image is:
+---[RSA 4096]----+
|o=BE*=+.         |
|oo.Oo++          |
| .+o+. .         |
|....  .          |
| .+ o.= S        |
| .o+o= + .       |
|  ++.o  . o .    |
| . o..o  . = .   |
|    o. .  o.o    |
+----[SHA256]-----+

rsa ใช้ -b กำหนดความยาว ตามคู่มือค่าเริ่มต้นคือ 3072 บิต ด้านบนสร้างด้วย 4096 บิต จึงมี RSA 4096 ขึ้นที่หัวของ randomart คู่มือระบุว่า ed25519 มีความยาวตายตัว ใส่ -b ไปก็ถูกละเว้น

ssh-keygen -f ~/.ssh/default_key -N "" -C "user@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/default_key
Your public key has been saved in /home/user/.ssh/default_key.pub
The key fingerprint is:
SHA256:mwy02fpKxjxEVvLC2EUJeaMIiNFOVS0GwWVjN9v0j4c user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|o+ o+=O=*..      |
|o + .*+B== .     |
| o ..oB+o.. .    |
|  . .+.=     +   |
|      = S   E o  |
|     + + o   .   |
|      B +        |
|     o o         |
|      ...        |
+----[SHA256]-----+

เมื่อไม่ใส่ -t ได้คีย์ ed25519

ssh-keygen -q -t ed25519 -f ~/.ssh/backup_key -N "" -C "backup@example.com"; echo rc=$?
rc=0

ถ้าใส่ -q จะซ่อนทุกอย่างรวมถึงลายนิ้วมือและ randomart เหลือเพียงรหัสออก ใช้ตอนสร้างคีย์สำหรับหลายเซิร์ฟเวอร์ด้วยสคริปต์

📌 ตัวเลือกหลัก: ผลที่รันในบทความนี้

ตัวเลือกหน้าที่ผลที่เห็นในบทความนี้
-t ชนิดชนิดของคีย์ที่จะสร้างบรรทัดแรกของผลลัพธ์แสดงชนิด เช่น ed25519 หรือ rsa ถ้าไม่ระบุจะเป็น ed25519
-C คอมเมนต์คอมเมนต์ที่ต่อท้ายคีย์สาธารณะuser@example.com ท้ายคีย์สาธารณะที่ดูด้วย cat
-f ไฟล์พาธของไฟล์คีย์บรรทัดที่บอกว่าบันทึกไว้ที่ /home/user/.ssh/deploy_key และถ้ารันซ้ำด้วยชื่อเดิมจะมี already exists กับ Overwrite (y/n)?
-N พาสเฟรสพาสเฟรสใหม่ (passphrase) ถ้าเป็นเครื่องหมายคำพูดว่างคือไม่มีพาสเฟรสตำแหน่งบันทึกและลายนิ้วมือในครั้งเดียวโดยไม่ถามพาสเฟรส
-b บิตความยาวของคีย์ถ้าให้ 4096 กับ rsa หัวของ randomart จะเป็น RSA 4096
-qซ่อนผลลัพธ์ทั้งหมดเหลือเพียงบรรทัด rc=0 ที่พิมพ์ด้วย echo
-lแสดงลายนิ้วมือของไฟล์คีย์ลายนิ้วมือ SHA256 เดียวกันจากคีย์สาธารณะและคีย์ส่วนตัว ส่วน authorized_keys ได้คีย์ละหนึ่งบรรทัด
-E แฮชกำหนดชนิดแฮชของลายนิ้วมือใช้ -E md5 ได้ลายนิ้วมือที่ขึ้นต้นด้วย MD5:00:7b:02:5e
-vใช้ร่วมกับ -l จะแสดง randomart ด้วยrandomart เดียวกับตอนสร้างคีย์
-yดึงคีย์สาธารณะออกจากคีย์ส่วนตัวแล้วแสดงผลคีย์สาธารณะหนึ่งบรรทัดที่ตรงกับไฟล์ .pub ทุกตัวอักษร
-pเปลี่ยนพาสเฟรสของคีย์ส่วนตัวมีบรรทัดบอกว่าบันทึกด้วยพาสเฟรสใหม่ และคีย์ส่วนตัวขยายจาก 411 เป็น 464 ไบต์
-P พาสเฟรสพาสเฟรสเดิม (ที่ตั้งไว้ตอนนี้)พาสเฟรสถูกได้คีย์สาธารณะ พาสเฟรสผิดได้ incorrect passphrase supplied to decrypt private key
-cเปลี่ยนคอมเมนต์ โดยใส่คอมเมนต์ใหม่ด้วย -COld comment: user@example.com และ Comment 'user@laptop' applied
-F โฮสต์หาบรรทัดของโฮสต์นั้นใน known_hosts# Host 192.0.2.10 found: line 1 และบรรทัดนั้น
-R โฮสต์ลบบรรทัดของโฮสต์นั้นออกจาก known_hostsknown_hosts updated และไฟล์เดิม known_hosts.old ส่วนโฮสต์ที่ไม่มีได้ not found
-Hแปลงชื่อโฮสต์และที่อยู่ใน known_hosts เป็นแฮชบรรทัดเปลี่ยนเป็นขึ้นต้นด้วย |1| และมี WARNING ว่าไฟล์ .old ยังเก็บบรรทัดก่อนแฮชไว้

📎 ตัวเลือกอื่น: ตามคู่มือทางการ

ตัวเลือกหน้าที่
-a จำนวนรอบจำนวนรอบ KDF (bcrypt_pbkdf) ตอนบันทึกคีย์ส่วนตัว ยิ่งมากการตรวจพาสเฟรสยิ่งช้าและยิ่งทนต่อการเดารหัสแบบ brute force ค่าเริ่มต้น 16
-Aสร้างโฮสต์คีย์ที่ยังไม่มีให้ครบทุกชนิดเริ่มต้น (rsa, ecdsa, ed25519) ไว้ที่พาธเริ่มต้น
-Bแสดงไดเจสต์แบบ bubblebabble ของไฟล์คีย์
-eแปลงคีย์ OpenSSH เป็นรูปแบบ -m (ค่าเริ่มต้น RFC4716) แล้วแสดงผล สำหรับโปรแกรม SSH อื่น
-iแปลงคีย์ที่ไม่มีพาสเฟรสในรูปแบบ -m (ค่าเริ่มต้น RFC4716) เป็นรูปแบบ OpenSSH แล้วแสดงผล
-m รูปแบบกำหนดรูปแบบคีย์ (RFC4716, PKCS8, PEM) ใช้ร่วมกับ -p เพื่อแปลงคีย์ส่วนตัวระหว่างรูปแบบ OpenSSH กับ PEM
-r โฮสต์แสดงเรคคอร์ด DNS แบบ SSHFP ของชื่อโฮสต์นั้นจากคีย์สาธารณะ
-s คีย์_CAเซ็นคีย์สาธารณะด้วยคีย์ CA เพื่อสร้างใบรับรอง
-Lแสดงเนื้อหาของใบรับรอง
-Kดาวน์โหลดคีย์ resident ที่เก็บในอุปกรณ์ยืนยันตัวตน FIDO มายังโฟลเดอร์ปัจจุบัน
-Y signเซ็นไฟล์ด้วยคีย์ SSH ลายเซ็นบันทึกโดยต่อท้ายชื่อไฟล์ด้วย .sig และชื่อการใช้งานกำหนดด้วย -n

3️⃣ ssh-keygen -l ตรวจลายนิ้วมือ และ -y ดึงคีย์สาธารณะ

ถ้ามีไฟล์คีย์หลายไฟล์ ดูจากชื่อไฟล์อย่างเดียวจะบอกยากว่าคีย์สาธารณะไหนคู่กับคีย์ส่วนตัวไหน เนื่องจากลายนิ้วมือของคีย์ส่วนตัวกับคีย์สาธารณะเป็นค่าเดียวกัน จึงยืนยันคู่ได้ด้วยการเทียบลายนิ้วมือของสองไฟล์ด้วย -l

ssh-keygen -l -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
ssh-keygen -l -f ~/.ssh/id_ed25519
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)

ไฟล์คีย์สาธารณะกับไฟล์คีย์ส่วนตัวให้ลายนิ้วมือ SHA256 เดียวกัน เลข 256 ด้านหน้าคือความยาวคีย์ และวงเล็บท้ายสุดคือชนิดคีย์

ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub
256 MD5:00:7b:02:5e:b8:ba:85:0c:32:d7:15:7e:72:45:f7:bc user@example.com (ED25519)

ถ้าใส่ -E md5 จะเปลี่ยนเป็นลายนิ้วมือ MD5 ซึ่งเป็นรูปแบบเก่า ใช้เทียบเมื่อเซิร์ฟเวอร์รุ่นเก่าหรือหน้าจัดการแสดงลายนิ้วมือ MD5

ssh-keygen -lv -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

ถ้าใส่ -v ร่วมด้วย randomart จะแสดงอีกครั้ง เป็นภาพเดียวกับที่แสดงตอนสร้างคีย์

ssh-keygen -l -f ~/.ssh/authorized_keys
256 SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com (ED25519)

ถ้าให้ไฟล์ที่มีคีย์สาธารณะหลายบรรทัดอย่าง authorized_keys จะได้ลายนิ้วมือบรรทัดละหนึ่งคีย์ ใช้วิธีนี้ตรวจว่าเซิร์ฟเวอร์ลงทะเบียนคีย์ไหนไว้บ้าง

ssh-keygen -y -f ~/.ssh/id_ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

-y ดึงคีย์สาธารณะออกจากคีย์ส่วนตัวอีกครั้ง ถ้าลบไฟล์ .pub ไปแล้วหรือย้ายเฉพาะคีย์ส่วนตัวไปคอมพิวเตอร์เครื่องอื่น ก็แค่บันทึกผลลัพธ์นี้ลงไฟล์ ผลลัพธ์ตรงกับไฟล์ .pub เดิมทุกตัวอักษร

4️⃣ ssh-keygen -p เปลี่ยนพาสเฟรส และ -c เปลี่ยนคอมเมนต์

ถ้าตั้งพาสเฟรส (passphrase) ให้คีย์ส่วนตัว แม้ไฟล์จะหลุดออกไปก็ใช้ไม่ได้ถ้าไม่มีพาสเฟรส แต่ต้องพิมพ์พาสเฟรสทุกครั้งที่เชื่อมต่อ จึงเหมาะกับคีย์ที่คนใช้เชื่อมต่อเอง และไม่เหมาะกับคีย์ของสคริปต์ที่ทำงานอัตโนมัติอย่าง cron

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "" -N "example-pass"
Key has comment 'user@example.com'
Your identification has been saved with the new passphrase.

-P คือพาสเฟรสเดิม -N คือพาสเฟรสใหม่ คีย์นี้ไม่มีพาสเฟรส จึงให้ -P เป็นเครื่องหมายคำพูดว่าง และมีสองบรรทัดบอกว่าบันทึกใหม่ด้วยพาสเฟรสใหม่แล้ว คู่มือระบุว่าถ้าใช้ -p อย่างเดียวโดยไม่มีตัวเลือก จะถามพาสเฟรสเดิมและพาสเฟรสใหม่ตามลำดับ

ls -l ~/.ssh/id_ed25519
-rw------- 1 user user 464 Oct 29 08:22 /home/user/.ssh/id_ed25519

หลังตั้งพาสเฟรส ไฟล์คีย์ส่วนตัวขยายจาก 411 เป็น 464 ไบต์

ssh-keygen -y -f ~/.ssh/id_ed25519 -P "example-pass"
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com
ssh-keygen -y -f ~/.ssh/id_ed25519 -P "wrongpass"
Load key "/home/user/.ssh/id_ed25519": incorrect passphrase supplied to decrypt private key

คีย์ที่มีพาสเฟรส แม้ใช้ -y ก็ต้องส่งพาสเฟรสด้วย -P พาสเฟรสถูกได้คีย์สาธารณะเหมือนเดิม ส่วนพาสเฟรสผิดจบด้วยข้อผิดพลาด incorrect passphrase คู่มือระบุว่าไม่มีวิธีกู้พาสเฟรสที่ลืม ถ้าลืมจึงต้องสร้างคีย์ใหม่และลงทะเบียนคีย์สาธารณะใหม่

ssh-keygen -c -C "user@laptop" -f ~/.ssh/id_ed25519 -P "example-pass"
Old comment: user@example.com
Comment 'user@laptop' applied
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@laptop

-c ใช้เปลี่ยนคอมเมนต์ คอมเมนต์เดิมและคอมเมนต์ใหม่แสดงบรรทัดละอัน และคอมเมนต์ท้ายไฟล์คีย์สาธารณะก็เปลี่ยนเป็น user@laptop ด้วย คอมเมนต์เป็นแค่ป้ายแยกคีย์ ค่าคีย์จึงยังเหมือนเดิม

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "example-pass" -N ""
Key has comment 'user@laptop'
Your identification has been saved with the new passphrase.

ถ้าจะเอาพาสเฟรสออก ให้ใส่เครื่องหมายคำพูดว่างที่ -N จะมีสองบรรทัดเดิมขึ้นมา และหลังจากนั้น -y ก็รันได้อีกโดยไม่ต้องใช้ -P

5️⃣ ssh-keygen -R ลบโฮสต์คีย์ใน known_hosts

known_hosts จะสะสมโฮสต์คีย์ของเซิร์ฟเวอร์ที่เคยเชื่อมต่อไว้บรรทัดละเครื่อง ถ้าติดตั้งเซิร์ฟเวอร์ใหม่จนโฮสต์คีย์เปลี่ยน ssh จะปฏิเสธการเชื่อมต่อเพราะคีย์ไม่ตรงกับที่บันทึกไว้ ตัวเลือกที่ใช้ลบบรรทัดเดิมคือ -R ไฟล์ known_hosts ด้านล่างสร้างจากที่อยู่ตัวอย่างสามบรรทัด และระบุไฟล์ด้วย -f

cat ~/.ssh/known_hosts
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

แต่ละบรรทัดเรียงเป็นชื่อโฮสต์หรือที่อยู่ ชนิดคีย์ และค่าคีย์ บรรทัดที่สองที่เชื่อมด้วยจุลภาคคือชื่อและที่อยู่ของเซิร์ฟเวอร์เดียวกัน ส่วนวงเล็บเหลี่ยมกับเครื่องหมายทวิภาคในบรรทัดที่สามหมายถึงพอร์ตที่ไม่ใช่ 22

ssh-keygen -F 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk

-F แสดงบรรทัดของโฮสต์นั้นพร้อมบอกว่าเป็นบรรทัดที่เท่าไร โฮสต์ที่ไม่มีจะไม่แสดงอะไรและจบด้วยรหัสออก 1

ssh-keygen -R 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

-R ลบบรรทัดของโฮสต์นั้นและเก็บไฟล์เดิมไว้เป็น known_hosts.old หลังลบเหลือเพียงสองบรรทัด

ssh-keygen -R 192.0.2.99 -f ~/.ssh/known_hosts
Host 192.0.2.99 not found in /home/user/.ssh/known_hosts
ssh-keygen -R "[192.0.2.30]:2222" -f ~/.ssh/known_hosts
# Host [192.0.2.30]:2222 found: line 2
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old

เมื่อระบุโฮสต์ที่ไม่มี จะได้เพียงบรรทัด not found บรรทัดเดียว เซิร์ฟเวอร์ที่ใช้พอร์ตอื่นต้องใส่วงเล็บเหลี่ยมและพอร์ตให้ตรงกับที่เขียนใน known_hosts จึงจะหาเจอ

ssh-keygen -H -f ~/.ssh/known_hosts
WARNING: /home/user/.ssh/known_hosts.old contains unhashed entries
Delete this file to ensure privacy of hostnames
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
|1|AG9QJQvGaQmVsEusSdND1lM9cKI=|Ue0a9suJIzN0yxoJgV7ClLBgSYw= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

-H แปลงชื่อโฮสต์และที่อยู่เป็นแฮช เป็นตัวเลือกที่ทำให้แม้ไฟล์หลุดออกไปก็ไม่รู้ว่าเคยเชื่อมต่อเซิร์ฟเวอร์ไหน ชื่อกับที่อยู่ที่เคยเชื่อมด้วยจุลภาคแยกเป็นแฮชสองบรรทัด และมีคำเตือนว่าไฟล์ .old ยังเก็บเนื้อหาก่อนแฮชไว้ขึ้นมาด้วย

ssh-keygen -F server2.example.com -f ~/.ssh/known_hosts
# Host server2.example.com found: line 1
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

แม้ในไฟล์ที่แฮชแล้ว -F ก็ยังหาบรรทัดนั้นเจอด้วยชื่อ

6️⃣ ssh-copy-id ลงทะเบียนคีย์สาธารณะและ authorized_keys

แม้จะสร้างคีย์แล้ว ถ้าเซิร์ฟเวอร์ไม่รู้จักคีย์สาธารณะนั้น การเชื่อมต่อก็ยังใช้รหัสผ่านเหมือนเดิม ที่ที่บอกให้เซิร์ฟเวอร์รู้จักคีย์สาธารณะคือ ~/.ssh/authorized_keys ของบัญชีที่จะเข้าใช้ และคำสั่งที่ใส่บรรทัด .pub ลงในไฟล์นี้คือ ssh-copy-id คีย์ส่วนตัวยังอยู่ในคอมพิวเตอร์ของคุณ มีเพียงคีย์สาธารณะหนึ่งบรรทัดที่ข้ามไป กดปุ่มขั้นตอนในไดอะแกรมด้านล่างเพื่อดูว่าไฟล์ทั้งสองอยู่ที่ไหน

🔐 ลำดับการใช้คู่คีย์จาก ssh-keygen ในการเชื่อมต่อ
แผนภาพอธิบาย
🔍 ขั้นตอน
$ ssh-keygen -t ed25519 -C user@example.comssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10ssh -i ~/.ssh/id_ed25519 user@192.0.2.10
💻 คอมพิวเตอร์ของฉัน ~/.ssh
🔒id_ed25519คีย์ส่วนตัว · ไม่ส่งออกไปข้างนอก
🔑id_ed25519.pubคีย์สาธารณะหนึ่งบรรทัด · คัดลอกไปเซิร์ฟเวอร์
➜ยังไม่มีบนเซิร์ฟเวอร์คัดลอกคีย์สาธารณะหนึ่งบรรทัดเซิร์ฟเวอร์ตรวจด้วยคีย์สาธารณะ
🖥️ เซิร์ฟเวอร์ ~/.ssh/authorized_keys
📄ว่างเข้าสู่ระบบได้ด้วยรหัสผ่านเท่านั้น
🔑ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.comคีย์สาธารณะที่ลงทะเบียนแล้ว · ผ่านได้เฉพาะคีย์ส่วนตัวที่เป็นคู่กับบรรทัดนี้
ssh-keygen สร้างคีย์ส่วนตัวและคีย์สาธารณะเป็นคู่ คีย์ส่วนตัวเก็บไว้ใน ~/.ssh ของคอมพิวเตอร์คุณเท่านั้น และคีย์สาธารณะคือหนึ่งบรรทัดในไฟล์ .pub ในขั้นนี้ยังไม่มีอะไรบนเซิร์ฟเวอร์ จึงเข้าสู่ระบบได้ด้วยรหัสผ่านเท่านั้น
ssh-copy-id ต่อคีย์สาธารณะหนึ่งบรรทัดไว้ท้าย ~/.ssh/authorized_keys ของเซิร์ฟเวอร์ คีย์ส่วนตัวไม่ถูกคัดลอก คีย์สาธารณะไม่ต้องเก็บเป็นความลับ จึงใส่บรรทัดเดียวกันในหลายเซิร์ฟเวอร์ได้
ตอนเชื่อมต่อ เซิร์ฟเวอร์ใช้คีย์สาธารณะใน authorized_keys ตรวจลายเซ็นจากคีย์ส่วนตัวของคุณ ถ้าคู่ตรงกันจะเข้าสู่ระบบได้โดยไม่ใช้รหัสผ่าน ส่วนคอมพิวเตอร์ที่ไม่มีไฟล์คีย์ส่วนตัว แม้เป็นบัญชีเดียวกันก็จะถูกถามรหัสผ่าน
ssh-copy-id -n -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: ssh: connect to host 192.0.2.10 port 22: Connection timed out

-n คือ dry-run จึงไม่เขียนอะไรลงเซิร์ฟเวอร์ แต่ ssh-copy-id จะลองเข้าสู่ระบบด้วยคีย์นั้นก่อนเพื่อคัดคีย์ที่ลงทะเบียนแล้วออก เนื่องจาก 192.0.2.10 เป็นที่อยู่สำหรับเอกสาร จึงเชื่อมต่อไม่ได้และจบด้วย timed out ตัวเลือกหลัง -o จะส่งต่อให้ ssh ตามเดิม

ssh-copy-id -n -f -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
=-=-=-=-=-=-=-=
Would have added the following key(s):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
=-=-=-=-=-=-=-=

-f คือโหมดบังคับที่ข้ามการตรวจนี้ เมื่อใช้ร่วมกับ -n คีย์สาธารณะหนึ่งบรรทัดที่จะเข้าไปในเซิร์ฟเวอร์แสดงอยู่ใต้ Would have added เป็นบรรทัดเดียวกับเนื้อหาในไฟล์ .pub

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10

การลงทะเบียนจริงทำด้วยคำสั่งนี้โดยเอา -n ออก ตามสคริปต์และคู่มือของ ssh-copy-id คำสั่งนี้จะถามรหัสผ่านของบัญชีนั้นหนึ่งครั้ง ต่อคีย์สาธารณะไว้ท้าย ~/.ssh/authorized_keys ของเซิร์ฟเวอร์ แล้วแสดง Number of key(s) added: 1 ถ้าไม่มีไฟล์และโฟลเดอร์ก็จะสร้างให้ และถ้ามีคีย์เดียวกันอยู่แล้วก็จะข้ามไป

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@192.0.2.10

ถ้าพอร์ตไม่ใช่ 22 ให้ส่งด้วย -p

ในสภาพแวดล้อมที่ไม่มี ssh-copy-id ให้ต่อคีย์สาธารณะหนึ่งบรรทัดลงใน authorized_keys ของเซิร์ฟเวอร์เอง เข้าสู่ระบบเซิร์ฟเวอร์ด้วยรหัสผ่านแล้วทำตามลำดับด้านล่าง ผลลัพธ์นี้ตรวจโดยต่อไฟล์ .pub ภายในเซิร์ฟเวอร์เดียวกัน ถ้าเป็นเซิร์ฟเวอร์อื่นให้คัดลอกบรรทัดในไฟล์ .pub แล้วต่อด้วย echo

mkdir -p ~/.ssh
chmod 700 ~/.ssh

ถ้าไม่มีโฟลเดอร์ .ssh ให้สร้างขึ้นและตั้งสิทธิ์เป็น 700

cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
ls -l ~/.ssh/authorized_keys
-rw------- 1 user user 100 Oct 29 08:22 /home/user/.ssh/authorized_keys

คีย์สาธารณะหนึ่งบรรทัดเข้าไปอยู่ใน authorized_keys แล้ว และสิทธิ์คือ 600 หัวข้อ StrictModes ในคู่มือ sshd_config ระบุว่าในค่าเริ่มต้น sshd จะตรวจสิทธิ์ไฟล์ของผู้ใช้ก่อน และถ้าเป็นสิทธิ์ที่ใครก็เขียนได้จะไม่ยอมให้เข้าสู่ระบบ

ssh -i ~/.ssh/id_ed25519 user@192.0.2.10

เมื่อลงทะเบียนเสร็จให้เชื่อมต่อด้วยคีย์ส่วนตัว ถ้าคีย์ใช้ชื่อเริ่มต้นอย่าง id_ed25519 ssh จะหาเจอเอง แต่ถ้าเป็นชื่ออื่นอย่าง deploy_key ให้ระบุไฟล์ด้วย ตัวเลือก ssh -iตอนเชื่อมต่อ

🔲 ตัวจำลองคำสั่ง ssh-keygen

ในตัวจำลองด้านล่าง คุณพิมพ์ ssh-keygen เองเพื่อสร้างคีย์ ตรวจลายนิ้วมือ เปลี่ยนพาสเฟรส จัดการ known_hosts ไปจนถึง ssh-copy-id ได้ ลายนิ้วมือและคีย์สาธารณะเป็นค่าตัวอย่างเดียวกับในบทความ และ ssh-copy-id แค่จำลองการลงทะเบียนบนเซิร์ฟเวอร์เสมือนเท่านั้น

ตัวจำลองคำสั่ง ssh-keygenOpenSSH 9.9p1 · user
[root@server work]#
ใช้ปุ่ม ↑↓ บนแป้นพิมพ์เพื่อเรียกคำสั่งที่พิมพ์ไว้ก่อนหน้ากลับมา

🔢 FAQ & เนื้อหาแนะนำ

ค่าเริ่มต้นของ ssh-keygen คือ ed25519 และคีย์สั้น คีย์สาธารณะหนึ่งบรรทัดมีขนาด 98 ไบต์ ส่วน rsa 4096 บิตมีคีย์สาธารณะ 742 ไบต์ ใช้ตอนเชื่อมต่อเซิร์ฟเวอร์หรืออุปกรณ์รุ่นเก่าที่ไม่รองรับ ed25519

ได้ ตามคู่มือ ssh ระบุว่า ssh จะหาอัตโนมัติเฉพาะชื่อเริ่มต้นอย่าง ~/.ssh/id_ed25519 และ ~/.ssh/id_rsa ชื่ออื่นจึงต้องระบุด้วย -i ตอนเชื่อมต่อ หรือเขียนไว้ที่ IdentityFile ใน ~/.ssh/config

ตามคู่มือ sshd_config ให้เปลี่ยน PasswordAuthentication เป็น no แล้วให้ sshd อ่านการตั้งค่าใหม่ ปิดหลังจากยืนยันในเทอร์มินัลอีกหน้าต่างก่อนว่าเข้าด้วยคีย์ได้ ถ้าปิดก่อนตรวจ อาจเข้าไม่ได้ทั้งด้วยรหัสผ่านและคีย์จนถูกล็อกอยู่นอกเซิร์ฟเวอร์

🔗 เนื้อหาแนะนำ
ขั้นต่อไป วิธีเชื่อมต่อ Cloudways ผ่าน SFTP & SSH: ตั้งค่า FileZilla และลงทะเบียน SSH Key นำการเชื่อมต่อ SFTP ด้วย FileZilla และเทอร์มินัล SSH บนเว็บ·PowerShell มาไว้ในตัวจำลอง และตรวจการลงทะเบียน SSH Key กับ IP Whitelist บนเซิร์ฟเวอร์ทดสอบ อ่านบทความ → การเชื่อมต่อ SFTP ของ Cloudways – หน้าจอตัวจำลอง FileZilla
🪐อ้างอิงแหล่งทางการ 2

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 8   +   5   =