Git GPG 서명과 Manjaro Linux

git 커밋에 서명할 수 있는 GPG 설정을 Manjaro Linux에 해보자

Github의 커밋 히스토리 중 Verified된 커밋들

혹시 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를 붙여주어야한다.

비밀번호를 입력하고 커밋이 되면 성공.

분명 전에는 첫 커밋 과정에서 에러가 발생했었는데 이 포스트를 쓸 때에는 전혀 나타나질 않는다. 만약 발생하면 이 포스트에 덧붙이겠다.

댓글을 불러올까요?