혹시 Github를 돌아다니다 Verified라고 적힌 커밋들을 본 적이 있는가? 아무 설정도 하지 않은 채 Github를 사용한다면 Verified라고 적힌 자신의 커밋은 Github에서 직접 수정한 내역의 커밋 밖에 없을 것이다. Github에서 README.md
를 수정한다거나 등 말이다.
Verified는 서명된 커밋을 뜻한다. 서명된 커밋은 Github에서 자신의 커밋을 볼 때 Verified라는 멋진 뱃지가 보인다는 장점이 있다. 그리고 서명되지 않은 커밋들과는 무언가 다른 포스를 뽐낸다. 그러기만 한다면 정말로 쓸데없는 기능일테지만 커밋에 서명이 필요한 이유가 있다.
커밋할 때 Git은 우리의 e-mail 주소와 이름을 물어본다. 그리고 그것으로 커밋한 사람들을 구별한다. 그리고 끝이다. 사용자를 구별하는 수단으로 이 두가지만을 사용한다. e-mail 주소와 이름은 충분히 다른 누군가가 도용할 수 있다. 내 e-mail 주소만에는 비밀번호가 걸려있지 않으니 말이다.
GPG 서명은 이것을 대책할 보완책인 것이다. 서버는 사용자가 미리 등록해놓은 GPG키와 커밋을 비교해 그 커밋이 정말로 사용자가 한 커밋인지를 구별한다.
설명은 충분하니 이제 내 커밋에 멋진 뱃지를 달아보자. 제목에도 쓰여져있듯이 글쓴이의 환경은 Manjaro Linux 17
이다.
GPG키 생성
일단 GPG키를 생성해보기로 한다.
$ gpg --full-generate-key
Output:
gpg (GnuPG) 2.2.10; Copyright (C) 2018 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?
1
을 입력하고 엔터를 누르자.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
이번엔 keysize를 물어보는데, Github의 문서가 하라는대로 최장길이인 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)
Key가 얼마나 살아있을지를 선고하는 차례이다. 나중에 키를 재발급받긴 귀찮으니 만료되지 않게 0
을 입력해주자. 그리고 마지막에 제대로 입력했는지를 물어본다 자신이 무엇을 입력했는지 돌아보고, 맞으면 y
를 입력.
개인정보도 요구한다. Github의 정보와 일치시키자. 비밀번호까지 설정했으면, 끝이다!
Github에 등록
$ gpg --list-secret-keys --keyid-format LONG
Output:
/home/bombwhale/.gnupg/pubring.kbx
----------------------------------
sec rsa4096/ADSF93939ADSF39S 2018-10-06 [SC]
8943B394C84E7F5875A14BAC2C091E6BD04E882E
uid [ultimate] Bombwhale (Golang Programmer) <solkblte@icloud.com>
ssb rsa4096/AD8338FDSSDS838D 2018-10-06 [E]
출력은 당연히 사람마다 다를 것이다. 여기서 sec
으로 시작하는 줄의 /
뒤의 알파벳과 숫자로 이루어진 구문이 있을 것이다(위 경우에는 ADSF93939ADSF39S
). 복사해놓자.
$ gpg --armor --export ADSF93939ADSF39S
그리고 복사해놓았던 것을 위의 명령어 같이 써주자.
그러면 -----BEGIN PGP PUBLIC KEY BLOCK-----
로 시작하는 PGP키가 보인다. 그것을 전부 복사해서 Github로 들어가 Settings
-> SSH and GPG Keys
-> New GPG Key
로 들어간 뒤 붙여넣기 해주자.
커밋에 서명하기
위에서 사용했던 명령어 중
$ gpg --list-secret-keys --keyid-format LONG
을 사용하여 우리가 전에 복사해야했던 것을 다시 복사한다.
$ git config --global user.signingkey 3AA5C34371567BD2
형식으로 입력하자. 3AA5C34371567BD2
부분은 자신의 것으로 교체하면 된다.
만약 내 커밋이 언제나 서명되길 원한다면
git config --global commit.gpgsign true
위의 명령어를 입력하면 된다.
커밋을 해보자.
git commit -m "COMMMMMMIIITMTMT"
만약 위에서 언제나 커밋되는 옵션을 활성화하지 않았다면 -S
를 붙여주어야한다.
비밀번호를 입력하고 커밋이 되면 성공.
분명 전에는 첫 커밋 과정에서 에러가 발생했었는데 이 포스트를 쓸 때에는 전혀 나타나질 않는다. 만약 발생하면 이 포스트에 덧붙이겠다.