Làm cách nào để ký các tệp bằng các công cụ dòng lệnh Ubuntu và các khóa riêng của tôi?


14

Tôi muốn ký một số tệp mã Python tôi đã viết, vì chúng là các mô-đun bổ trợ cho một trong các dự án của tôi. Để phân phối nó, tôi muốn người dùng có thể chắc chắn rằng một trình cắm được xác minh và an toàn (vì được viết bởi tôi hoặc ai đó mà tôi tin tưởng) và không bị sửa đổi.

Phần mềm này chỉ là một dự án sở thích nguồn mở, do đó tôi không muốn chi bất kỳ khoản tiền nào để mua chứng chỉ chính thức. Thay vào đó, tôi cho rằng chương trình chính luôn hợp lệ và có thể tin cậy mà không cần xác minh thêm. Nếu ai đó tải xuống từ bất kỳ vị trí nào khác ngoài kho GitHub của tôi, đó là lỗi của họ.

Từ những gì tôi đã đọc, việc ký thường được thực hiện bằng cách tạo cặp khóa bất đối xứng, tính toán giá trị băm mật mã mạnh (ví dụ SHA-512) từ tệp mã, mã hóa hàm băm bằng khóa riêng của tôi và lưu chữ ký đó trong một tệp riêng để được vận chuyển với các tập tin mã gốc.
Sau đó, chương trình chính sẽ phải giải mã chữ ký bằng khóa chung được lưu dưới dạng văn bản thuần trong mã nguồn của chương trình chính, tính toán hàm băm tương tự của tệp mã và sau đó so sánh nó với mã được giải mã. Nếu chúng khớp, trình cắm có thể được tin cậy.

Vì vậy, bây giờ câu hỏi của tôi:

Làm cách nào để tôi dễ dàng tạo một cặp khóa bất đối xứng mạnh mẽ với các công cụ Ubuntu và làm cách nào để tôi dễ dàng tính toán giá trị băm mật mã của một tệp?
Tự động hóa quá trình ký trong một tập lệnh (sử dụng luôn cùng một khóa) sẽ rất tuyệt.

Câu trả lời:


19

Phần lớn câu trả lời này được trích xuất từ tài liệu Arch Wikitài liệu GnuPG . Bất kỳ khuyến nghị nào trong câu trả lời này hoàn toàn là ý kiến ​​của tôi, và nên được thực hiện với một tấn muối.

Tạo khóa PGP

GUI

  1. Mở ứng dụng Mật khẩu và Khóa (còn gọi là seahorse) và nhấp +(hoặc đi tới Tệp -> Mới hoặc nhấn CtrlN) để xem:

    hộp thoại mục mới cho Seahorse

  2. Chọn khóa PGP và nhập thông tin của bạn. Tôi đang mạo danh Chỉ huy Byte:

    hộp thoại chi tiết chính

    RSA và 2048 bit là tốt cho hầu hết các mục đích. Nếu bạn chỉ muốn sử dụng nó để ký, hãy chọn tùy chọn RSA (chỉ ký) từ menu thả xuống, nhưng bạn không cần phải - điều này có thể được xử lý bằng cách sử dụng khóa con . Bạn có thể để lại nhận xét. Giữ một ngày hết hạn trên chìa khóa của bạn cũng hữu ích. Nhấn vào đây Create.

  3. Nhập một mật khẩu dài phù hợp (và ý tôi là dài , ví dụ của tôi là ngắn, IMO) và nhấp Ok:

    hộp thoại nhập mật khẩu

    Seahorse dường như không có bất kỳ phản hồi nào, không giống như CLI. Đợi một lúc, làm bất cứ điều gì bạn muốn làm, trong khi nó tập hợp entropy và tạo một khóa. Nó có thể mất một thời gian. Sau đó, bạn sẽ thấy khóa của họ trong phần Khóa PGP :

    danh sách các khóa pgp

CLI

Để tạo khóa từ dòng lệnh, chỉ cần chạy gpg --gen-key. Nó sẽ hỏi bạn các chi tiết giống như GUI đã làm:

$ gpg --gen-key 
gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tuesday 27 September 2016 03:45:19 PM IST
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and E-mail Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Byte Commander
E-mail address: byte@command.er
Comment: 
You selected this USER-ID:
    "Byte Commander <byte@command.er>"

Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.

passphrase not correctly repeated; try again.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 186 more bytes)
.....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 80 more bytes)
....+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 83 more bytes)
...+++++
gpg: key 8AE670A6 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2016-09-26
pub   2048R/8AE670A6 2015-09-28 [expires: 2016-09-27]
      Key fingerprint = 82D9 0644 B265 8E75 1E01  538B B479 3CF4 8AE6 70A6
uid                  Byte Commander <byte@command.er>
sub   2048R/0E2F4FD8 2015-09-28 [expires: 2016-09-27]

Lưu ý cách GnuPG cho chúng ta biết nó cần nhiều entropy hơn. Ước gì cá ngựa cũng vậy. Nhưng một lần nữa, có cảm giác như GnuPG đang hành động như Oliver Twist. : P

Xuất bản chìa khóa của bạn

Bây giờ, chúng tôi cần lấy khóa công khai của mình ra khỏi đó, để mọi người có thể xác minh mọi thứ bằng cách sử dụng nó.

GUI

Quay trở lại danh sách các khóa PGP trong seahorseứng dụng (xem ảnh chụp màn hình cuối cùng). Chọn (các) khóa bạn muốn xuất và trong menu Từ xa , chọn Khóa đồng bộ hóa và Xuất bản :

nhập mô tả hình ảnh ở đây

Các Syncnút sẽ bị vô hiệu hóa nếu bạn chưa chọn một máy chủ để phát hành tới. Làm như vậy, bằng cách nhấp vào Key Serversnút:

nhập mô tả hình ảnh ở đây

Tôi đã chọn máy chủ của Ubuntu.

Bây giờ, bạn có thể nhấp vào Syncnút và xuất bản nó tới máy chủ khóa của Ubuntu (xin lỗi vì spam, Ubuntu!).

CLI

Với CLI, bạn cần ID khóa của khóa bạn muốn xuất bản. Đây là dòng cuối cùng của đầu ra khi tạo khóa ( 8AE670A6). Nếu bạn không nhớ nó là gì, chỉ cần chạy gpg --list-keys. Xuất bản:

$ gpg  --keyserver pgp.mit.edu --send-keys 8AE670A6
gpg: sending key 8AE670A6 to hkp server pgp.mit.edu

Xin lỗi, MIT .

Ký kết

Tôi chưa biết phương pháp GUI thuận tiện để ký tài liệu.

Khi bạn đã tạo tệp bạn muốn đăng nhập, hãy đi đến thiết bị đầu cuối. Hãy thử gpg --list-keys:

$ gpg --list-keys       
/home/muru/.gnupg/pubring.gpg
---------------------------
pub   2048R/F7878B0C 2015-09-28 [expires: 2016-09-26]
uid                  Byte Commander <byte@command.er>
sub   2048R/345B9A4F 2015-09-28 [expires: 2016-09-26]

Bạn có thể ký vào tệp bằng hai phương pháp:

Ký bằng mã hóa

$ gpg --sign --output examples.sig examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

gpg: Invalid passphrase; please try again ...

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

Nếu bạn đang ở trong phiên làm việc trên máy tính để bàn, rất có thể bạn sẽ được chào đón bằng lời nhắc mật khẩu đồ họa. Ví dụ: trong Gnome:

nhập mô tả hình ảnh ở đây

Nếu người nhận có khóa công khai của bạn, họ có thể xác minh hoặc nhận nội dung được giải mã:

$ gpg --verify examples.sig
gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"
$ gpg --decrypt examples.sig
[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

gpg: Signature made Monday 28 September 2015 03:25:00 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

Ký kết với Cleartext

Bạn có thể không muốn mã hóa nội dung, ví dụ như khi gửi thư. Trong trường hợp đó, sử dụng --clearsigntùy chọn:

$ gpg --clearsign examples.desktop 

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ cat examples.desktop.asc 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[Desktop Entry]
Version=1.0
Type=Link
Name=Examples
Name[aa]=Ceelallo
...
URL=file:///usr/share/example-content/
Icon=folder
X-Ubuntu-Gettext-Domain=example-content

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAEBAgAGBQJWCRAaAAoJEGUZkqX3h4sMBWsH/1yw+G0v5Ck+T3PBS90SkvC8
5C0FJeGVr0AgYQohhsE3zEGQ7nn53N7JsvNlF6VccvN99DZIp18JbrJ+qs5hWjtg
KU/ACleR5dvVrJgfjppkuC8Q3cAudvqciKlLjA7Xycr3P49oCNCy8k/ue2TrgCvS
mMb5IS/kqpO7wrOMBAR0c/2CjQsA91S1/YK7DbuUqeNgEzW1grsI7XZPhiDGpAib
D20HWrbdLhklAEJuo1EvuOIggW6MF6ksxDoVapsUzQalD0TWEq6OnvzIS5qhITrc
XaDPQJpiHyCyINnL5aZCUwr2uon7osJ+2a8Ahp1REpzIZTdND9jA5NWSel5+yAs=
=ZrtB
-----END PGP SIGNATURE-----

Ký, với một tệp riêng cho chữ ký (chữ ký tách rời)

Cuối cùng, đối với một số tệp, bạn không thể có chữ ký trong tài liệu. Ví dụ: đóng gói các tệp hoặc siêu dữ liệu cho kho lưu trữ, cả hai đều có nội dung có tính chất cụ thể không dễ dàng cho phép chữ ký nhúng. Trong trường hợp này, bạn sử dụng --detached-sigtùy chọn:

$ gpg --output examples.desktop.sig --detach-sign examples.desktop

You need a passphrase to unlock the secret key for
user: "Byte Commander <byte@command.er>"
2048-bit RSA key, ID F7878B0C, created 2015-09-28

$ gpg --verify examples.desktop.sig examples.desktop
gpg: Signature made Monday 28 September 2015 03:35:55 PM IST using RSA key ID F7878B0C
gpg: Good signature from "Byte Commander <byte@command.er>"

Ghi chú

Trong mã hóa + ký và chữ ký tách rời, đầu ra của gpglà nhị phân. Bạn có thể có dữ liệu được mã hóa cơ sở đầu ra G64PG bằng cách sử dụng --armortùy chọn (ASCII-bọc thép).

Tự động hóa

Để ký kịch bản, bạn có thể:

  • sử dụng cụm mật khẩu trống cho khóa
  • tùy thuộc vào phiên bản GnuPG của bạn, hãy gửi cụm mật khẩu qua stdin. Xem bài viết Unix & Linux này để biết một số tùy chọn.

Câu trả lời rất hay và chi tiết. Nhưng về các khóa ví dụ bạn đã tạo ... Tôi không biết liệu tôi có quá vui về thực tế là một bộ các khóa không sử dụng cho bút danh của tôi đang được đặt xung quanh không. Nếu tôi muốn tạo khóa thực với tên đó sau đó và sử dụng chúng, mọi người tìm kiếm chúng có thể bị nhầm lẫn. Tôi đoán các khóa mẫu của bạn và các khóa thực sự của tôi sẽ có thể cùng tồn tại do các địa chỉ email khác nhau và do đó có được một ID khác nhau, nhưng vẫn ... Bạn có thể xóa các khóa đó một lần nữa không?
Chỉ huy Byte

@ByteCommander thuật ngữ bị thu hồi . Tôi sẽ xem xét thu hồi chúng. Đối với vấn đề đó, tôi nên thêm một phần về việc thu hồi các khóa.
muru

@ByteCommander xin lỗi, tôi đã xóa khóa tôi đã xuất bản (và chưa tạo chứng nhận hủy bỏ (lỗi n00b cổ điển), vì vậy tôi không thể thu hồi khóa đó. Tuy nhiên, nó đã hết hạn một năm, vì vậy, tốt, mọi sự nhầm lẫn sẽ được giải quyết trong một năm.
muru

Được rồi, tốt - điều đó xảy ra. Không chắc tôi có nên bực mình hay chỉ cười về sai lầm ngu ngốc đó ... Tôi nghĩ rằng đối với dự án của tôi, tôi sẽ chỉ sử dụng mô-đun Python rsadễ dàng cho phép ký dữ liệu mà không phải vật lộn với tất cả các công cụ GPG. Điều đó có thể trở nên rất hữu ích khi tôi bắt đầu xuất bản và đóng gói phần mềm, nhưng có lẽ chỉ là quá nhiều cho mục đích của tôi vào lúc này. Vì vậy, cho đến khi nó có thể sẽ hết hạn! :)
Chỉ huy Byte

@ByteCommander cả, tôi cho là vậy. Mặc dù tôi khuyên bạn nên sử dụng tên thật của mình khi tạo khóa và để lại nick cho trường nhận xét.
muru

4
  1. Tạo khóa bất đối xứng với gpg

    gpg --gen-key
    
  2. Sử dụng gpg để ký tệp của bạn (khóa riêng của bạn được sử dụng)

    gpg --output foo.sig --detach-sig foo.py
    
  3. Kiểm tra tệp chữ ký (khóa chung của bạn được sử dụng)

    gpg --verify foo.sig foo.py
    

    Ví dụ đầu ra

    % gpg --verify foo.sig foo.py 
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: Good signature from "Your Name <your.name@host.com>"
    
    % echo "bad" >> foo.py
    
    % gpg --verify foo.sig foo.py
    gpg: Signature made Mo 28 Sep 2015 12:46:04 CEST using RSA key ID 89B30DEC
    gpg: BAD signature from "Your Name <your.name@host.com>"
    
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.