Sidik jari kunci PEM ssh

30

Saya memiliki file PEM yang saya tambahkan ke ssh-agent yang sedang berjalan:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Bagaimana saya bisa mendapatkan sidik jari kunci (yang saya lihat di ssh-agent) langsung dari file? Saya tahu ssh-keygen -l -f some_keybekerja untuk kunci ssh "normal", tetapi tidak untuk file PEM.

Jika saya mencoba ssh-keygen pada file .pem, saya mendapatkan:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Kunci ini dimulai dengan:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

sebagai lawan dari kunci pribadi "biasa", yang terlihat seperti:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
Tidak dikenal
sumber
Mengapa Anda berpikir bahwa itu tidak berfungsi untuk file PEM? Kesalahan apa yang Anda dapatkan saat mencobanya? Sebuah .ssh/id_rsafile yang dihasilkan oleh OpenSSH menggunakan semua default IS file PEM. Kunci pribadi adalah PEM disandikan secara default. Bahkan Anda dapat menggunakan kunci RSA yang Anda hasilkan dengan OpenSSL langsung dengan OpenSSH.
Zoredache
deskripsi yang diperbarui dengan output dari ssh-keygen di .pem
Tidak diketahui
(telat tapi necroed) @Zoredache: Sebelum 7.2 (pada 2016, setelah Q ini) ssh-keygen -ltidak dapat membaca file privatekey, meskipun operasi ssh-keygen(dan ssh*) lainnya melakukannya. Tetapi ketika ssh-keygen menghasilkan kunci itu menulis baik file privatekey misalnya id_rsa dan file publickey yang sesuai dengan .pubmenambahkan misalnya id_rsa.pub. Lama ssh-keygen -l akan mencoba menambahkan .pubke nama file yang Anda tentukan dan membaca file publickey itu.
dave_thompson_085

Jawaban:

34

Jika Anda ingin mengambil sidik jari dari file kunci publik Anda yang hilang, Anda dapat memulihkannya dari file kunci pribadi :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Maka Anda dapat memastikan sidik jari publik:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

Pada beberapa sistem yang lebih baru, ini mencetak sidik jari SHA256 dari kunci tersebut. Anda dapat mencetak sidik jari MD5 dari tombol (bentuk titik dua) menggunakan opsi -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Atau sebagai satu baris perintah :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
sumber
@ MikeD jawaban sebenarnya adalah jawaban yang "benar" untuk apa yang dicari OP (dan apa yang saya cari). AWS memberikan sidik jari dalam format yang ditunjukkannya, dengan pasangan digit dipisahkan oleh titik dua. Solusinya (diambil dari halaman AWS yang disediakan) juga menghasilkan sidik jari dengan cara yang sama, sehingga Anda dapat memverifikasi dengan benar.
Mike Williamson
50

AWS " Memverifikasi Sidik Jari Pasangan Kunci Anda " menyediakan dua garis satu yang menyelesaikan masalah, tergantung pada bagaimana kunci Anda dibuat.

Jika Anda membuat pasangan kunci menggunakan AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Atau, jika Anda membuat pasangan kunci Anda dengan alat pihak ketiga:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(sidik jari redacted di output di atas)

Mike D
sumber
6

Berikut ini adalah satu baris yang harus melakukan apa yang Anda inginkan tanpa memerlukan pembuatan file kunci publik secara lokal.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Ini menggunakan string bash di sini <<<agar stdin tersedia sebagai file biasa ( /dev/stdin) daripada sebuah pipa karena ssh-keygenhanya akan beroperasi pada file.

Pada rilis 7.2 dari openssh ssh-keygen mendukung sidik jari dari input standar:

  • ssh-keygen (1): memungkinkan sidik jari dari input standar, misalnya "ssh-keygen -lf -"

Perhatikan bahwa perintah ini akan terputus dengan kunci pribadi yang menggunakan frasa sandi dan tidak menggunakan agen. Ini harus bekerja dengan file pem yang dihasilkan oleh AWS atau OpenStack yang tidak menggunakan kata sandi.

Lihat https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin untuk info lebih lanjut.

htaccess
sumber
Catatan rilis tidak mengatakan tetapi menurut sumber pada 7.2 -ljuga mendukung membaca file privatekey (tetapi tidak dari stdin).
dave_thompson_085
2

Anda tidak mendapatkan sidik jari dari file kunci pribadi tetapi dari file kunci publik.

Bahkan, ssh-keygen sudah memberi tahu Anda ini:

./query.pem bukan file kunci publik.

Jalankan melawan separuh kunci publik dan itu harus bekerja.

Lebih umum

Pikirkan tentang hal ini: alasan keberadaan sidik jari adalah Anda dapat mengidentifikasi kunci publik. Bahkan, mendapatkan hash dari kunci privat adalah masalah keamanan potensial selain menjadi tidak berguna untuk server (yang bahkan tidak MEMILIKI kunci privat yang bersangkutan).

Setelah Anda memiliki kunci publik, prosesnya adalah memverifikasi bahwa klien memiliki penangguhan pada setengah privat yang sesuai. Karena Anda sudah tahu kunci mana yang Anda coba verifikasi, Anda tidak perlu sidik jari.

Stephane
sumber
Masalahnya adalah bahwa saya tidak memiliki kunci publik untuk yang pribadi ini :( Dan satu hal lagi, ssh-keygenbekerja pada file kunci pribadi RSA yang memiliki info tambahan di awal (lihat posting awal saya), tetapi tidak pada yang ini. .
Tidak diketahui
Maka tidak ada yang bisa Anda lakukan tentang itu. Anda tidak bisa mendapatkan separuh kunci dari publik dari bagian pribadi seperti Anda tidak dapat melakukan sebaliknya.
Stephane
3
Itu tidak benar. Seperti @ominug tunjukkan di atas, ssh-keygen -yflakukan ini.
Steve Bennett
4
@Stephane Sementara benar pada tingkat RSA murni, dalam praktiknya cara kunci disimpan dalam spesifikasi PKCS format untuk kunci pribadi sebenarnya mencakup kedua kunci. Bandingkan spesifikasi untuk pribadi vs publik
Håkan Lindqvist
"Anda tidak bisa mendapatkan setengah publik dari kunci dari bagian pribadi ..." - oh ya, Anda mungkin bisa Ambil modulus dari kunci privat, dan gunakan 65537 sebagai eksponen publik, dan kemungkinan besar, Anda telah menemukan kunci publik.
Jim Flood