Ubuntu 명령 줄 도구와 내 키로 파일에 서명하는 방법은 무엇입니까?


14

필자가 작성한 Python 코드 파일은 프로젝트 중 하나의 플러그인 모듈이기 때문에 서명하고 싶습니다. 배포하기 위해 사용자가 플러그인이 검증되고 안전하고 (내가 믿는 사람 또는 내가 신뢰하는 사람이 작성했기 때문에) 수정되지 않았 음을 확인할 수 있기를 바랍니다.

이 소프트웨어는 오픈 소스 취미 프로젝트 일 뿐이므로 공식 인증서를 구매하는 데 돈을 쓰고 싶지 않습니다. 대신 주 프로그램은 항상 유효하며 추가 확인없이 신뢰할 수 있다고 가정합니다. 누군가 내 GitHub 리포지토리 이외의 다른 위치에서 다운로드하면 결함입니다.

내가 읽은 것에서 서명은 일반적으로 비대칭 키 페어를 만들고 코드 파일에서 강력한 암호화 해시 값 (예 : SHA-512)을 계산하고 개인 키를 사용하여 해시를 암호화 한 다음 해당 서명을 별도의 파일에 저장하여 서명합니다. 원본 코드 파일과 함께 제공됩니다.
그런 다음 기본 프로그램은 기본 프로그램의 소스 코드에 일반 텍스트로 저장된 공개 키를 사용하여 서명을 해독하고 코드 파일의 동일한 해시 함수를 계산 한 다음 해독 된 것과 비교해야합니다. 일치하면 플러그인을 신뢰할 수 있습니다.

이제 내 질문 :

Ubuntu 도구를 사용하여 강력한 비대칭 키 페어를 쉽게 만드는 방법과 파일의 암호화 해시 값을 쉽게 계산하는 방법은 무엇입니까?
항상 같은 키를 사용하여 스크립트에서 서명 프로세스를 자동화하는 것이 좋습니다.

답변:


19

이 답변의 대부분은 Arch WikiGnuPG 문서에서 제거되었습니다 . 이 답변의 모든 권장 사항은 전적으로 제 의견이며, 소금 1 톤으로 가져와야합니다.

PGP 키 생성

GUI

  1. Passwords and Keys 앱 (일명 seahorse)을 열고 다음을 보려면 +(또는 파일 -> 새로 만들기 로 이동 하거나 CtrlN)을 누르십시오 .

    해마에 대한 새 항목 대화 상자

  2. PGP 키를 선택 하고 세부 사항을 입력하십시오. Byte Commander를 가장하고 있습니다.

    키 세부 사항 대화 상자

    RSA 및 2048 비트는 대부분의 목적에 적합합니다. 서명에만 사용하려는 경우 드롭 다운 메뉴에서 RSA (서명 만) 옵션을 선택해야하지만 반드시 그럴 필요는 없습니다 . 하위 키를 사용하여 처리 할 수 ​​있습니다 . 의견을 남길 수 있습니다. 키에 만료 날짜를 유지하는 것도 유용합니다. 를 클릭하십시오 Create.

  3. 적절하게 긴 비밀번호를 입력하고 (이는 long , 내 예제는 짧음, IMO 임) 다음을 클릭하십시오 Ok.

    비밀번호 입력 대화 상자

    Seahorse는 CLI와 달리 피드백이없는 것 같습니다. 엔트로피를 수집하고 키를 만드는 동안 원하는 시간 동안 기다립니다. 시간이 걸릴 수 있습니다. 그런 다음 PGP 키 섹션에 키가 표시됩니다 .

    pgp 키 목록

CLI

명령 행에서 키를 생성하려면을 실행하십시오 gpg --gen-key. GUI와 동일한 세부 정보를 요청합니다.

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

GnuPG가 더 많은 엔트로피를 필요로한다는 것을 주목하십시오. 소원 해마도 했어요. 그러나 GnuPG가 Oliver Twist처럼 행동하는 것처럼 느껴집니다. :피

키 공개

이제 공개 키를 가져와야 사람들이 키를 사용하여 확인할 수 있습니다.

GUI

seahorse앱 의 PGP 키 목록으로 돌아갑니다 (마지막 스크린 샷 참조). 내보낼 키를 선택하고 원격 메뉴에서 동기화 및 게시 키를 선택 하십시오 .

여기에 이미지 설명을 입력하십시오

Sync당신이 게시 할 서버를 선택하지 않은 경우 버튼이 비활성화됩니다. Key Servers버튼 을 클릭하면됩니다 :

여기에 이미지 설명을 입력하십시오

우분투 서버를 선택했습니다.

이제 Sync버튼을 클릭하여 우분투의 키 서버에 게시 할 수 있습니다 (스팸 우분투 죄송합니다!).

CLI

CLI를 사용하면 공개하려는 키의 키 ID가 필요합니다. 키를 만들 때 출력의 마지막 줄입니다 ( 8AE670A6). 내용이 기억 나지 않으면 실행하십시오 gpg --list-keys. 출판하다:

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

죄송합니다, MIT .

서명

문서에 서명하는 편리한 GUI 방법을 아직 모른다.

서명하려는 파일을 작성했으면 터미널로 이동하십시오. 시도 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]

두 가지 방법으로 파일에 서명 할 수 있습니다.

암호화로 서명

$ 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

데스크톱 세션을 사용하는 경우 그래픽 암호 프롬프트가 표시 될 수 있습니다. 예를 들어, 그놈에서 :

여기에 이미지 설명을 입력하십시오

수신자에게 공개 키가 있으면이를 확인하거나 해독 된 콘텐츠를 얻을 수 있습니다.

$ 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>"

일반 텍스트로 서명

예를 들어 메일을 보낼 때 내용을 암호화하지 않을 수 있습니다. 이 경우 다음 --clearsign옵션을 사용하십시오 .

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

별도의 서명 파일 (서명 된 서명)을 사용하여 서명

마지막으로 일부 파일의 경우 문서에 서명을 가질 수 없습니다. 예를 들어, 패키징 파일 또는 리포지토리의 메타 데이터는 모두 포함 된 서명을 쉽게 허용하지 않는 특정 특성의 콘텐츠를 가지고 있습니다. 이 경우 다음 --detached-sig옵션 을 사용하십시오 .

$ 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>"

노트

암호화 + 서명 및 분리 된 서명에서 출력 gpg은 이진입니다. --armor옵션 (ASCII-armoured)을 사용하여 GnuPG 출력 base64로 인코딩 된 데이터를 가질 수 있습니다 .

오토메이션

스크립트 서명을 위해 다음을 수행 할 수 있습니다.

  • 키에 빈 암호를 사용하십시오
  • GnuPG 버전에 따라을 통해 암호를 보내십시오 stdin. 일부 옵션에 대해서는 이 유닉스 및 리눅스 게시물 을 참조하십시오 .

매우 훌륭하고 자세한 답변. 그러나 당신이 만든 예제 키에 대해 ... 나는 가명을 위해 사용되지 않은 키 세트가 놓여 있다는 사실에 너무 기뻐하는지 모르겠습니다. 나중에 해당 이름으로 실제 키를 만들어 사용하려면 검색하는 사람들이 혼란 스러울 수 있습니다. 귀하의 예제 키와 실제 키가 다른 이메일 주소로 인해 공존 할 수 있으므로 다른 ID를 얻지 만 여전히 ... 해당 키를 다시 삭제할 수 있습니까?
바이트 사령관

@ByteCommander 용어가 취소 됩니다. 철회에 대해 살펴 보겠습니다. 그 문제를 해결하기 위해 키 취소에 대한 섹션을 추가해야합니다.
muru

@ByteCommander 죄송합니다. 게시 한 키를 삭제하고 취소 인증서를 만들지 않았으므로 (클래식 n00b 실수) 해당 키를 취소 할 수는 없지만 1 년의 만료 기간이 있습니다. 혼란은 1 년 안에 해결 될 것입니다
muru

알았어. 짜증나거나 그 멍청한 실수에 대해 웃을 지 확신이 서지 않습니다 ... 문제의 프로젝트에 대해서는 rsa모든 GPG에 어려움을 겪지 않고 쉽게 데이터 서명을 허용 하는 Python 모듈 을 사용한다고 생각합니다 . 실제로 소프트웨어를 게시하고 패키징하기 시작하면 매우 유용 할 수 있지만 현재로서는 내 목적에 비해 너무 많은 것일 수 있습니다. 따라서 그때까지는 아마도 만료 될 것입니다! :)
바이트 사령관

@ByteCommander 모두 가정합니다. 키를 만들 때 실제 이름을 사용하고 주석 필드에 닉을 남겨 두는 것이 좋습니다.
muru

4
  1. gpg로 비대칭 키 만들기

    gpg --gen-key
    
  2. gpg를 사용하여 파일 서명 (개인 키 사용)

    gpg --output foo.sig --detach-sig foo.py
    
  3. 서명 파일을 테스트하십시오 (공개 키가 사용됨)

    gpg --verify foo.sig 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: 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>"
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.