ssh-keygen: สร้างคีย์ SSH ลงทะเบียนคีย์สาธารณะ และวิธีใช้ ssh-copy-id
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_ed25519Generating 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.pubssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.comคีย์สาธารณะคือบรรทัดเดียวที่มีชนิดคีย์ ค่าคีย์ และคอมเมนต์คั่นด้วยช่องว่าง บรรทัดนี้แหละที่จะเข้าไปอยู่ใน authorized_keys ของเซิร์ฟเวอร์ที่จะเชื่อมต่อ หน้าที่ของแต่ละไฟล์ในโฟลเดอร์สรุปไว้เป็นแผนผังต้นไม้
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 | เปลี่ยนคอมเมนต์ โดยใส่คอมเมนต์ใหม่ด้วย -C | Old comment: user@example.com และ Comment 'user@laptop' applied | |
| -F โฮสต์ | หาบรรทัดของโฮสต์นั้นใน known_hosts | # Host 192.0.2.10 found: line 1 และบรรทัดนั้น | |
| -R โฮสต์ | ลบบรรทัดของโฮสต์นั้นออกจาก known_hosts | known_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.pub256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)ssh-keygen -l -f ~/.ssh/id_ed25519256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)ไฟล์คีย์สาธารณะกับไฟล์คีย์ส่วนตัวให้ลายนิ้วมือ SHA256 เดียวกัน เลข 256 ด้านหน้าคือความยาวคีย์ และวงเล็บท้ายสุดคือชนิดคีย์
ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub256 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.pub256 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_keys256 SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com (ED25519)ถ้าให้ไฟล์ที่มีคีย์สาธารณะหลายบรรทัดอย่าง authorized_keys จะได้ลายนิ้วมือบรรทัดละหนึ่งคีย์ ใช้วิธีนี้ตรวจว่าเซิร์ฟเวอร์ลงทะเบียนคีย์ไหนไว้บ้าง
ssh-keygen -y -f ~/.ssh/id_ed25519ssh-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.comssh-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' appliedcat ~/.ssh/id_ed25519.pubssh-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_hosts192.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.oldcat ~/.ssh/known_hostsserver2.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_hostsHost 192.0.2.99 not found in /home/user/.ssh/known_hostsssh-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_hostsWARNING: /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.oldcat ~/.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-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 ~/.sshchmod 700 ~/.sshถ้าไม่มีโฟลเดอร์ .ssh ให้สร้างขึ้นและตั้งสิทธิ์เป็น 700
cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keyscat ~/.ssh/authorized_keysssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.comls -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 แค่จำลองการลงทะเบียนบนเซิร์ฟเวอร์เสมือนเท่านั้น
🔢 FAQ & เนื้อหาแนะนำ
Windows · คีย์สาธารณะ
วิธีสร้างคีย์สาธารณะใน Xshell
ขั้นตอนสร้างคีย์สาธารณะด้วยตัวช่วยสร้างคีย์ของ Xshell ไคลเอนต์ SSH บน Windows แล้วลงทะเบียนบนเซิร์ฟเวอร์
SSH · การตั้งค่าเซิร์ฟเวอร์
การตั้งค่า SSH: ฟังก์ชันและการตั้งค่าไฟล์ sshd_config
บทความเรื่องการตั้งค่าพอร์ต การล็อกอิน root การยืนยันตัวตนด้วยคีย์สาธารณะ และรายการอื่นใน sshd_config ของเซิร์ฟเวอร์ฝั่งรับ
Linux · แนวคิด
SSH บน Linux: ความหมายและการตั้งค่าพื้นฐาน
SSH คืออะไร ต่างจาก Telnet อย่างไร และวิธีเปิด sshd บนเซิร์ฟเวอร์และตรวจการตั้งค่าพื้นฐาน
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน