GPG - güven zinciri oluşturmadan imzaları doğrulama?


16

Gpg'den (veya gpg4win) bir dosyanın belirli bir ortak anahtar dosyası tarafından imzalanıp imzalanmadığını, o anahtarı içe aktarıp imzalamak ve güvenmek zorunda kalmadan doğrulamasını istemek mümkün mü?

yani bir şey gibi

gpg --using-key pubkey.txt --verify message.txt

kendi özel anahtarınızı oluşturmak zorunda kalmanın aksine

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt

1
Komutun gpg --status-fd 1 --verify (thefile)çıktısında ilk dizgede imzayı oluşturan tuşun parmak izini verip vermediğini görmeye çalışın .
harrymc

Buradaki bazı bağlamlar: Bir şeyleri imzalayan bir sistemimiz var. Bu sistemden mesaj alabilecek kişilere ortak anahtar veriyoruz, böylece mesajların tahrif edilmediğini kontrol edebiliyorlar. Bununla birlikte, alıcılara " bu anahtarla imzalanan herhangi bir şeye güvenme" demelerini istemiyoruz çünkü diğer sistemlerden (örneğin arkadaşlarından gelen e-postalar) gelen iletilerin kimliğini doğrulamak için kullanılabilir.
OJW

Bu yüzden birisine "gpg bu mesajın bu anahtar tarafından gönderildiğini söylüyor mu?" Diye kontrol eden bir komut / toplu iş dosyası vermek istiyoruz. Diğer insanlarla iletişim kurmak için günlük gpg kullanımlarını engellemeden. Anahtar, yalnızca komut satırından istediği için güvenilir olmalı, GPG'ye her zaman güvendiği söylendiğinden değil.
OJW

Yanıtlar:


13

İlgili özel anahtarla yapılan bir imzayı doğrulamak için ortak anahtara sahip olmalısınız, ancak anahtarı imzalamanız veya yerel olarak imzalamanız gerekmez. Bu durumda, GPG'den anahtarın güvenilmeyen olduğuna dair bir uyarı alırsınız.

İşte kendi anahtarım tarafından imzalanmış bir dosyayla ancak anahtarın içe aktarılmadığı bir sistemde yaptığım bir test:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

Ne yazık ki Harry'nin önerisi işe yaramıyor, biraz daha fazla bilgi çıkartıyor, ancak kullanım için yeterli değil.

Görebileceğiniz gibi, elde edilen en fazla bilgi, imzayı yapmak için kullanılan alt anahtarın anahtar kimliği ve imzanın yapıldığı zamandır. Bu, pgpdump (veya --list-packets) için mevcut olan verilerle eşleşir:

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

Gördüğünüz gibi, hash algoritması sağlar, anahtar türünün ayrıntıları (imzalama anahtarım 3072 bitlik bir RSA alt anahtarı ve alt anahtarın anahtar kimliğidir, ancak ana anahtarı tanımlayacak hiçbir şey yoktur. Açık anahtar olduğunda ve imzayı doğruladığınızda

Sonra genel anahtarımı bu sisteme aktardım ve tekrar denedim:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Artık anahtarı tanımlayıp birincil anahtarla eşleştirebiliyor. Bununla birlikte, bu gibi uyarıların niteliğini azaltmak mümkündür:

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Hala güvenilmeyen bir anahtar olduğuna dair bir uyarı var, ancak büyük ölçüde değil ve ayrıntıların kaldırılması yalnızca bunu azaltıyor:

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

Doğrulama aşaması için ortak anahtar gereklidir, çünkü imzalayan tarafından oluşturulan verileri özel anahtarlarıyla eşleştirmek için kullanılır. Basit bir ifadeyle, genel anahtara şifrelenmiş verilerini işlemek için özel anahtara ihtiyaç duyulan şifrelemenin tamamlayıcısı olarak düşünülebilir.

Not: Bu örnekte UID'leri biraz değiştirdim, ancak bu anahtarı alan herkes gerçekte ne olduklarını görecek. Aksi halde çıktı, düz bir kopyala yapıştırtır.

DÜZENLEME: Eğer ASCII olmayan bir zırhlı formatta (yani .asc dosyası yerine .gpg dosyası) varsa, genel anahtar dosyasını doğrudan bir anahtarlık gibi çağırabilirsiniz. Yine de, ortak anahtara ihtiyacınız var. Bunu yapmak için komut bu gibidir:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 

Çıktınıza baktığımda, tam tersi bir sonuca vardım. Cevabımdaki çıktınızı kullandım ancak size kredi verdim.
harrymc 26:13

Bahsettiğiniz kısım alt anahtar kilit kimliğinin uzun biçim (teknik dolu anahtar kimliktir hangi olduğu parmak izi) sadece tanımlanabilir bir parçasıdır. Açık anahtarına sahip olmadan olsa da, sen olamaz ana anahtarı tanımlamak veya imzayı doğrulamak. Bunun detayları RFC 4880'in 5.2 bölümünde (biraz 2.2 bölümünde, ancak 5.2'de işe yarar malzemenin olduğu yerde). Eğer hatalıysam, anahtarın bir kopyası olmadan doğrulamayı ispatla (ipucu: örnekleri ile yapamazsın).
Ben

Ayrıca, --verify ile ilgili sonuçlarınızda, sadece anahtar bulunduğunda çalışır, aksi halde cevabımdaki anahtar kimliğinin ve zamanın doğrulandığı ancak anahtarın bulunmadığı ilk örneğe geri dönün.
Ben

Evet, tam tanımlama elbette ki sadece anahtar ID'den mümkün değildir. Cevabımı, bunun yalnızca bir sezgisel olduğunu açıkça belirtmek için değiştirdim. Sonuç, posterin sorduğu şeyin imkansız olduğu, ancak bunun nedeni posterin çok güçlü olan "doğrulama" kelimesini kullanmasıdır.
harrymc

1
Bu doğru, OP muhtemelen terimleri düzgün kullanmıyordur ve ben de onları birkaç yerde karıştırmış olabilirim ( dün gece çok hapşırıyordum ). Sorusu bir anahtarı içe aktarmadan hemen önce bir onay işaretini doğrulamakla ilgiliyse , düzenlememdeki örnek nasıl yapılabileceğini gösterir, ancak yalnızca bu anahtar OpenPGP (pubkey.gpg) biçimindeyse gösterir. Verilen anahtar ASCII zırhlı (pubkey.asc) formatındaysa işe yaramaz.
Ben

2

Genel bir anahtar dosyası yerine bir anahtarlık göndermekte sorun yaşarsanız, muhtemelen kullanmak gpgvyerine gpg:

gpgv --keyring key.ring somefile.txt

0

Sorunuzda "doğrula" kelimesi "kesinlikle doğrula" anlamına geliyorsa, elbette imzalı bir dokümanı tamamen doğrulamak için bir genel anahtar alınmalıdır. Bununla birlikte, eğer bu "tanımlamak" anlamına gelirse, aşağıda bir grup belgenin hepsinin aynı imza ile imzalanıp imzalanmadığını belirten bir buluşsal yazarı tanımlarım.

Yorumumu doğrulamak için @Ben tarafından yapılan testlere göre , imzalama anahtarını sezgisel olarak belirtmek için aşağıdaki komutun kullanılması olasılığı vardır:

gpg --status-fd 1 --verify thefile.gpg

Ben testi aşağıdaki sonucu verdi. Not, ERRSIG ve NO_PUBKEY değerlerinin yanı sıra, her ikisinde de kısmen bulunan "RSA anahtar kimliği" nin değerleridir:

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

Dizenin üzerinde not alın 7FF2D37135C7553C. Bu aynı dize, anahtar içe aktarıldığında bildirilen tuş parmak izinin içinde bulunur:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

Bu dize, parmak izinin alt kısmı olarak bulunur (yukarıdaki alt anahtar), bu nedenle anahtarı tanımlamak için kullanılabilir. "Birincil anahtar parmak izi", Alt Tuşa ek olarak, muhtemelen de doğrulanmalıdır.

"RSA key ID" dizgisi her iki çıktıda aynıdır ve ayrıca parmak izinin son parçası olarak bulunur, bu nedenle imzayı tanımlamak kendi başına yeterli olabilir. Bu durumda, yalnızca çıktısını kullanmak gpg --verify, imzayı daha basit bir şekilde tanımlamak için yeterli olabilir.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

GPG bilgim bu yöntemi tam olarak doğrulamak için yeterli değil, bu yüzden daha fazla örnek dosya üzerinde denemelisiniz. Çalışırsa, dosyaları imzalarına göre sıralayabilirsiniz, ancak imzalayanın kimliğini bulmak için anahtarı içe aktarmanız gerekir.

Tekrar açıkça ifade etmek için: Bu yöntem bir imzayı tam olarak tanımlayamaz. Bu sadece imzalı belgeleri buluşsal olarak sıralamanın bir yoludur.


Bir imza, onu oluşturmak için kullanılan anahtarı tanımlamak için yeterli veriyi içerir ve anahtar sunucularla birlikte ana anahtarı bulmak için kullanılabilir (bir imzalama alt anahtarının benim örneklerde kullanıldığı varsayılarak). Açık anahtarın OpenPGP formatında (bir anahtarlıkta veya son örneğimde olduğu gibi) bir kopyası olmadan imzanın doğrulanması mümkün değildir, çünkü parmak izi / anahtar kimliği bunu hesaplamak için yeterli veri değildir.
Ben

@Ben: Bunun sadece bir sezgisel olduğunu, posterin "bir dosyanın belirli bir ortak anahtar dosyası tarafından imzalanıp imzalanmadığını, bu anahtarın içe aktarılıp imzalanıp güvenilmeden doğrulandığını doğrulayın" sorusunun cevabında en iyi şekilde yapılabileceğini yineliyorum. ".
harrymc

.pub dosyasındaki herhangi bir tuşa (bu belirli veri dosyasını kontrol etmek amacıyla) güvendiğimizi ve bu .pub dosyasına güvenmeyi seçmemizin nedenlerinin kapsam dışında olduğunu söylersem soruyu daha net bir şekilde anlatabilir mi? GPG etkinliği var mı?
OJW

Anahtarları .pub dosyasında listeleme ve RSA anahtar kimliklerini karşılaştırma sezgiseli yararlı olur mu? Burada denemek için gpg yok, ama belki de "gpg - no-default-keyring - keyring <pub-file> --list-keys" gibi bir şey.
harrymc 28:13
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.