GPG 완전정리 가이드

!
경고: 이 글이 작성된 지 365일이 넘었습니다. 글의 정보가 오래되어 부정확할 수 있습니다.

키 만들기

키를 만드려면 다음을 실행합니다:

gpg --gen-key

만약 GPG가 여러 번 질문하지 않고 그냥 키를 만들기 시작한다면, 시스템에 따라 구동 방식에 차이가 있을 수 있어 다음을 실행합니다:

gpg --full-generate-key

정상적인 출력은 다음과 같습니다:

gpg (GnuPG) 2.2.17; Copyright (C) 2019 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.

gpg: directory '/Users/ericswpark/.gnupg' created
gpg: keybox '/Users/ericswpark/.gnupg/pubring.kbx' created
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)

키 사이즈는 4096 비트로 설정해도 괜찮습니다. 엔터를 눌러 진행합니다.

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)

여기에서 보안성을 높이려면 키 유효기간을 설정하는 것이 좋습니다. 하지만, 만약 이 귀찮은 과정을 매년 반복하기 싫으시다면 GnuPG는 서브키라는 기능이 있기에 그걸 사용하시면 됩니다. 나중에 서브키에 대해서 더 설명드릴테니 여기선 그냥 유효기간을 무한대로 설정하면 됩니다. 엔터를 눌러 진행합니다.

Key does not expire at all
Is this correct? (y/N)

GnuPG가 키가 유효기간이 없다고 경고하면 y를 누르고 엔터로 무시합니다.

GnuPG needs to construct a user ID to identify your key.

Real name:

여기서 GPG가 신상정보를 털어갑니다. 이름, 이메일, 그리고 키 코멘트를 입력하면 됩니다.

Real name: Eric Park
Email address: me@ericswpark.com
Comment: https://ericswpark.com/
You selected this USER-ID:
    "Eric Park (https://ericswpark.com/) <me@ericswpark.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

저장하기 위해 o를 누른 다음 엔터를 누릅니다. (만약 정보 변경이 필요하다면 괄호 안 글씨를 입력한 다음 엔터를 누르면 변경 절차가 시작됩니다!)

이제 비밀번호를 입력하는 단계입니다. 입력 후 엔터를 누르는데, 이 과정을 한 번 더 반복합니다. 만약 누군가 이 키를 복사해간다면 이 비밀번호 없이는 키를 사용할 수 없습니다. (그래도 만약 키가 유출되었다면 키를 폐기하시는 것이 좋습니다.)

비밀번호를 입력하면 GPG가 공용/개인 키 두 개를 만들기 시작합니다. 이 경고가 표시되는데:

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, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

컴퓨터가 오래되지 않았다면 이 과정은 약 30초 안에 완료됩니다. 터미널 프롬프트가 다음과 같이 바뀔 때까지 마우스 포인터를 몇 번 움직여줍니다:

gpg: /Users/ericswpark/.gnupg/trustdb.gpg: trustdb created
gpg: key 56F399E7A57D6E5D marked as ultimately trusted
gpg: directory '/Users/ericswpark/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/ericswpark/.gnupg/openpgp-revocs.d/475C562EBC0520048AE79ADD56F399E7A57D6E5D.rev'
public and secret key created and signed.

pub   rsa4096 2019-12-20 [SC]
    475C562EBC0520048AE79ADD56F399E7A57D6E5D
uid                      Eric Park (https://ericswpark.com/) <me@ericswpark.com>
sub   rsa4096 2019-12-20 [E]

이제 첫 GPG 키가 생성되었습니다!

사용 가능한 키 확인

사용 가능한 키를 확인하려면 다음을 실행합니다:

gpg --list-keys

그럼 다음과 같은 출력이 표시되는데:

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/Users/ericswpark/.gnupg/pubring.kbx
------------------------------------
pub   rsa4096/56F399E7A57D6E5D 2019-12-20 [SC]
    475C562EBC0520048AE79ADD56F399E7A57D6E5D
uid                 [ultimate] Eric Park (https://ericswpark.com/) <me@ericswpark.com>
sub   rsa4096/2698CAAB8C3C9C8C 2019-12-20 [E]

여기에서 몇몇 리눅스 배포판과 운영체제는 키 ID 전체를 보여주지 않을 수 있습니다. 정확한 출력을 보려면 다음을 입력하세요:

gpg --list-keys --keyid-format long

만약 키 개수가 작다면 전체 UUID를 입력하지 않기 위해 short를 사용해도 됩니다.

키 배포하기

키를 다른 분에게 공유하려면 먼저 키를 배포해야 합니다.

일단 공용 키 ID를 찾아야 합니다. 먼저, “사용 가능한 키 확인” 단계의 명령을 실행합니다. 출력에서 다음과 같은 줄을 찾습니다:

pub   rsa4096/56F399E7A57D6E5D 2019-12-20 [SC]

rsa4096/ 다음에 오는 숫자가 다를텐데, 숫자 56F399E7A57D6E5D가 있는 자리의 숫자가 공용 키 ID입니다.

키 서버로 키를 배포합니다:

gpg --send-keys 공용_키_ID

예를 들어 다음과 같은 명령을 실행합니다:

gpg --send-keys 56F399E7A57D6E5D

배포된 키 다운받기

만약 위에 나와있는 명령으로 공용 키를 배포하셨다면, 다른 사람들이 공용 키를 다운받아서 정보를 암호화하거나 개인 키로 서명한 파일을 확인할 수 있게 됩니다.

키를 블로그 같은 곳에 업로드하거나 (힌트!) 키 서버에 업로드하면, 다른 사람들이 키를 받으려면 다음 명령을 실행하면 됩니다:

gpg --recv-keys 공용_키_ID

예를 들어, 사람들이 제 키를 받으려면 (여기에 나와 있는 키는 실제 사용하는 키가 아닙니다! 이 강좌글을 위해서만 만들어진 키라서, 실제 키는 제 GPG 페이지에서 확인하실 수 있습니다), 다음을 실행하면 됩니다:

gpg --recv-keys 56F399E7A57D6E5D

만약 GPG가 에러를 표시한다면 키가 배포되어 있지 않을 수도 있습니다. 먼저 키를 검색해보세요:

gpg --search-keys 공용_키_ID

예를 들어:

gpg --search-keys 56F399E7A57D6E5D

다른 키 서버 사용하기

추가 플래그 없이 gpg --send-keysgpg --recv-keys를 실행하면 GnuPG는 기본 키 서버인 hkps://hkps.pool.sks-keyservers.net을 사용합니다. 일반적인 URL과 달리, GnuPG는 https 대신 hkphkps를 사용합니다.

다른 키 서버를 사용하는 예시를 들겠습니다. 예전에 Manjaro .iso를 다운받아 검증할 때 프로젝트 리더인 Philip Müller의 키를 다른 키 서버에서 다운받아야 했습니다. Manjaro 위키에서도 나와있듯이, 이 분이 쓰는 키 서버 주소는 다음과 같습니다: hkp://pool.sks-keyservers.net

이 키 서버 주소를 사용하려면, 다음 명령 형식의 플래그로 지정합니다:

gpg --keyserver hkps://keyserver.url.here <기타 플래그>

아까 예시로 돌아가서 Philip Müller의 키를 받아오려면, 다음을 실행해야 됩니다:

gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 11C7F07E

이때 키 서버 플래그 (--keyserver)는 꼭 다른 플래그보다 먼저 입력해야 됩니다.

2019년부로 기본 SKS 키 서버가 운영이 불안정한 것 같습니다. 여기에 First Look Media가 쓴 관련 글이 있는데 추가적인 정보는 여기에서 찾아보실 수 있습니다.

위 글에서 추천하는 새로운 키 서버는 keys.openpgp.org 키 서버인데, 이 서버는 Hagrid라는 새로운 백엔드를 사용해서 키를 배포한다고 하니 SKS 백엔드보다 보안 문제가 덜 하다고 합니다.

폐기 인증서 만들기

만약 개인 키가 유출되었을 경우 사용할 수 있는 폐기 인증서를 만들어야 합니다.

다음 명령 형식을 사용해서 폐기 인증서를 발급합니다:

gpg --gen-revoke 공용_키_ID > 공용_키_ID_폐기.asc

예를 들어, 제 개인 키에 연결된 폐기 인증서를 만드려면 다음 명령을 실행합니다:

gpg --gen-revoke 56F399E7A57D6E5D > 56F399E7A57D6E5D_폐기.asc

위 명령을 실행하면 다음과 같은 출력이 표시됩니다:

sec  rsa4096/56F399E7A57D6E5D 2019-12-20 Eric Park (https://ericswpark.com/) <me@ericswpark.com>

Create a revocation certificate for this key? (y/N)

y와 엔터를 눌러 확인합니다.

Please select the reason for the revocation:
    0 = No reason specified
    1 = Key has been compromised
    2 = Key is superseded
    3 = Key is no longer used
    Q = Cancel
(Probably you want to select 1 here)
Your decision?

여기에선 별다른 폐기 이유가 없다면, 엔터를 눌러 그냥 기본 옵션을 선택하시면 됩니다.

Enter an optional description; end it with an empty line:
>

이 부분은 선택적이니 엔터를 눌러 그냥 바로 진행하시면 됩니다.

Reason for revocation: Key has been compromised
Is this okay? (y/N)

y와 엔터를 눌러 확인합니다.

GPG가 이제 폐기 인증서를 만들기 위해 개인 키 비밀번호를 물어봅니다. 비밀번호를 입력한 다음 엔터를 누르면 됩니다.

ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

여기서 GPG가 얘기하는 “Mallory"는 GPG 커뮤니티에서 “악의적 사용자들"을 가르키는 지칭입니다. 만약 이름이 Mallory라면 GPG 개발진을 고소하십시오

또 “ASCII armored output"이 뭔지 궁금하실텐데, 이 부분은 일반 GPG 바이너리 파일과 ASCII-armored GPG 파일 차이점 부분에서 더 자세히 설명하겠습니다.

이제 폐기 인증서가 발급되었으면 안전한 곳에 저장해두시면 됩니다. 이 폐기 인증서만 있다면 키를 완전히 무효화시킬 수 있기에 주의하셔야 합니다. 어떤 분들은 이걸 프린트해서 보관하다가 필요하면 OCR로 인식해서 (…) 사용하시는 분들도 있는데, 그럴 필요까진 없다고 봅니다.

키 폐기하기

위 섹션에서 만든 폐기 인증서를 불러온 다음, 일단 컴퓨터에 저장되어 있는 공용 키에 폐기 인증서를 묶어줍니다.

gpg --import 공용_키_ID_폐기.asc

이 명령 형식에 제 키를 대입하면:

gpg --import 56F399E7A57D6E5D_폐기.asc

이렇게 폐기 인증서를 불러오신 다음, “키 배포하기” 단계를 사용해서 폐기된 공용 키를 한 번 업로드 하셔야 합니다. 그래야 다른 분들이 폐기 표시가 된 공용 키를 다운받아 키가 더 이상 사용되지 않음을 알 수 있습니다. 이렇게 폐기된 공용 키를 한 번이라도 배포하시면 키 폐기 해제를 할 수 없습니다.

키 폐기 해제하기

만약 한 번이라도 폐기 처리된 공용 키를 배포하지 않으셨다면 키 폐기를 취소하실 수 있습니다.

폐기를 취소시키기 위해 GPG에게 공용 키를 삭제하라고 요청합니다:

gpg --expert --delete-key 공용_키_ID

제 키를 대입해 본다면:

gpg --expert --delete-key 56F399E7A57D6E5D

--expert 플래그를 사용해서 공용 키 삭제를 하실 수 있습니다.

gpg (GnuPG) 2.2.17; Copyright (C) 2019 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.


pub  rsa4096/56F399E7A57D6E5D 2019-12-20 Eric Park (https://ericswpark.com/) <me@ericswpark.com>

Delete this key from the keyring? (y/N)

y와 엔터를 눌러 확인합니다.

이제 키 서버에서 다시 폐기 처리가 안 되어 있는 공용 키를 다운받거나, 아니면 복사본이 있으시다면 복사본을 불러오기하셔도 됩니다.

키 불러오기

키를 로컬 저장소에서 불러오는 것도 중요합니다. 만약 키 서버를 사용하고 싶지 않으시거나 다른 분이 키를 바로 보내주시면 키를 불러오기해서 사용하실 수 있습니다.

키를 불러올 때 파일 확장자가 .gpg, .asc, 또는 .key인지 확인하시면 됩니다. 파일 확장자가 다른 이유는 .asc 파일은 ASCII-armored GPG 파일을 가르키기 때문입니다.

다음 명령 형식을 사용하시면 됩니다:

gpg --import 키_파일_이름.asc

ASCII-armored가 뭔가요?

ASCII-armored는 파일이 바이너리 형식이 아니라 텍스트 방식의 파일로 출력되는 것을 의미합니다. 예를 들어, GPG로 암호화한 파일을 이메일로 보낼 때 유용하게 사용됩니다.

ASCII-armored를 활성화하려면 --armor 플래그를 명령에 추가하면 됩니다.

키 서명하기

키를 관리하는 과정 중 하나가 바로 다른 사람들의 키를 서명하는 것입니다. 이 단계 다음에 어떻게 키를 활용하는지 설명드릴텐데, 이 섹션이 더 흥미로울 수도 있습니다.

일단 “신뢰망”을 이해하시는 것이 중요합니다. 이 모델과 비교되는 모델은 SSL이 사용하는 “인증 기관” 모델입니다.

브라우저에서 웹사이트에 접속할 때 보이는 초록색 자물쇠는 연결이 암호화되어 있고, 웹사이트의 주인이 검증되었다는 것을 나타냅니다. 이렇게 자물쇠를 표시하기 위해 웹사이트 주인은 Let’s Encrypt, Comodo, 또는 DigiCert 같은 인증 기관에서 SSL 인증서를 발급받아야 합니다. 이런 기관 중 SSL 인증서를 무료로 발급해주는 기관은 Let’s Encrypt 밖에 없는데, 이유는 기업과 다른 기관에서 기부를 많이 받고 있으며 인증서 유효기간이 짧고, 인증서 발급 절차가 자동화되어 있어 운영 비용이 적기 때문입니다.

그럼 왜 다른 인증 기관은 SSL 인증서를 발급받는데 수수료를 청구할까요? SSL 인증서를 발급할 때마다 인증 기관은 실제 웹사이트 주인에게 인증서를 발급하는지 확인해야 합니다. 만약 잘못된 서버나 다른 분에게 인증서를 발급한다면 문제가 되고, 실제로 이전에 이렇게 인증서를 무단으로 발급받아 문제가 되었던 사건들이 많이 있습니다. 인증 기관마다 평판이 있는데, 이런 문제가 많이 생기면 평판이 내려가고, 평판이 너무 낮으면 브라우저 개발진이 인증 기관을 아예 브라우저 인증 데이터베이스에서 삭제해버리기에 인증 기관은 웹사이트 검증에 신경을 많이 써야 합니다.

거기에다가, 어떤 정부는 사용자 컴퓨터에 자체 인증 기관의 설치를 강요해서 사용자들을 감시하는 경우도 있어, 이 모델은 보안이나 신뢰에 있어서 별로 좋지 않습니다. 한 인증 기관에서만 문제가 생겨도 거의 모든 사이트의 신뢰 구조가 무너지기 때문입니다.

이런 문제점을 보완하기 위해서 GPG는 “신뢰망"이란 모델을 사용합니다. 제가 A란 친구가 있다고 가정해 봅시다. 전 A를 실제로 만났고 그가 누군지 알기에 그의 키를 서명해줍니다. 이제 A한테 B라는 친구가 있다고 가정하고, 저는 B가 누군지 모른다고 가정합니다. A는 똑같은 방식으로 B를 개인적으로 알기에 B의 키를 서명해줍니다. 나중에 서로 만나기 위해 정보를 주고받을 때, 제가 B가 보내주는 정보를 믿을 수 있는지 확인하고 싶다면 B의 웹사이트에 접속해서 B의 키를 다운받습니다. B의 키가 A의 키로 서명되어 있고, 제가 A의 키를 서명해주었기에 GPG는 이 새로운 키를 믿을 수 있다고 알려줍니다.

이 모델은 사람들이 서로의 키를 많이 서명할수록 더 잘 작동합니다. 이렇게 관계도를 그래프로 나타내었을 때 시스템은 망과 같은 구조를 보입니다:

web-of-trust-diagram

< 출처: https://en.wikipedia.org/wiki/Web_of_trust >

거기에다 외국에선 키 서명 파티라는 것도 있습니다! (국내에서도 이런 게 있는지는 모르겠습니다.) 물론, 키를 서명할 때 꼭 상대방의 정보를 확인해야 합니다.

xkcd-responsible-behavior

< 출처: https://xkcd.com/364/ >

과정은 간단합니다. 공용 키 아이디를 메모해 둔 다음에 (키 서명 파티에 실제 키 파일들을 들고 가는 것은 개인 키 유출의 위험이 있기에 가지고 가지 않습니다), 키 서명 파티에 참석해 만나는 사람들의 명의를 확인한 다음 상대방의 공용 키 ID를 모두 메모해 둡니다. 그 다음, 집에 와서 적어둔 공용 키들을 다운받고, 다음 형식으로 서명하시면 됩니다:

gpg --sign-key 상대방_공용_키_ID

서명을 한 다음에 다시 서명된 상대방의 공용 키배포해야 합니다. 이때, 만약 누군가 키를 배포하지 않고 직접 보내줬다면 배포를 원치 않을 수도 있기에 꼭 확인하시고 배포하세요.

예시로, 아까의 Manjaro 개발자의 키를 서명하려면:

gpg --sign-key 11C7F07E

다음과 같은 출력이 표시됩니다:

pub  rsa2048/CAA6A59611C7F07E
    created: 2012-05-05  expires: never       usage: SC
    trust: unknown       validity: unknown
sub  rsa2048/320011450576724A
    created: 2012-05-05  expires: never       usage: E
[ unknown] (1). Philip Müller (Called Little) <philm@manjaro.org>


pub  rsa2048/CAA6A59611C7F07E
    created: 2012-05-05  expires: never       usage: SC
    trust: unknown       validity: unknown
Primary key fingerprint: E4CD FE50 A2DA 85D5 8C8A  8C70 CAA6 A596 11C7 F07E

    Philip Müller (Called Little) <philm@manjaro.org>

Are you sure that you want to sign this key with your
key "Eric Park (https://ericswpark.com/) <me@ericswpark.com>" (56F399E7A57D6E5D)

Really sign? (y/N)

y를 누르고 엔터로 확인합니다. GPG가 비밀번호를 물어보면 입력한 다음 엔터를 눌러 키를 서명합니다.

밑에서 더 서술하겠지만 이렇게 서명을 한 다음 키의 “신뢰 수준”을 업데이트해야 할 수도 있습니다.

키 서명하기 파티 가이드

  • 키 서명 파티에는 컴퓨터를 가져가지 않습니다. 바이러스나 컴퓨터 자체의 분실로, 개인 키가 유출될 가능성이 높기 때문입니다. 따라서 공용 키를 배포한 다음 ID를 적어가서 공유하는 것이 좋습니다.
  • 서명하는 키가 친구나 지인의 키라면 그냥 바로 서명해도 되지만, 만약 상대방이 아는 사람이 아니라면 여권이나 기타 신분증을 가지고 신분을 꼭 확인하고 서명해야 합니다.
  • 서명하는 과정은 집에서 한꺼번에 해도 됩니다. 특이하게도, “키 서명 파티"에서는 키 서명을 하지 않고, 그냥 정보 확인과 ID 공유만 합니다.

신뢰 수준이란?

GnuPG 키 저장소에서 다른 사람이 얼마나 믿을만한 사람인지 적어두는 것이 바로 GPG의 “신뢰 수준” 설정입니다.

또 다시 예시를 들겠습니다. 만약 친구가 컴퓨터를 진짜 잘 사용하는 친구라고 가정하면, 이 친구가 다른 사람의 키를 서명할 때 좋은 판단을 내릴 거라고 확신할 수 있기에 이 친구에겐 “신뢰 수준"을 높게 설정합니다. 이와는 반대로 아까의 키 서명하기 파티에서 모르는 사람을 만났다고 가정합니다. 이 사람은 키를 잘 서명하는지 믿을 수 없기에 “신뢰 수준"을 낮은 단계인 1로 설정합니다.

이때 새로운 키를 서명하면 그 키는 자동으로 1 (모름) 단계로 설정됩니다. 만약 “신뢰 수준"을 판단하기 어려우시다면 그냥 기본값으로 놓으셔도 괜찮습니다.

키의 “신뢰 수준"을 변경하려면 다음 명령 형식을 사용합니다:

gpg --edit-key 타인_공용_키_ID

그 다음 trust와 엔터를 입력해서 “신뢰 수준"을 지정한 다음 엔터를 눌러 설정값을 적용합니다. “신뢰 수준” 변경사항은 바로 저장되기에 별다른 저장 절차 없이 바로 quit와 엔터를 눌러 GPG 프롬프트에서 빠져나옵니다.

키 백업하기

컴퓨터가 망가지거나, USB가 고장나거나, 어떤 방식으로든 키는 잃어버릴 수 있어 꼭 백업을 해 두는 것이 중요합니다.

가장 편한 백업은 .gnupg 폴더 전체를 복사해두는 것입니다. 근데, 이렇게 백업을 진행하시면 GPG의 잔여 파일이 백업에 포함되어 크기가 쓸데없이 커집니다. 키만 백업하는 방법을 알아보겠습니다.

일단 개인 키를 백업하겠습니다. 다음 형식을 편집해서 실행하세요:

gpg --export-secret-keys --armor 키_ID > 키_ID_개인.asc

이렇게 실행하면 키가 키_ID_개인.asc에 저장됩니다. 이 파일을 안전한 곳에 저장하시면 됩니다.

나중에 개인 키에서 공용 키를 다시 발급하는 절차가 꽤 귀찮기에 이번 기회에 공용 키도 같이 백업해둡니다:

gpg --export --armor 키_ID > 키_ID_공용.asc

만약 나중에 백업을 사용해서 키를 복원할 경우, 키의 “신뢰 수준"을 5로 설정해야 GPG가 키가 개인 키임을 알 수 있습니다.

서브키 사용법

서브키는 키를 원본 “마스터” 키에서 본뜬 것이라고 생각하시면 됩니다. 일반 마스터 키와 다르게, 유출이 되더라도 폐기 절차가 복잡하지 않기에 서브키 사용을 추천합니다.

일단 서브키를 만들기 위해선 마스터 키를 편집해야 됩니다:

gpg --edit-key 키_ID

그럼 다음과 같은 출력이 표시됩니다:

gpg (GnuPG) 2.2.17; Copyright (C) 2019 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.

Secret key is available.

sec  rsa4096/56F399E7A57D6E5D
    created: 2019-12-20  expires: never       usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa4096/2698CAAB8C3C9C8C
    created: 2019-12-20  expires: never       usage: E
[ultimate] (1). Eric Park (https://ericswpark.com/) <me@ericswpark.com>

gpg>

서브키를 addkey로 추가하겠습니다:

Please select what kind of key you want:
    (3) DSA (sign only)
    (4) RSA (sign only)
    (5) Elgamal (encrypt only)
    (6) RSA (encrypt only)
Your selection?

서브키는 두 개 만드시는 것이 좋습니다. 한 키는 서명을 할 때 사용하고, 한 키는 암호화/복호화 작업에 사용하면 됩니다. 마스터 키를 만들 때 암호화 서브키가 자동으로 만들어지기에 서명용 서브키를 만들어보겠습니다. 4를 누른 후 엔터를 누릅니다:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

여기서 아까와 같이 4096을 사용합니다.

Requested keysize is 4096 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)

아까 말했듯이 서브키는 폐기가 용이하기에 그냥 만료되지 않는 키를 만들어도 괜찮습니다. 만약, 예시로 3개월 이후에 만료되는 서브키를 만들려면 여기에서 3m을 입력하면 됩니다. 일단 기본 설정으로 진행하기 위해 엔터를 누릅니다:

Key does not expire at all
Is this correct? (y/N)

y를 누르고 엔터로 확인합니다.

Really create? (y/N)

y를 누르고 엔터로 확인합니다. 비밀번호를 물어본 다음, 엔트로피 경고를 띄운 후 서브키를 만들어줍니다:

sec  rsa4096/56F399E7A57D6E5D
    created: 2019-12-20  expires: never       usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa4096/2698CAAB8C3C9C8C
    created: 2019-12-20  expires: never       usage: E
ssb  rsa4096/CFE50DE6144F5CA0
    created: 2019-12-20  expires: never       usage: S
[ultimate] (1). Eric Park (https://ericswpark.com/) <me@ericswpark.com>

gpg>

여기에서 키 ID CFE50DE6144F5CA0가 새로 만들어진 서브키입니다! 이제 키의 변경사항을 모두 저장해야 됩니다. save와 엔터를 눌러 저장합니다.

이제 서브키를 내보내기해서 다른 곳에서 사용할 준비가 완료되었습니다. 다음 형식과 같이 입력합니다:

gpg --export-secret-subkeys --armor CFE50DE6144F5CA0! > CFE50DE6144F5CA0_서브키.asc

이때, 키 ID 뒤에 붙는 느낌표가 매우 중요합니다. 만약 느낌표를 붙이지 않을 경우 모든 서브키를 내보내기에 실수로 보안이 취약한 컴퓨터에 암호화/복호화 키를 보낼 수가 있어서 각별한 주의가 필요합니다.

그런 다음 키를 가져올 컴퓨터에서 다음 형식에 맞춰 실행합니다:

gpg --import CFE50DE6144F5CA0_서브키.asc

만약 키를 폐기하고 싶으시다면 그냥 마스터 키를 편집해서 revkey를 사용해 서브키를 폐기한 다음, 변경사항을 저장 후 키 서버에 업로드를 하면 됩니다.

만약 키 전체를 삭제하고 싶으시다면, 다음을 실행합니다:

gpg --delete-secret-key 키_ID

이 명령은 키 저장소도 한꺼번에 삭제하기에 조심해서 사용하세요.

키 업데이트하기

사람들이 키를 수시로 서명하거나, 폐기하거나, 새로 발급하기에, 키 저장소를 수시로 업데이트하는 것이 중요합니다:

gpg --refresh-keys

이 명령은 배포된 공용 키도 업데이트해줍니다.

이제 본격적으로 GPG 키를 어떻게 활용하는지 알려드리겠습니다!

파일 암호화하기

상대방의 공용 키를 가져온 다음, 다음 명령 형식으로 암호화할 파일의 전체 경로를 입력합니다:

gpg --encrypt 파일.tar.gz

GPG가 무슨 키 ID로 암호화할지 묻는다면, 키 저장소에 키가 이미 불러오기되어 있다면 상대방의 이름을 적거나 상대방의 키 ID를 적으시면 됩니다.

아니면 명령 자체에 덧붙이셔도 됩니다:

gpg --encrypt 파일.tar.gz -r "박선우"

이때 출력물을 ASCII-armor화 하실 수 있습니다!

파일 복호화하기

다음 명령 형식을 사용합니다:

gpg --decrypt 피일.tar.gz.gpg

만약 파일이 ASCII-armor 형식이라면 .asc를 사용합니다.

파일 서명하기

파일을 어떻게 서명할지에 따라서 명령 형식에 차이가 있습니다. 만약 압축되어 있는 서명된 파일을 생성하고 싶으시다면 다음 명령을 사용합니다:

gpg --sign 파일.tar.gz

이 명령은 --armor 플래그의 사용에 따라서 파일.tar.gz.gpg 혹은 파일.tar.gz.asc을 생성합니다.

이제 파일을 전송할 때 file.tar.gz.asc 파일 하나만 전송하시면 됩니다. 상대방이 파일을 받으면 같은 파일로 서명을 확인하거나 원본 파일을 압축해제할 수 있습니다.

그런데, 만약 이메일처럼 별도의 압축해제 과정 없이 정보를 서명해야 되는 상황이라면 --clearsign이라는 구문을 사용해서 텍스트-방식의 서명을 사용하실 수 있습니다:

gpg --clearsign 파일.txt

이 방식은 이메일이나 텍스트 문서를 보낼 때 유용하게 사용됩니다. 텍스트가 먼저 표시된 다음, 바로 밑에 서명 정보가 덧대어져 전송됩니다.

이제 마지막 방식은 큰 파일에 사용됩니다. 위의 두 방식은 서명 파일이 원본 파일의 크기만큼을 차지하는데, 큰 파일은 이중으로 공간을 차지하기에 이렇게 서명하는 것이 불편하실 수 있습니다. 따라서, 서명 파일을 별도로 분리하는 모드를 사용하시면 GPG는 서명을 계산한 다음 별도의 서명 파일에 저장합니다. 거의 대부분의 리눅스 배포판이나 큰 라이브러리/프레임워크 프로젝트가 이런 방식으로 서명 파일을 배포합니다. 이 모드로 서명 파일을 생성하려면 다음 명령을 사용합니다:

gpg --detach-sig 파일.iso

그럼, 이 명령과 첫 명령의 차이점을 알아보겠습니다. 첫 명령은 파일 전체를 압축한 다음, 서명 정보를 추가 한 다음 새로운 파일을 생성합니다. 이 파일 하나만으로 모든 정보를 전송할 수 있기에 파일 여러 개를 보낼 수 없는 상황에서는 유용하지만, 이렇게 파일을 압축하고 서명하는 과정, 그리고 다시 압축된 파일을 압축해제하는 과정이 리소스를 많이 사용하기 떄문에 파일 크기에 제약이 있습니다.

하지만, “detach” 방식으로 서명 파일을 생성하면 실제 서명 파일은 크기가 매우 작습니다. 이 파일과 원본 파일을 동일 경로에 저장한 다음 GPG를 사용해서 원본 파일의 서명을 확인하실 수 있습니다. 리눅스 배포판 다운로드 섹션에 있는 “Ubuntu.iso”, “Ubuntu.iso.sig”, 또는 “Ubuntu.iso.asc” 파일들이 바로 이 “detach” 방식으로 생성된 서명 파일과 원본 파일을 업로드해 둔 것입니다.

만약 첫 번째 방식의 파일을 다운받아 서명을 확인하면 GPG는 파일이 분리되어 있는 서명이 아니라고 경고합니다. 따라서 이렇게 통합되어 있는 파일이 손상될 경우 GPG는 손상이 발생했는지 확인을 하지 못 할 수도 있습니다. 이렇게 통합되어 있는 파일을 확인하기 위해서는 파일을 압축해제 한 다음, 체크섬을 이용해서 파일을 검증해야 합니다. 따라서 첫 번째 방식은 작은 파일을 서명할 때만 사용하시는 것이 좋습니다.

요약 - 이메일이나 텍스트 서명은 --clearsign, 큰 파일은 “detach” 방식, 그리고 일반적인 작은 파일(대략 수십 MB 정도)은 압축 및 서명을 사용하시면 됩니다.

파일 서명 확인하기

gpg --verify 파일.tar.gz.gpg

긴 글 읽어주셔서 감사합니다! GPG를 사용하는데 이 글이 도움이 되었으면 합니다.

댓글