[2020 오픈소스 컨트리뷰톤] 오프라인 교육에서 했던 것을 기반으로 GPG Key 생성 및 GitHub 등록 방법을 작성하였다.
GPG Key 생성에는 gpg
명령어가 사용되는데 이를 위해서는 gnupg
패키지가 필요하다.
이것이 존재하지 않는다면 다음과 같은 명령어로 설치해주어야 한다.
~$ sudo apt install gnupg
물론 운영체제에 따라 구체적인 방식에는 차이가 있지만
나는 우분투 사용자이므로 내 기준으로 작성한다.
위 명령어를 수행했더니 이미 최신 버전이 존재한다고 뜬다.
그럼 신경쓰지 않고 다음으로 넘어간다.
이제 gpg
명령어를 통해 GPG Key를 생성할 수 있다.
이 명령어를 사용하기에 앞서 설정 파일을 작성해야 한다.
파일이 없다면 새로 만들고, 있다면 맨 아래 추가하는 방식으로 작성하면 된다.
~$ vi ~/.gnupg/gpg.conf
personal-digest-preferences SHA512 cert-digest-algo SHA512 default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed
파일이 생성되면 다음과 같은 명령어로 GPG Key를 생성할 수 있다.
~$ gpg --full-generate-key
다음과 같이 뜨는 걸 볼 수 있는데
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
입력하고 엔터를 친다.
혹은, 그냥 엔터를 치면 default로 1로 설정된다.
다음으로는 Key의 bit수를 설정하라고 하는데
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (3072)
4096을 권장하므로 4096
이라고 입력하고 엔터를 친다.
Key의 bit수를 설정한 후에는 Key의 유효기간을 설정해야 한다.
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)
약 2년 정도를 권장하므로 2y
라고 입력하고 엔터를 친다.
마지막으로 개인 신원을 입력하라고 하는데, 실명과 자주 쓰는 이메일을 사용하도록 하자.
You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Email address: Comment:
모든 설정을 마치면 입력한 신원 정보의 일치 여부를 확인하라고 하는데
확인해보고 문제가 없다면 다음으로 넘어가기 위해
Okay의 약자인 O
를 입력하고, 비밀번호를 요구할 경우 사용할 비밀번호를 입력하면 된다.
이제 GPG Key가 생성되었다.
생성이 완료되었다며 40개의 문자 또는 숫자로 이루어진 문자열을 띄울 것이다.
이것을 우리는 핑거프린트fingerprint라고 부르고, 이것의 마지막 8자리를 KeyID라고 부른다.
핑거프린트는 다음 명령어를 통해서도 확인할 수 있다.
~$ gpg --fingerprint
// 핑거프린트 이거 계속 나올거니까 잘 기억하도록 하자.
// 핑거프린트는 기억 못해도 되니까 핑거프린트 확인 방법을 기억하도록 하자.
// 핑거프린트를 요구하는 웬만한 건 다 KeyID로 가능하다는 건 여담.
GitHub 우측 상단 메뉴에서 Setting
버튼을 누르면,
설정 메뉴 중 SSH and GPG keys
라는 녀석을 발견할 수 있다.
여기서 New GPG Key
를 누르면 GPG Key를 등록할 수 있는데,
다음과 같이 -----BEGIN PGP PUBLIC KEY BLOCK-----
부터 시작하라고 뜬다.
이 '-----BEGIN PGP PUBLIC KEY BLOCK-----
부터'는
gnupg
패키지와 핑거프린트를 통해 구할 수 있다.
다시 터미널로 돌아가서 다음과 같이 입력하면 장문의 메시지가 출력될 것이다.
// 물론 [핑거프린트]
부분은 각자의 핑거프린트로 대체한다.
~$ gpg --armor --export [핑거프린트]
-----BEGIN PGP PUBLIC KEY BLOCK-----
// 내용은 생략
-----END PGP PUBLIC KEY BLOCK-----
이 메시지를 내용뿐만 아니라 앞뒤의 -----
부분까지 복사해서 붙여넣은 뒤
Add GPG key
버튼을 누르면 다음과 같이 GPG key가 추가된 것을 확인할 수 있다.
자, 그러면 커밋할 때 서명을 적용하여 커밋을 하는 방법을 알아보자.
이 때, 커밋을 하는 PC에 본인의 GPG key가 있어야 한다.
데스크탑과 노트북 모두에서 사용하고 싶다면?
GPG key를 옮기는 방법에 대해서는 잠시 후에 설명하도록 하겠다.
커밋에 서명을 하기 위해서는 .gitconfig
에 서명 정보를 넣어야 한다.
이 파일은 직접 수정하지 말고 git config
명령어를 통해 수정하도록 하자.
~$ git config --global user.signingkey [핑거포인트]
그러면 이제 커밋할 때 -S
옵션을 추가하면 서명할 수 있다.
// 대소문자를 구분하니 대문자인 것을 잘 기억하자.
~$ git commit -S -m "Signed Commit! YEAHHHHH"
// 만약 여기서 오류가 난다면 오타가 나지 않았는지 잘 살펴볼 것.
// 오타도 없는데 문제가 발생한다면 따로 연락 주면 확인해보겠다.
서명을 한 것은 로그를 출력할 때 --show-signature
옵션을 추가하여 확인할 수 있다.
매번 이렇게 서명 옵션을 주기 귀찮다면(...) 항상 서명하도록 설정할 수도 있다.
~$ git config --global commit.gpgsign true
당장 써먹을 일이 없는 명령어들일 수 있겠으나 일단 알고 넘어가자.
나중에 필요하게 되면 그 때 찾아와서 보고 가도 상관 없는 부분이긴 하다.
GPG key를 내보내고자 하는 PC에서 다음 명령어를 실행한다.
~$ gpg --output [적당한 공개키 파일 이름].gpg --armor --export [핑거프린트]
~$ gpg --output [적당한 비밀키 파일 이름].gpg --armor --export-secret-key [핑거프린트]
이것이 공개키다 비밀키다 하는 걸 알아볼 수 있게 적당히 이름을 짓도록 하자.
비밀키를 내보낼 땐 GPG key 생성 시 사용했던 비밀번호를 요구할 수 있다.
그리고 비밀키는 절대 유출되지 않도록 주의하자.
ls
명령어를 통해 확인해보면 작성한 이름대로 *.gpg
파일들이 생성되었을 것이다.
GPG key를 불러오고자 하는 PC에 앞서 생성한 *.gpg
파일들을 옮긴 후,
다음 명령어를 실행한다.
~$ gpg --import [적당한 공개키 파일 이름].gpg
~$ gpg --allow-secret-key-import --import [적당한 비밀키 파일 이름].gpg
// 못찾는다고 하면 ./
를 붙인다거나 하여 경로를 명시해주자.
잘 옮겨졌다면 다음 명령어를 통해 핑거프린트를 확인할 수 있을 것이다.
~$ gpg --fingerprint
이제 유출 방지를 위해 *.gpg
파일들은 제거한다.
~$ rm [적당한 공개키 파일 이름].gpg [적당한 비밀키 파일 이름].gpg
공개키를 키 서버에 올려 놓으면 다른 사람이 이름이나 이메일을 통해 공개키를 알아갈 수 있다.
예를 들어...
@피터의 공개키는 keyserver.ubuntu.com에 등록되어 있어 해당 키 서버에서 찾을 수 있다.
그리고 키 서버는 정기적으로 동기화된다고 하니...
동기화된 상태라면 다른 곳에서도 확인할 수 있을 것이다.
웹 사이트를 통해 확인하지 않아도 터미널에서도 검색 가능하다.
~$ gpg --keyserver [키 서버] --search-keys [이름 또는 이메일]
예를 들어...
하지만 키 서버에 대한 것은 지금 주제와 크게 관련된 부분은 아니므로
언젠가 전자서명, 암호화 및 복호화에 대해 이야기할 일이 있으면
그것과 함께 다시 이야기하도록 하자.
관련 내용은 GitHub 공식 문서에서도 확인할 수 있다.