GitHub에 GPG를 이용하여 서명된 commit 사용하기

최근 소스관리는 대부분 git를 사용하고 있다. git는 기본적으로 username, email 정보를 사용해서 commit을 하고 저장소에 push 하여 코드를 로깅하고 업데이트한다. 이 때 GPG의 Key pair을 이용하여 사용자를 인증하는 보안 매커니즘을 사용할 수 있는데 GitHub에서 GPG를 이용하여 서명된 commit을 사용하는 방법을 소개한다.

GitHub에 GPG를 이용하여 서명된 commit 사용하기

최근 소스코드 관리는 대부분 Git 을 이용하여 형상관리를 한다. Git는 다양한 운영체제에서 사용할 수 있는데 GitHub에 저장소를 만들어 로컬 소스를 Git 호스팅 서비스까지 사용할 수 있다.

Git는 author 인증을 username 과 email 로 인증을한다.  git config --list 명령어로 현재 작업중인 저장소의 설정 내용을 확인할 수 있다. 만약 내 컴퓨터의 전역설정을 확인하고 싶을 경우 git config --list --global 명령어로 확인 가능하다.

만약 누군가 나의 username 과 email 을 사용해서 소스코드를 commit 해서 저장소에 push 한다면 단순히 username, email 정보만 알 수 있다면 내정보로 저장소에 기록하는 것이 가능하다. 이 때 author 인증을 signed commit 을 하게 된다면 다시 말해서 author 가 서명해서 commit 하게 된다면 앞의 문제점을 해결할 수 있다.

GitHub 에서는 GPG를 이용하여 signed commit 으로 author 을 인증할 수 있는 기능을 제공한다. 아래 스크린샷은 개인이 사용하고 있는 GitHub 의 한 저장소의 commit 이력이다. commit 옆에 Verified 라고라고 표시가 된 commit 이 바로 개인적으로 발급한 GPG 의 Key pairs 을 이용하여 인증확인이 된 commit 이다.

GPG 는 GnuPG(GNU Privacy Guard) 표준 RFC4880 에 따른 공개/비공개 키 암호화를 규정하는 오픈소스 소프트웨어이다. 이메일이나 문서를 주고 받을 때 Key pair 을 이용하여 문서를 암호화하고 복호화 하는데 사용한다.

GPG 설치

GPG는 크로스플랫폼을 지원하고 있다. 만약 MacOS를 사용한다면 Homebrew 를 이용하여 쉽게 설치할 수 있다.

brew install gpg2

GPG Suite 설치

MacOS에서 GPG를 사용할 경우 MacOS 에 키를 관리하는 KeyChain 처럼 GPG Keychain 을 이용하여 GPG를 좀 더 편리하고 직관적으로 상용할 수 있는데 GPG Suite를 설치하면 GPG에 관련된 모든 환경을 한번에 설치해서 사용할 수 있다.

brew install gpg-suite

GPG Key pair 생성

GPG Suite 를 설치한 후 GPG Keychain 을 실행한다. 그리고 New 버튼을 클릭해서 새로운 Key pair 을 생성한다. GPG 는 공개키, 비밀키 두 쌍의 키를 생성하는데 GPG Keychain 에서 이를 확인하거나 관리할 수 있다.

새로운 Key pair 을 생성하면 GPG 의 key server 에 공개키를 업로드할 지 물어본다. 공개키는 말 그대로 public 으로 내가 가진 비밀키 secret key를 이용하여 문서를 암호화 했을 경우 전달 받을 사람에게 public 키를 공유해서 그 키를 이용해서 평문으로 해석할 수 있는데 Key server 에 키를 업로드해서 공유하거나 또는 직접 다운받을 수 있다.

Key server  에 공개키를 업로드하는 것은 선택 사항이다. 이 과정이 끝나면 내 컴퓨터에 GPG로 생성한 공개키, 비밀키 Key pair 가 GPG 저장공간에 저장이 되고 GPG Keychain 에 추가된 것을 확인할 수 있다.

GPG Key 확인

GPG Keychain 이 아닌 터미널에서 명려어로 확인하고 싶을 경우 다음과 같이 gpg 명령어를 이용해서 확인 가능하다. 만약 GPG Suite 를 사용하여 GPG를 설치했을 경우 MacOS 용 gpg2가 설치되는데 /usr/local/MacGPG2/bin/gpg2 명령어를 사용하면 된다.

gpg --list-keys

비밀키 목록을 확인하고 싶을 때는 --list-secret-keys 옵션과 함께 명령어를 실행한다.

gpg --list-secret-keys

가끔 KeyId 를 입력해야하는 경우가 생겨 KeyId를 조회할 필요가 있는데 --keyid-format LONG 옵션을 추가해서 명령어를 실행하면  KeyId 확인이 가능하다.

gpg --list-secret-keys --keyid-format LONG

이렇게 생성한 Key pair 은 export 버튼을 사용하거나 생성한 키 위에서 마우스 오른쪽 클릭을 통해서 할 수 있다.

키 파일을 export 할 때 public key 와 secret key 를 모두 export 하거나 선택적으로 할 수 있다. 아래는 public 키만 export 했을 경우의 저장되는 파일이다.

export 한 파일을 열어보면 public key 가 저장되어 있는 것을 확인할 수 있다.

공개키(public key) 내용을 확인하고 복사해서 공개키를 GitHub 에 등록한다.

GitHub 에 GPG 공개키 등록

브라우저에서 GitHub 사이트에 접속하여 Settings > SSH & GPG Key 메뉴로 이동한다. 그리고 New GPG key 버튼을 클릭해서 앞에서 복사한 공개키(pubilc key) 내용을 GitHub 에 저장하여 등록하면 다음 그림과 같이 새로운 GPG 공개키가 등록된 것을 확인할 수 있다.

Git config 에 GPG 와 signing 설정

이제 GPG 를 이용한 signed commit 을 위한 마지막 설정이다. Git를 이용하여 관리하고 있는 디렉토리 안으로 이동한다. git 에 관한 설정은 git config --list 명령어로 확인할 수 있는데 기존에 user.signingkey, commit.gpgsign 그리고 gpg.program 설정이 없다면 다음 명령어로 git config 내용에 추가한다.

git config commit.gpgsign true

gpg.program/usr/local/bin/gpg/usr/local/MacGPG2/bin/gpg2 중에 설정하면 된다.

git config gpg.program /usr/local/MacGPG2/bin/gpg2
git config user.signingkey "앞에 생성한 secert key 아이디입력"

이제 모든 설정이 끝났다. 마지막으로 git config 명령어를 통해서 설정된 정보를 확인한다.

git config --list

Git signned commit 서명과 인증

이제 소스코드를 수정하고 git commit 과 push 를 사용해서 GitHub 로 소스코드를 올릴 때 GPG Key pair를 생성할 때 지정한 비밀번호를 물어보게 되는데 비밀번호를 입력하면 secret key 기반으로 signed commit 이 만들어져 GitHub 로 전송하게 된다. 그리고 GitHub 에서 앞서 등록해둔 publick key 기반으로 인증하게 되어 Verified 된 커밋이 저장된다.

참고