มีวิธีการรับลายนิ้วมือคีย์เซิร์ฟเวอร์ SSH โดยทางโปรแกรมโดยไม่ต้องพิสูจน์ตัวตนหรือไม่?
ฉันกำลังพยายามอยู่ssh -v user@host false 2>&1 | grep "Server host key"
แต่สิ่งนี้กำลังรอรหัสผ่านหากการตรวจสอบสิทธิ์ด้วยรหัสไม่ได้ตั้งค่า
มีวิธีการรับลายนิ้วมือคีย์เซิร์ฟเวอร์ SSH โดยทางโปรแกรมโดยไม่ต้องพิสูจน์ตัวตนหรือไม่?
ฉันกำลังพยายามอยู่ssh -v user@host false 2>&1 | grep "Server host key"
แต่สิ่งนี้กำลังรอรหัสผ่านหากการตรวจสอบสิทธิ์ด้วยรหัสไม่ได้ตั้งค่า
คำตอบ:
คุณสามารถทำได้โดยการรวมssh-keyscan
และssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file
(น่าเสียดายที่ง่ายกว่าssh-keyscan host | ssh-keygen -l -f /dev/stdin
ไม่ทำงาน)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
ทำงานได้มากตามที่คาดไว้ใน ssh-keygen 7.2 ขึ้นไป มันสร้างบรรทัดความคิดเห็นบางส่วนให้กับ STDERR ที่สามารถกรองออกได้ดังที่ได้กล่าวไว้ในคำตอบโดย Anthony Geoghegan หรือssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
ฉันเพิ่งต้องทำสิ่งนี้ด้วยตัวเองดังนั้นฉันคิดว่าฉันจะเพิ่มคำตอบซึ่งแสดงให้เห็นว่าสิ่งนี้สามารถทำได้ (ด้วยOpenSSH เวอร์ชั่น 7.2 หรือใหม่กว่า ) ในหนึ่งบรรทัดโดยใช้การทดแทนกระบวนการ:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
ข้อความต่อไปนี้อธิบายการทำงานของคำสั่งเหล่านี้และเน้นถึงความแตกต่างของพฤติกรรมระหว่างยูทิลิตี้ OpenSSH เวอร์ชันเก่าและใหม่กว่า
ssh-keyscan
คำสั่งได้รับการพัฒนาเพื่อให้ผู้ใช้สามารถรับกุญแจโฮสต์ที่สาธารณะโดยไม่จำเป็นต้องตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ SSH จากหน้าคนของมัน:
ssh-keyscan
เป็นเครื่องมือสำหรับการรวบรวมกุญแจโฮสต์ ssh สาธารณะของจำนวนโฮสต์ มันถูกออกแบบมาเพื่อช่วยในการสร้างและตรวจสอบssh_known_hosts
ไฟล์
ประเภทของคีย์ที่จะดึงข้อมูลถูกระบุโดยใช้-t
ตัวเลือก
rsa1
(ล้าสมัยโปรโตคอล SSH รุ่น 1)rsa
dsa
ecdsa
(OpenSSH เวอร์ชันล่าสุด)ed25519
(OpenSSH เวอร์ชันล่าสุด)ในรุ่น OpenSSH ที่ทันสมัยประเภทคีย์เริ่มต้นที่จะดึงข้อมูลคือrsa
(ตั้งแต่รุ่น 5.1) ecdsa
(ตั้งแต่รุ่น 6.0) และed25519
(ตั้งแต่รุ่น 6.7)
ด้วยเวอร์ชันที่เก่ากว่าของssh-keyscan
(ก่อน OpenSSH เวอร์ชัน 5.1)
ประเภทคีย์เริ่มต้นคือล้าสมัยrsa1
(SSH Protocol 1) ดังนั้นประเภทคีย์จะต้องมีการระบุอย่างชัดเจน:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
พิมพ์รหัสโฮสต์ของเซิร์ฟเวอร์ SSH ใน
รูปแบบที่เข้ารหัส Base64 ในการแปลงเป็นแฮชลายนิ้วมือssh-keygen
ยูทิลิตี้นี้สามารถใช้กับ-l
ตัวเลือกเพื่อพิมพ์ลายนิ้วมือของคีย์สาธารณะที่ระบุ
หากใช้ Bash, Zsh (หรือ Korn เชลล์) การทดแทนกระบวนการสามารถใช้เป็นสายการบินเดียวที่มีประโยชน์:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
หมายเหตุ : สำหรับเวอร์ชั่นของ OpenSSH ก่อนหน้า 7.2 ฟังก์ชั่นที่ใช้
ssh-keygen
ในการอ่านไฟล์ไม่สามารถจัดการกับ pipes ที่มีชื่อ (FIFO) ได้เป็นอย่างดีดังนั้นวิธีการนี้จะไม่ทำงานดังนั้นจึงต้องใช้ไฟล์ชั่วคราว
hash ssh-keygen
พิมพ์ลายนิ้วมือของคีย์รุ่นล่าสุดของSHA256 ในการรับMD5 hash ของลายนิ้วมือคีย์เซิร์ฟเวอร์ (พฤติกรรมเก่า) -E
สามารถใช้ตัวเลือกเพื่อระบุอัลกอริทึมแฮช:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
หากใช้เชลล์ POSIX (เช่นdash
) ซึ่งไม่มีคุณสมบัติการทดแทนกระบวนการโซลูชันอื่นที่ใช้ไฟล์ชั่วคราวจะใช้งานได้ อย่างไรก็ตามด้วยเวอร์ชันที่ใหม่กว่าของ OpenSSH (ตั้งแต่ 7.2) สามารถใช้ไพพ์ไลน์แบบง่ายได้เนื่องจากssh-keygen
จะยอมรับ-
เป็นชื่อไฟล์สำหรับสตรีมอินพุตมาตรฐานอนุญาตให้ใช้คำสั่งไพพ์ไลน์แบบบรรทัดเดียว
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
จาก OpenSSH เวอร์ชันเก่ามีปัญหาในการอ่านจากไปป์ FIFO / named ฉันจะตรวจสอบเรื่องนี้ (และอัปเดตคำตอบของฉัน) เมื่อฉันมีเวลาว่าง
printf
คำสั่งการดีบักในdo_fingerprint()
ฟังก์ชั่นฉันพบว่าด้วย OpenSSH เวอร์ชันก่อน 7.2 หน้าที่ที่ใช้ssh-keygen
ในการอ่านไฟล์ไม่ได้จัดการกับไพพ์ชื่อ วิธีการแทนที่กระบวนการจะไม่ทำงาน
nmap
จัดเตรียมความสามารถนี้โดยใช้ssh-hostkey
สคริปต์
วิธีคืนลายนิ้วมือเลขฐานสิบหกของคีย์:
$ nmap [SERVER] --script ssh-hostkey
ในการส่งคืนเนื้อหาของคีย์:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
ในการส่งคืนฟองภาพของกุญแจ
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
หากต้องการส่งคืนทั้งหมดข้างต้น:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
ที่มา: เอกสาร nmap
-p
-p 22000
นอกจากนี้ยังเป็นไปได้ที่จะใช้-vv
ตัวเลือกเพื่อเพิ่มความฟุ่มเฟื่อย (จำนวนข้อมูลที่กำหนด)
filezilla แสดงคีย์ที่แฮชด้วย md5 ในรูปแบบเลขฐานสิบหก
ค้นหาสิ่งนี้บนเครื่องubuntu linuxของคุณใช้คำสั่งนี้:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
หมายเหตุ: แทนที่ "localhost" ด้วย ip ของเครื่องที่คุณต้องการตรวจสอบ
นี่คือเชลล์สคริป (ส่วนใหญ่เป็นบอร์นเชลล์ แต่ใช้local
คีย์เวิร์ดซึ่งมีอยู่ในปัจจุบันมากที่สุด/bin/sh
) ฉันได้เขียนขึ้นเพื่อทำสิ่งนี้ ssh-hostkey hostname
ใช้มันเหมือน มันจะแสดงทั้งลายนิ้วมือรูปแบบ sha256 และ md5 สำหรับโฮสต์ทั้งหมดสำหรับชื่อโฮสต์หรือที่อยู่ IP ที่กำหนด คุณสามารถระบุ " md5
" หรือ " sha256
" ด้วยตนเองเป็นอาร์กิวเมนต์ที่สองเพื่อแสดงเฉพาะรูปแบบนั้น
มันใช้ไฟล์ชั่วคราวแทนการวางท่อเพื่อให้เข้ากันได้กับแพ็คเกจ OpenSSH รุ่นเก่า (ดังที่อธิบายไว้ในคำตอบอื่น ๆ ) ไฟล์ชั่วคราวใช้/dev/shm
(หน่วยความจำที่ใช้ร่วมกัน) หากมี
#!/bin/sh
usage () {
printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}
ssh_hostkey () {
local host="$1"
local fprinthash="$2"
local tmp=
case "$host" in
-h|--help|'')
usage >&2
return 1
;;
esac
case "$fprinthash" in
md5|sha256|'') true;;
*)
usage >&2
printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
return 2
;;
esac
if test -d /dev/shm
then tmp="$(mktemp -d -p /dev/shm)"
else tmp="$(mktemp -d)"
fi
trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
case "$fprinthash" in
sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
esac
case "$fprinthash" in
md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
esac
trap - INT TERM EXIT
rm -rf "$tmp" > /dev/null 2>&1
}
ssh_hostkey "$@"
ssh-keygen -l -f - <(ssh-keyscan host)
จะใช่มั้ย