티스토리 뷰

GnuPG

GPG 공개키 주고받기

anerdinaserver 2016. 12. 5. 03:17

이번 포스트에서는 키를 관리하는 기본적인 방법을 알아보겠습니다.

키를 생성하면 개인키와 공개키가 쌍을 이뤄 생성됩니다. 또한 기본적으로 각 키는 사인용 주 키(Primary key)와 암호화용 하위키(Subkey)를 갖습니다. 서브키는 나중에 사용법을 따로 설명할 예정입니다. 지금 중요한 것은 키가 여러가지 구성 요소로 되어 있다는 것입니다. 여러가지 구성 요소가 모인 것을 키링(keyring)이라고 부릅니다. Keyring은 여러분의 개인키와 공개키, 다른사람의 공개키를 전부 저장하게 됩니다.

정리하자면 기본적인 keyring은 다음과 같이 구성됩니다:

Keyring
    - Key
        - Private key
            - Primary (사인용)
            - Sub (암호화용)
        - Public key
            - Primary (사인용)
            - Sub (암호화용)
    - Key
        - Public key (다른 사람의 공개 키)
        ...

Keyring은 여러개의 키를 가질 수 있고 각 키는 여러개의 서브키를 가질 수 있습니다. 마스터 키는 반드시 사인을 할 수 있어야 합니다. 서브키는 추가하거나 제거할 수 있습니다. 서브키는 사인용, 암호화용 모두 생성할 수 있습니다.

각 키에는 User ID가 포함됩니다. 아이디는 추가할 수 있지만 수정할 수는 없습니다.

Keyring의 키 목록

Keyring에는 여러 개인키와 공개키가 포함된다고 했습니다. 키 목록을 확인하려면 --list-keys 옵션을 사용합니다. 이 옵션은 공개 키의 목록을 표시합니다.

$ gpg2 --list-keys
pub   rsa2048/2F5DB256 2016-12-03 [SC]
uid         [ultimate] Infinite Cookies <infcookies@gmail.com>
sub   rsa2048/7EB1A92D 2016-12-03 [E]
  • pub은 공개 키를 의미합니다.
  • uid는 User ID를 의미합니다.
  • sub는 서브키를 의미합니다.
  • rsa2048과 같은 문구는 키의 종류와 길이를 의미합니다.
  • 2F5DB256와 같은 문구는 키의 ID입니다. 각자 다릅니다.
  • [SC][E]는 해당 키의 역할입니다.
    • S: Sign(사인)
    • C: Certificate(인증)
    • E: Encryption(암호화)
  • [ultimate]는 해당 키에 대한 신뢰도를 의미합니다. 본인의 키이기 때문에 ultimate 단계로 되어 있습니다. 다른 사람의 키는 기본적으로 신뢰도가 존재하지 않고 marginal, full 등으로 설정할 수 있습니다.
  • --list-keys 뒤에 키의 아이디나 이메일 주소, 이름을 적으면 해당하는 키만 출력됩니다. 키를 구분할 때 적는 검색어를 keyspec이라고 하겠습니다.

개인 키의 목록을 보려면 --list-secret-keys 옵션을 사용합니다. 사용법은 --list-keys와 같습니다.

공개키의 역할

공개키는 아무에게나 공개해도 괜찮습니다. 특히 다른 사람과 메시지나 자료를 주고받기 위해서는 각자 서로의 공개키를 가지고 있어야 합니다.

공개키는 이런 경우에 사용됩니다:

  • 공개키 주인에게 보낼 자료를 암호화
  • 공개키 주인이 비공개키로 사인한 메시지와 자료의 사인 확인

여러분은 공개키 자체에 이런 일을 할 수 있습니다:

  • 공개키의 인적사항(User ID) 확인하고 사인하기
  • 공개키 내보내기/받아오기
  • 공개키 폐기하기 등

공개키 내보내기

다른 사람이 여러분에게 뭔가 암호화해서 보내려면 여러분의 공개키를 갖고 있어야 합니다. 공개키는 --export 옵션을 사용해서 내보냅니다.

$ gpg2 --output pubkey.gpg --export keyspec

이렇게 입력하면 pubkey.gpg 파일이 생성됩니다. 이 파일은 사람이 읽을 수 없는 바이트로 구성되어 있습니다. 이 파일을 주고 받아도 되지만 경우에 따라 불편할 수 있습니다. 예를 들어 문자 메시지로 공개 키를 보내거나 게시판을 통해 공개키를 주고받는 경우 등이 있겠습니다.

gpg의 모든 출력 관련 옵션에는 -a 또는 --armor 옵션을 추가할 수 있습니다. 이 옵션을 추가하면 알파벳과 숫자등으로 표현된 결과 파일이 생성됩니다.

$ gpg2 -ao pubkey.asc --export keyspec

-o--output의 짧은 형태입니다. 이렇게 생성된 파일을 보면 다음과 비슷하게 되어 있습니다.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2

mQENBFhC0q4BCAC7IA7yh0tlz2IsEQgtdd7dSEO2pyjpVh+05/uPgENd+MQpXjEc
xRaGhmPHMUynCuwD2tcUAdxClfJzSzOYZwmUUV6iXC2fBgF60Yd3Yh7juCJes2FR
ZW9f2GOF21ynohSIvkAUKIYTMOdupefdLUKWTqH/NsmNp2NQbvcSXsdAZ/zpLpj2
...
6Jz5VkYWjX30Scojk25L8pSj5pqn39/e3LOWHXJ5clz+r5hieolfUFIlD02Agwlv
6YiVceIrMyN/gjPUmgQfBRwlkk8VCXov5QSPtklxgmquwzIC2A==
=auyW
-----END PGP PUBLIC KEY BLOCK-----

이 파일이나 내용을 보내줘도 동일하게 공개키를 주고받을 수 있습니다. 필요에 따라 적절한 형태로 출력시켜 사용하십시오. 일반적으로 -a 옵션을 사용한 경우 결과 파일의 크기가 아주 약간 더 큽니다.

공개키 들여오기

여러분이 다른 사람에게 자료를 암호화해서 보내려면 받는 사람의 공개키가 필요합니다. 방금 여러분이 한 것과 같이 상대방도 자신의 공개키를 내보내기 해서 보내올 것입니다. 그러면 여러분은 받은 키를 여러분의 keyring에 저장합니다.

들여오기는 --import 옵션을 사용합니다.

$ gpg2 --import pubkey-John.asc

잘 들어왔는지 --list-keys로 확인합니다.

$ gpg2 --list-keys
/home/infcookies/.gnupg/pubring.kbx
-----------------------------------
pub   rsa2048/2F5DB256 2016-12-03 [SC]
uid         [ultimate] Infinite Cookies <infcookies@gmail.com>
sub   rsa2048/7EB1A92D 2016-12-03 [E]

pub   rsa4096/0F3FBF20 2016-12-04 [SC]
uid         [ unknown] Biscuit John <goodbiscuit@gmail.com>
sub   rsa4096/E75D954B 2016-12-04 [E]

새로 들여온 공개키의 uid의 신뢰도는 unknown입니다. 이것은 기본값이고 지금부터 들여온 공개키의 신뢰도를 결정해야 합니다.

키의 신뢰도는 다음과 같이 결정합니다:

  • 개인적으로 확인: 전화 통화나 직접 만나서 키의 지문(fingerprint)를 확인
  • 타인을 통해 확인: 충분한 수의 믿을 수 있는 사람들이 확인. 이 방식을 Web of Trust라고 부릅니다.
  • 확인 후 본인 개인키로 사인

지금은 개인적으로 확인할 수 있는 상황을 가정합니다. 예를 들어 친구와 만나 공개키를 주고받은 후 키 지문을 확인하면 정확히 필요한 키를 받았다는 것을 확신할 수 있습니다.

키 지문은 --fingerprint 옵션을 사용하면 볼 수 있습니다.

$ gpg2 --fingerprint Biscuit
pub   rsa4096/0F3FBF20 2016-12-04 [SC]
      Key fingerprint = DD56 E74D A77D E1C3 46AC  AC57 DE4E 1192 0F3F BF20
uid         [ unknown] Biscuit John <goodbiscuit@gmail.com>
sub   rsa4096/E75D954B 2016-12-04 [E]

Key fingerprint = 다음에 나열되는 값이 이 키의 지문입니다. 직접 만나거나 통화를 통해 이 지문 값의 모든 자리수를 확인해서 일치하면 이 키는 믿을 수 있는 키입니다. 특히 0, O, o, I, i, l, 1 등과 같이 비슷해 보이는 글자를 주의해서 보십시오. 프로그래머들이 사용하는 고정폭 폰트를 사용하면 이런 문자들이 잘 구분되어 보입니다. 폰트를 설치해서 사용하는 터미널 등에서 사용하면 좋습니다.

여러분의 공개키를 받은 사람들도 필요한 경우 여러분에게 이 값을 물어볼 수 있습니다. 이 경우 지문 값을 불러주면 됩니다. 또는 지문을 불러달라고 한 뒤 맞으면 맞다고 해도 되겠습니다.

이제 지문을 확인했으니 서명을 해서 본인이 이 공개키는 믿을 수 있다고 표시를 하면 키 확인이 끝나게 됩니다.

gpg에는 --edit-key라는 옵션이 있습니다. 이 옵션은 키에 대한 여러가지 작업을 할 때 사용합니다. 방금 사용한 키 지문도 확인할 수 있고 키에 서명을 하거나 새 user id를 생성하거나 만료기간을 설정할 수도 있고 서브키를 생성하고 폐기하는 등 수많은 작업을 할 수 있는 명령어들이 제공됩니다.

$ gpg2 --edit-key Biscuit
...
gpg> 

gpg>--edit-key 옵션이 실행되면 사용할 수 있는 gpg 자체의 커멘드 프롬프트입니다. 여기에 여러가지 명령을 입력해서 사용합니다. help를 입력하면 명령어읭 목록이 나옵니다. 종료는 quit을 입력합니다. 지문은 fpr을 입력합니다. 작업 후 저장하려면 save를 입력합니다.

서명에 관련된 명령어는 sign, lsign, tsign, nrsign이 있습니다. 여러분이 지금 알아둬야 할 명령어는 signlsign입니다.

sign 명령어로 다른 사람의 공개키에 서명하는 것은 서명을 했다는 기록이 다른 사람에게도 알려지기를 바란다는 의미입니다. 나중에 키 서버를 이용해 서명한 공개키를 내보내면 여러분의 서명을 신뢰하는 사람들이 여러분이 서명한 다른 사람의 공개키를 신뢰할지 판단하는 데 영향을 줍니다.(Web of trust)

lsign은 local 사인입니다. 이 명령어로 사인한 경우 서명했다는 사실이 밖으로 내보내지지 않습니다. 다른 사람들은 여러분이 이 공개키에 서명했다는 사실을 알지 못합니다.

어떤 명령어를 사용할지는 정해져 있지 않습니다. 상황에 맞게 직접 판단하시면 됩니다.

지금은 직접 만난 친구의 공개키를 확인 후 서명하고 있는 상황이기 때문에 다른 친구들이 알 수 있도록 공개 서명을 하도록 합니다.

아무 키에나 무턱대고 서명하는 것은 나쁜 습관입니다. 반드시 공개 키가 올바른 사람으로부터 온 것인지 최대한 확인하시고 확신이 들면 서명하십시오. 키의 정체를 확인하지 않고 서명하는 것은 서명의 신뢰도를 떨어트리는 일입니다.

gpg> sign

pub  rsa4096/0F3FBF20
     created: 2016-12-04  expires: never       usage: SC  
     trust: unknown       validity: unknown
 Primary key fingerprint: DD56 E74D A77D E1C3 46AC  AC57 DE4E 1192 0F3F BF20

     Biscuit John <goodbiscuit@gmail.com>

Are you sure that you want to sign this key with your
key "Infinite Cookies <infcookies@gmail.com>" (2F5DB256)

Really sign? (y/N) y

서명은 여러분의 서명용 키를 사용해서 하게 됩니다. 따라서 gpg는 암호를 물어볼 것입니다.

서명이 잘 되었는지 확인하려면 check 명령어를 사용합니다.

gpg> check
uid  Biscuit John <goodbiscuit@gmail.com>
sig!3        0F3FBF20 2016-12-04  [self-signature]
sig!         2F5DB256 2016-12-04  Infinite Cookies <infcookies@gmail.com>

sig! 옆에 본인의 아이디가 보입니다. sig는 서명을 의미하고 !는 keyring에 있는 공개키로 서명을 확인 후 확인이 되었다는 의미입니다. 옆의 숫자는 인증의 정도입니다. --ask-cert-level 옵션을 사용하면 지정할 수 있습니다. 이 옵션이 사용되지 않으면 기본적으로 인증 레벨을 물어보지 않고 기본 값을 사용합니다. 기본값은 0이며 자세한 내용은 man gpg에서 --ask-cert-level--default-cert-level등을 읽어보십시오.

어쨌든 sig!가 보인다는 것은 서명이 되었다는 의미입니다. 서명은 gpg --list-sigs 옵션을 이용해도 볼 수 있습니다.

이제 이 공개키를 믿는 상태이므로 이 공개키를 이용해서 상대방에게 보낼 메시지나 자료를 암호화해서 보내면 상대방은 본인의 개인키를 이용해서 자료를 해독할 것입니다. 상대방이 개인키로 서명한 메시지와 자료를 상대방의 공개키로 확인할 수도 있습니다. 마찬가지로 상대방도 여러분의 공개키로 자료를 암호화하고 서명을 확인할 것입니다. 이것이 비대칭 키를 이용한 통신 방법입니다.

다음 포스트부터는 실제로 자료를 암호화하고 상대방이 암호화한 자료를 해독하는 방법, 메시지와 자료에 서명하는 방법을 알아보도록 하겠습니다.

'GnuPG' 카테고리의 다른 글

GPG 서명하고 확인하기  (0) 2016.12.05
GPG 자료 암호화/복호화하기  (1) 2016.12.05
GPG 키 생성하기  (1) 2016.12.03
GPG를 사용하는 이유  (0) 2016.11.24
GPG 설치하기  (0) 2016.11.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함