Bir ssh anahtarı kullanarak bir dosyayı imzalamak mümkün mü?


36

SSH kullanıyorum (kesin olarak Linux'ta OpenSSH 5.5p1). Üzerinde bir parola olan bir anahtarım var. Bunu bilgisayar işlerine giriş yapmak için kullanıyorum.

Dosyaları imzalamak için de kullanabilir miyim?

Anladığım kadarıyla bir SSH anahtarı bir RSA (veya DSA) anahtarıdır ve SSH oturum açma işlemi sırasında, sunucuya gönderilen mesajları imzalamak için kullanılır. Bu yüzden prensipte ve pratikte bir şeyleri imzalamak için kullanılabilir - aslında tek amacı budur.

Ancak görebildiğim kadarıyla, keyfi bir dosya imzalamak için anahtarı kullanmanın bir yolu yok (PGP'de olduğu gibi). Bunu yapmanın bir yolu var mı?


OpenSSH, Ed25519'u dat protokolü olarak kullanmıyor mu? Sadece bir araç meselesi gibi görünüyor.
Pablo A

Yanıtlar:


24

Bunu yalnızca OpenSSH araçlarıyla yapmanın bir yolu olmayabilir.

Ancak OpenSSL araçları ile kolayca yapılabilir. Aslında, bunu yapmanın en az iki yolu vardır. Aşağıdaki örneklerde ~/.ssh/id_rsaözel anahtarınızdır.

Bir yol dgst kullanıyor :

openssl dgst -sign ~/.ssh/id_rsa some-file

Diğeri pkeyutl kullanıyor :

openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file

Bunların her ikisi de standart çıktıya ikili bir imza yazar. dgst bir alan -heximzanın formla ilgili bazı detayları ile metin biçimini yazdırır seçeneği. pkeyutl-hexdump biraz daha az kullanışlı olan bir seçenek alır . Her ikisi de hem RSA hem de DSA anahtarlarını kabul edecektir. Çıktının formatı hakkında hiçbir fikrim yok. İki komut farklı formatlar üretir. Ben izlenimini almak pkeyutl daha modern olarak kabul edilir dgst .

Bu imzaları doğrulamak için:

openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file

ve:

openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file

Buradaki sorun şudur $PUBLIC_KEY_FILE. OpenSSL, OpenSSH'nin ortak anahtar formatını okuyamıyor, bu yüzden sadece kullanamazsınız id_rsa.pub. Birkaç seçeneğin var, hiçbiri ideal değil.

OpenSSH 5.6 veya daha yeni bir sürümüne sahipseniz, görünüşte bunu yapabilirsiniz:

ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem

Bu, OpenSSL'in okuyabileceği PEM formatında standart çıktıya ortak anahtarı yazacak.

Özel anahtarınız varsa ve bu bir RSA anahtarıysa, genel anahtarı ondan çıkarabilirsiniz (PEM kodlu özel anahtar dosyasının, genel anahtarın türetilmesi mümkün olmadığından, genel anahtarın bir kopyasını içerdiğini düşünüyorum. özel anahtarın kendisinden) ve şunu kullanın:

openssl rsa -in ~/.ssh/id_rsa -pubout

Bir DSA eşdeğeri var mı bilmiyorum. Bu yaklaşımın, özel anahtarın sahibinden, ortak anahtarı çıkartıp doğrulayıcıya göndermesi gereken bazı işbirliğini gerektirdiğini unutmayın.

Son olarak, genel anahtarı OpenSSH'den OpenSSL formatına dönüştürmek için Lars adlı bir bölüm tarafından yazılmış bir Python programını kullanabilirsiniz .


1
"Açık anahtarı özel anahtarın kendisinden türetmenin mümkün olmadığını" not etmek isterim. Uygulamada (yani, gerçekten kullanılan tüm şifreleme sistemlerinde), genel anahtar, çoğu zaman kolayca özel anahtardan türetilir.
kirelagin

@kirelagin: Bunu bilmiyordum. Bunun nasıl yapılabileceği hakkında daha fazla bilgi söyleyebilir misiniz?
Tom Anderson,

1
Bu konuyla ilgili belirli bir okuma olup olmadığından emin değilim… Sadece bir düşünelim. Herhangi bir ayrık günlük tabanlı şifreleme sistemi (ElGamal) atın. Bu durumda, özel anahtar (grup büyüklüğü, jeneratör, güç) ve genel anahtar (grup büyüklüğü, jeneratör, jeneratör ^ güç) 'dir. Yani, günlük zordur, ama güç değildir, sadece hesaplarsınız.
kirelagin

RSA durumunda bu inversiyon gerçekten zordur, ancak burada durum biraz farklıdır. Genel anahtar (n, d) ve özel anahtar (n, d ^ (- 1) mod phi (n)) 'dir. Phi (n) 'i saklamadıysanız d'yi çevirmek de zor olurdu, ama işte hile: hemen hemen herkes e = 65537 kullanıyor (bir anahtar oluşturduğunuzda bu varsayılanı değiştirme seçeneği var, ama hiç görmedim bunu kullanan herkes, pratik bir anlam ifade etmiyor çünkü), bu yüzden özel bir anahtardan bir kamu anahtarı almak önemsizdir.
kirelagin

Elliptic eğrileri ile aslında ayrık kütük ve güç ile aynı, ters çevirmek kolaydır. Bununla birlikte, diğer şifreleme sistemlerinden emin değilim, fakat bu üçü pratikte kullanılanlardan.
kirelagin

10

@ Tom'un cevabı başlamama yardımcı oldu, ancak kullanıma hazır olmadı.

Bu komutlar aşağıdakilerle çalışacaktır:

  • OpenSSL 1.0.1 14 Mar 2012
  • OpenSSH_5.9p1

Pkeyutl kullanma

# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature Verified Successfully

Dgst kullanarak

# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Verified OK

Pkeyutl sürümü yalnızca küçük boyutlu dosyaları imzalayabilir. Dgst isteğe bağlı olarak büyük dosyaları imzalayabilir, çünkü sonucu imzalamadan önce bir özet alır.


Bana da Stephen.z cevap kutusundan çıktı. İlk önce Tom'un cevabını bir süre çalmaya devam ettim ve sonunda Stephen'ın mükemmel bir cevap bulması için cevap buldum. Teşekkürler Stephen.z!
Grzegorz Wierzowiecki


Pkeyutl dosyasını yalnızca dosyanın özetini imzalamak için kullandınız mı?
Gaia

-3

Bu imzaları doğrulamak için - daha kolay çözüm:

İmzalı bir belgenin aynı olduğundan emin olmanın kolay yolu, dijital imza dosyasını yeniden oluşturmak ve ardından iki imza dosyasının aynı olup olmadığını kontrol etmek için diff'i kullanmaktır.


3
İmzaları değil , karmaşayı düşünüyorsun . Benzer, ancak aynı değil: karma yalnızca dosyanın değişmediğini doğrular; Bir imza aynı zamanda geldiğini de doğrular.
Piskvor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.