Saya menggunakan SSH (OpenSSH 5.5p1 di Linux, tepatnya). Saya memiliki kunci, di mana saya memiliki kata sandi. Saya menggunakan ini untuk login biasa ke barang-barang komputer.
Bisakah saya juga menggunakannya untuk menandatangani file?
Seperti yang saya pahami, kunci SSH adalah kunci RSA (atau DSA), dan selama proses login SSH, digunakan untuk menandatangani pesan yang dikirim ke server. Jadi pada prinsipnya dan dalam praktiknya, dapat digunakan untuk menandatangani sesuatu - memang, itulah satu-satunya tujuan.
Tapi sejauh yang saya bisa lihat, tidak ada cara untuk menggunakan kunci untuk menandatangani file yang sewenang-wenang (seperti yang Anda lakukan dengan PGP, katakan). Apakah ada cara untuk melakukan ini?
ssh
digital-signature
Tom Anderson
sumber
sumber
Jawaban:
Mungkin tidak ada cara untuk melakukan ini dengan alat OpenSSH saja.
Tapi itu bisa dilakukan dengan mudah dengan alat OpenSSL. Faktanya, setidaknya ada dua cara untuk melakukannya. Dalam contoh di bawah ini,
~/.ssh/id_rsa
adalah kunci pribadi Anda.Salah satu caranya adalah menggunakan dgst :
Yang lainnya menggunakan pkeyutl :
Keduanya menulis tanda tangan biner ke output standar. dgst mengambil
-hex
opsi akan mencetak representasi tekstual, dengan beberapa detail tentang bentuk tanda tangan. pkeyutl mengambil-hexdump
opsi yang sedikit kurang berguna. Keduanya akan menerima kunci RSA dan DSA. Saya tidak tahu apa format outputnya. Dua perintah menghasilkan format yang berbeda. Saya mendapat kesan bahwa pkeyutl dianggap lebih modern daripada dgst .Untuk memverifikasi tanda tangan itu:
dan:
Masalahnya di sini adalah
$PUBLIC_KEY_FILE
. OpenSSL tidak dapat membaca format kunci publik OpenSSH, jadi Anda tidak bisa hanya menggunakanid_rsa.pub
. Anda memiliki beberapa opsi, tidak ada yang ideal.Jika Anda memiliki versi OpenSSH 5.6 atau lebih baru, Anda dapat melakukannya:
Yang akan menulis kunci publik ke output standar dalam format PEM, yang dapat dibaca OpenSSL.
Jika Anda memiliki kunci pribadi, dan ini adalah kunci RSA, maka Anda dapat mengekstrak kunci publik darinya (saya berasumsi bahwa file kunci pribadi yang di-encode dengan PEM menyertakan salinan kunci publik, karena tidak mungkin untuk mendapatkan kunci publik dari kunci pribadi itu sendiri), dan gunakan itu:
Saya tidak tahu apakah ada yang setara dengan DSA. Perhatikan bahwa pendekatan ini memerlukan kerja sama dari pemilik kunci pribadi, yang harus mengekstrak kunci publik dan mengirimkannya ke calon verifikasi.
Terakhir, Anda dapat menggunakan program Python yang ditulis oleh chap bernama Lars untuk mengonversi kunci publik dari OpenSSH ke format OpenSSL.
sumber
Jawaban @ Tom membantu saya memulai, tetapi tidak berhasil.
Perintah-perintah ini akan bekerja dengan:
Menggunakan pkeyutl
Menggunakan dgst
Versi pkeyutl hanya dapat menandatangani file berukuran kecil. Sementara dgst dapat menandatangani file besar secara sewenang-wenang, karena butuh intisari sebelum menandatangani hasilnya.
sumber
Untuk memverifikasi tanda tangan tersebut - solusi yang lebih mudah:
Cara yang lebih mudah untuk memastikan dokumen yang ditandatangani adalah sama, adalah untuk menghasilkan kembali file tanda tangan digital dan kemudian menggunakan diff untuk memeriksa apakah kedua file tanda tangan itu sama.
sumber