GPG - xác minh chữ ký mà không tạo chuỗi tin cậy?


19

Có thể yêu cầu gpg (hoặc gpg4win) chỉ xác minh xem một tệp đã được ký bởi một tệp khóa công khai cụ thể, mà không phải nhập và ký và tin cậy khóa đó không?

tức là một cái gì đó như

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

trái ngược với việc phải tạo khóa riêng của bạn và sau đó làm

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

1
Hãy thử xem lệnh có gpg --status-fd 1 --verify (thefile)cho đầu ra của nó dưới dạng chuỗi đầu tiên dấu vân tay của khóa tạo chữ ký không.
harrymc

Một số bối cảnh ở đây: chúng tôi có một hệ thống ký kết mọi thứ. Chúng tôi cung cấp khóa công khai cho những người có thể nhận tin nhắn từ hệ thống này để họ có thể kiểm tra xem tin nhắn không bị giả mạo. Tuy nhiên, chúng tôi không muốn nói với người nhận "tin tưởng bất cứ điều gì được ký bởi khóa này" bởi vì sau đó nó có thể được sử dụng để xác thực thư từ các hệ thống khác (ví dụ: email từ bạn bè của họ).
OJW

Vì vậy, chúng tôi muốn cung cấp cho ai đó một tệp lệnh / lô kiểm tra "gpg có nói tin nhắn này được gửi bởi khóa này không?" mà không can thiệp vào việc sử dụng gpg hàng ngày của họ để giao tiếp với người khác. Khóa chỉ nên được tin cậy vì dòng lệnh yêu cầu nó chứ không phải vì GPG đã được thông báo là luôn tin tưởng nó.
OJW

Câu trả lời:


14

Bạn phải có khóa chung để xác minh chữ ký được tạo bằng khóa riêng tương ứng, nhưng bạn không phải ký hoặc thậm chí ký tên cục bộ. Trong trường hợp này, bạn sẽ nhận được cảnh báo từ GPG rằng khóa không đáng tin cậy.

Đây là một thử nghiệm tôi đã thực hiện với một tệp được ký bởi khóa của riêng tôi, nhưng trên một hệ thống mà khóa chưa được nhập:

[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]$ 

Thật không may, đề nghị của Harry không hoạt động, nó trích xuất thêm một chút thông tin, nhưng không đủ để sử dụng.

Như bạn có thể thấy, thông tin thu được nhiều nhất là ID khóa của khóa con được sử dụng để tạo chữ ký và thời gian chữ ký được tạo. Điều này khớp với dữ liệu có sẵn cho pgpdump (hoặc --list-gói):

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$ 

Như bạn có thể thấy nó cung cấp thuật toán băm, chi tiết về loại khóa (khóa ký của tôi là khóa con RSA 3072 bit và ID khóa của khóa con, nhưng không có gì để xác định khóa chính. tiết lộ khi bạn có khóa công khai và xác minh chữ ký.

Sau đó, tôi đã nhập khóa công khai của mình trên hệ thống đó và thử lại:

[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]$ 

Bây giờ nó có thể xác định khóa và khớp với khóa chính. Tuy nhiên, có thể giảm bớt bản chất của những cảnh báo như thế này:

[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]$ 

Vẫn có một cảnh báo rằng đó là một khóa không đáng tin cậy, nhưng không ồ ạt như vậy và việc loại bỏ tính dài dòng chỉ làm giảm nó xuống mức này:

[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]$ 

Khóa công khai là bắt buộc cho giai đoạn xác minh vì nó được sử dụng để khớp dữ liệu do người ký tạo với khóa riêng của họ. Nói một cách đơn giản, nó có thể được coi là phần bổ sung của mã hóa trong đó khóa riêng là cần thiết để giải mã dữ liệu được mã hóa thành khóa chung.

Lưu ý: Tôi đã điều chỉnh UID trong ví dụ này một chút, nhưng mọi người nhận được khóa đó sẽ thấy chúng thực sự là gì. Nếu không, đầu ra là một bản sao thẳng và dán.

EDIT: Bạn có thể gọi tệp khóa công khai trực tiếp như khóa, nếu bạn có nó ở định dạng bọc thép không phải ASCII (tức là tệp .gpg thay vì tệp .asc). Mặc dù vậy, bạn vẫn cần khóa công khai. Để làm điều này, lệnh là như thế này:

[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 ~]$ 

Nhìn vào đầu ra của bạn, tôi đã đi đến kết luận hoàn toàn ngược lại. Tôi đã sử dụng đầu ra của bạn trong câu trả lời của tôi, nhưng đã cho bạn tín dụng cho nó.
harrymc

Phần bạn đề cập đến là dạng dài của ID khóa của khóa con (về mặt kỹ thuật, ID khóa đầy đủ dấu vân tay) là phần duy nhất có thể nhận dạng được. Tuy nhiên, nếu không sở hữu khóa chung, bạn không thể xác định khóa chính hoặc xác minh chữ ký. Các chi tiết của điều này nằm trong phần 5.2 của RFC 4880 (với một chút trong phần 2.2, nhưng 5.2 là nơi chứa những thứ hữu ích). Nếu tôi sai chứng minh xác minh mà không có bản sao của khóa (gợi ý: bạn không thể làm điều đó với các ví dụ của tôi).
Ben

Ngoài ra, theo kết luận của bạn về --verify, nó chỉ hoạt động khi khóa có sẵn, nếu không hãy quay lại ví dụ đầu tiên trong câu trả lời của tôi nơi ID khóa và thời gian của chữ ký được xác minh, nhưng không tìm thấy khóa.
Ben

Có, nhận dạng đầy đủ tất nhiên là không thể chỉ từ ID khóa. Tôi đã sửa đổi câu trả lời của mình để nói rõ rằng đây chỉ là một heuristic. Kết luận của bạn là những gì người đăng yêu cầu là không thể, nhưng đó có lẽ là do người đăng đã sử dụng từ "xác minh" quá mạnh.
harrymc

1
Đó là sự thật, OP có thể không sử dụng đúng thuật ngữ và tôi cũng có thể đã làm mờ chúng ở một vài nơi (tôi đã hắt hơi rất nhiều đêm qua). Nếu câu hỏi của anh ta chỉ là về việc xác nhận sig mà không cần nhập khóa, thì ví dụ trong chỉnh sửa của tôi cho thấy cách thực hiện, nhưng chỉ khi khóa đó ở định dạng OpenPGP (pubkey.gpg). Nó không hoạt động nếu khóa xuất ở định dạng bọc thép ASCII (pubkey.asc).
Ben

2

Nếu bạn đồng ý với việc vận chuyển khóa, thay vì tệp khóa công khai, có lẽ bạn muốn sử dụng gpgvthay vì gpg:

gpgv --keyring key.ring somefile.txt

0

Nếu từ "xác minh" trong câu hỏi của bạn có nghĩa là "xác minh hoàn toàn", thì dĩ nhiên phải nhập khóa công khai để xác minh hoàn toàn tài liệu đã ký. Tuy nhiên, nếu điều này có nghĩa là "xác định", thì tôi mô tả bên dưới một heuristic có thể cho biết liệu một nhóm tài liệu có được ký bởi cùng một chữ ký hay không.

Theo các thử nghiệm được thực hiện bởi @Ben để xác minh nhận xét của tôi, có khả năng lệnh sau có thể được sử dụng để chỉ định heuristally cho khóa ký:

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

Bài kiểm tra của Ben đã cho kết quả dưới đây. Đáng chú ý là các giá trị của ERRSIG và NO_PUBKEY, và cũng là giá trị của "ID khóa RSA" được chứa một phần trong cả hai, như sau:

[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

Lưu ý trên chuỗi 7FF2D37135C7553C. Chuỗi tương tự này được tìm thấy bên trong dấu vân tay khóa được báo cáo khi khóa được nhập:

[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

Chuỗi này được tìm thấy là phần dưới của dấu vân tay (Subkey ở trên), vì vậy có thể có thể được sử dụng để xác định khóa. "Dấu vân tay chính" có lẽ cũng nên được xác minh, ngoài Subkey.

Chuỗi "ID khóa RSA" giống hệt nhau ở cả hai đầu ra và cũng được tìm thấy như là phần cuối cùng của dấu vân tay, do đó có thể tự nó đủ để xác định chữ ký. Nếu đó là trường hợp, chỉ sử dụng đầu ra của gpg --verifycó thể đủ để xác định chữ ký một cách đơn giản hơn.

[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

Kiến thức về GPG của tôi không đủ để xác nhận đầy đủ phương pháp này, vì vậy bạn nên thử nó trên các tệp ví dụ khác. Nếu nó hoạt động, sau đó bạn có thể sắp xếp các tệp theo chữ ký của họ, nhưng sẽ cần nhập khóa để tìm danh tính của người đăng ký.

Để nói rõ lại: Phương pháp này không thể xác định đầy đủ chữ ký. Nó chỉ là một cách để sắp xếp heuristur các tài liệu đã ký.


Một chữ ký chứa đủ dữ liệu để xác định khóa được sử dụng để tạo nó và kết hợp với các máy chủ khóa, nó có thể được sử dụng để xác định khóa chính (giả sử một khóa con ký được sử dụng như trong ví dụ của tôi). Nếu không có bản sao của khóa chung ở định dạng OpenPGP (theo khóa hoặc như trong ví dụ cuối cùng của tôi), việc xác thực chữ ký là không thể vì ID vân tay / khóa không đủ dữ liệu để tính toán.
Ben

@Ben: Tôi nhắc lại rằng đây chỉ là một heuristic, đây là cách tốt nhất có thể được thực hiện để trả lời câu hỏi của người đăng bài "xác minh xem một tệp có được ký bởi một tệp khóa công khai cụ thể không mà không phải nhập và ký và tin vào khóa đó ".
harrymc

nó sẽ làm cho câu hỏi trở nên rõ ràng hơn nếu tôi nói rằng chúng tôi tin tưởng bất kỳ khóa nào trong tệp .pub (cho mục đích kiểm tra tệp dữ liệu cụ thể này) và lý do tại sao chúng tôi chọn tin tưởng tệp .pub này nằm ngoài phạm vi của hoạt động GPG nào?
OJW

Các heuristic của việc liệt kê các khóa trong tệp .pub và so sánh ID khóa RSA của chúng có hữu ích không? Tôi không có gpg ở đây để thử, nhưng có lẽ một cái gì đó như "gpg --no-default-keyring --keyring <pub-file> --list-key".
harrymc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.