안녕하세요!

오늘은 GitHub에 커밋할 때, 해당 커밋에 서명을 하는 방법에 대해 알아보려 합니다!


커밋에 서명을 한다구요?

네! 비슷한 개념으로는 공인인증서를 이용하여 본인 확인을 하는 개념으로 보시면 됩니다.

대부분 기업에서 배포하는 프로그램들을 보면 자사의 인증서를 이용하여 프로그램에 "서명"을 하는데요,

"서명"을 함으로써 프로그램의 배포자가 누구인지 알 수 있고, 프로그램의 변조 여부를 보장할 수 있게 됩니다.


마찬가지로, 커밋에 서명을 하게 된다면?

"이 커밋은 이 사용자(혹은 단체)에 의해 실행된 것이다" 라는 보장을 해줄 수 있는 것이죠!



커밋에 서명을 한다면 서명을 하지 않은 커밋과 어떻게 구별이 가능할까요?


서명한 커밋의 경우엔 GitHub 내 프로젝트의 커밋 탭에서 아래의 그림처럼 표시되어, 확인이 가능합니다.


그럼, 서명을 하기 위해선 어떻게 해야 하는지 알려드리도록 하겠습니다.


서명 기능을 사용하기 위해선 "키 생성 작업" 과 "키 등록 작업" 을 해주셔야 하는데요,

"키 생성 작업"에 대해 먼저 알려드리도록 하겠습니다.


1. 가장 먼저 gpg 클라이언트가 설치되었는지 확인하기 위해 명령 프롬프트 혹은 터미널을 이용하여 gpg --version 명령을 실행합니다.

만약, gpg 명령이 실행되지 않을 경우 GnuPG 홈페이지(https://gnupg.com)로 이동하셔서 gpg 클라이언트를 설치해주세요.

(!! GnuPG 버전이 최신 버전이 아닐 경우, 이 게시글을 따라하는데 오류가 발생할 수 있으므로 최신 버전으로 설치/업데이트 해주세요 !!)


2. gpg 설치/업데이트를 완료했다면 이제 본격적으로 gpg 키를 생성할 시간입니다.

다음 명령을 순서대로 입력해주세요.

gpg --full-generate-key

이 명령을 수행하면 키를 어떻게 생성할 것인지 물어봅니다.

2-1

Please select what kind of key you want (어떤 서명 알고리즘을 사용할 것인지)

기본값인 RSA and RSA를 선택합니다.

2-2

What keysize do you want? (얼마만큼의 키 길이를 사용할 것인지)

4096을 입력합니다.

2-3

Key is valid for? (키 유효 기간을 설정하는 구간)

키의 유효 기간을 따로 설정하지 않을 것이므로 0을 입력합니다. (만료기간이 없음)

정말 확실한지 재차 물어보는데, 이 때 설정한 값이 다르거나 변경하시려면 N을 입력하여 다시 입력하시면 됩니다.

2-4

Real name/email address/comment (GitHub 이름과 이메일 주소를 입력/키에 대한 설명문)

모두 입력이 완료되었으면 한번 검토하신 후 O를 입력해주시면 키 생성이 마무리됩니다.

2-5

잠시 기다리시면 아래 그림과 같은 창이 뜨면서 Passphrase(암호문)를 입력하라고 뜹니다.

이 암호가 키의 암호가 됩니다. (커밋에 서명할 때에도 비슷한 창이 나와 암호를 입력받습니다)


암호를 입력하시고 잠시 기다리시면 아래 그림처럼 키에 대한 정보를 출력해주고 키 생성 작업이 완료됩니다.


이제 생성된 GPG 키를 GitHub 계정에 등록할 차례입니다.

먼저, GitHub 계정에 로그인하신 후 설정(Settings)의 SSH and GPG keys 라는 메뉴로 이동하셔야 합니다.

설정 메뉴로 이동하신 후 왼쪽 메뉴를 보시면 "SSH and GPG keys" 라는 탭이 있습니다.

해당 탭을 클릭해주세요!


SSH and GPG keys 탭을 누르시면 GPG keys 라는 곳에 등록된 키가 있을 경우 해당 키의 정보가 표시됩니다.


키를 등록하기 위해 오른쪽 New GPG key 버튼클릭합니다.

아래 그림처럼 성의 없이 텍스트박스 하나만 덩그러니 놓여져 있습니다.


이제 이전에 생성한 키를 계정에 등록하기 위해 PGP 공개 키 블록 정보를 입력해야 합니다.

1gpg --list-keys 명령을 이용하여 이 컴퓨터에 저장되어 있는 gpg 키 목록을 표시합니다.

키가 정상적으로 생성된 경우 아래 그림처럼 키의 알고리즘 정보/생성 일자/사용자 및 메일 정보 등이 표시됩니다.

이 정보 중 pub 두번째 줄에 표시된 "9A90B8E89...." 16진수 값을 복사합니다.


2gpg --armor --export <복사한 16진수 값> 명령을 사용하여 PGP 공개 키 블록 형태로 콘솔에 출력합니다.

아래 그림처럼 콘솔에 PGP 공개 키 블록이 출력됩니다. 이 값을 -----BEGIN PGP PUBLIC KEY BLOCK----- 부분부터 -----END PGP PUBLIC KEY BLOCK-----부분까지 통째로 복사한 후 GPG keys / add new 페이지의 텍스트박스에 붙여넣습니다.



제대로 따라하셨다면 gpg keys 페이지에 아래 그림처럼 키가 추가되어 있는 것을 확인하실 수 있습니다.


사진에서 표시되는 Key ID의 경우는 GPG 키가 여러 개 등록되어 있을 경우에 어떤 키를 사용할 것인지 수동으로 설정할 때 필요합니다.

이 글에서는 GPG 키가 한 개만 등록되어 있다고 가정할 것이므로 넘어가겠습니다. 혹시 이에 대해 궁금하신 점이 있으신 분은 댓글로 남겨주세요!


이제 커밋을 해볼 차례입니다!!


키가 정상적으로 계정과 연동되었다면 git에서 gpg 키 중 global config의 username과 email이 일치한 키를 알아서 선택해줍니다.

이제 아까 키를 생성할 때 입력했던 암호를 입력한 후 OK를 누르시면 서명된 커밋이 올라가게 됩니다.


자꾸 키를 찾을 수 없다는 오류가 발생합니다. 이유가 뭐죠?

gpg 명령을 실행했을 때 git에 내장된 gpg 클라이언트가 실행되기 때문입니다.

이럴 땐 수동으로 gpg 클라이언트의 위치를 설정해줘야 하는데요!

git config --global gpg.program "GPG 클라이언트 프로그램의 위치" 명령으로 해결이 가능합니다.



지금까지 커밋에 서명하는 방법을 알려드렸습니다.

쓰기 전엔 정말 간단할 줄 알았는데 막상 글을 쓰고나니 너무 길게 풀어서 설명한 느낌이 나네요.

아무쪼록 새로운 지식을 하나 얻었고, 공유하고 싶어 이렇게 글을 쓰게 되었습니다.


읽어주셔서 감사합니다.


참고:

Git 도구 - 내 작업에 서명하기

GitHub - Managing commit signature verification

+ Recent posts