git-commit 서명하기

RunFridge·2024년 3월 25일

git

목록 보기
1/2
post-thumbnail

git commit의 진위 여부

git 버전관리에서는 git-commit으로 작업한 내용을 commit 단위로 저장할 수 있다.

git-log 커맨드로 레포지토리의 커밋 내역을 조회해보면 다음과 같은 정보를 포함하고 있다.

commit 35e5a96c728473cee9af87b5473a2ddfa88d1f67 (HEAD -> master)
Author: Jules Winfield<jules@pulp.fiction>
Date:   Mon Mar 25 19:57:21 2024 +0900

   Feat: Big Kahuna Burger
   
   Hawaiian Burger Joint

이를 통해서 우리는 특정 파일에서 누가, 언제, 무엇을 커밋했는지 조회할 수 있고 이러한 변경 사항들의 누적을 통해 버전관리를 할 수 있다. 그렇지만 커밋에 대한 진위여부(integrity)는 보장할 수 있을까?

git-blame-someone-else라는 프로젝트를 한번 보자:

시연을 보면 특정 커밋 해시의 username과 email을 바꿀 수 있다!
다음 커밋 내역과 같이 리누스 토르발즈의 커밋을 확인할 수 있는데, 사실 이것은 실제 리누스의 커밋이 아니다!

서명하기

이런 상황을 방지하기 위해서 git-commit을 서명하는 방법에 대해 알아보자!

마치 중요한 편지에서 씰링을 하듯이, 커밋 또한 서명을 할 수 있다!

Github에서는 서명된 commit은 다음과 같이 verified 배지가 표시된다.

선행

서명을하기에 앞서 선행되어야할 작업들이 있다:

  1. 유효한 이메일로 Github 계정에 연결하기. (Github 이메일 설정)

  2. global 또는 로컬 .git 디렉토리의 config에 이메일/이름 추가

    # global 설정
    $ git config --global user.email octocat@github.com
    $ git config --global user.name octocat
    
    # 로컬 설정
    $ git config user.email octocat@github.com
    $ git config user.name octocat

서명을 하기위해서는 서명을 할 공개 키를 만들어야하는데 이는 Gnu Privacy Guard(GPG)로 서명이 가능하다.

GPG

Github 문서

  1. 터미널에서 다음 커맨드를 실행하여 키 생성을 시작한다.

    # GPG 버전 확인
    $ gpg --version
    
    # GPG 2.1.17 버전 이상
    $ gpg --full-generate-key
    
    # GPG 2.1.17 이하
    $ gpg --default-new-key-algo rsa4096 --gen-key
  2. 프롬프트에서 키 종류 선택 또는 Enter로 기본값 지정

  3. 프롬프트에서 키 사이즈 지정 또는 Enter로 기본값 지정

  4. 프롬프트에서 키 만료시간 지정 또는 Enter로 기본값 지정

  5. 선택된 키 옵션 확인

  6. 이름 입력

  7. 이메일 입력 (Github에서 인증된 이메일 또는 Github에서 주어진 noreply 이메일 - 참조)

  8. 서명시 사용할 암호 입력

  9. GPG 키 목록 조회

    $ gpg --list-secret-keys --keyid-format=long
    /Users/hubot/.gnupg/secring.gpg
    ------------------------------------
    sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
    uid                          Hubot <hubot@example.com>
  10. 목록에서 사용할 GPG 키의 ID를 아래 커맨드에 입력:

    $ gpg --armor --export 3AA5C34371567BD2
    # ASCII armor 포맷으로 GPG Key 출력
  11. git에 서명 키 추가:

    # global 설정
    git config --global user.signingkey 3AA5C34371567BD2
    
    # 로컬 설정
    git config user.signingkey 3AA5C34371567BD2
  12. -----BEGIN PGP PUBLIC KEY BLOCK-----로 시작하여 -----END PGP PUBLIC KEY BLOCK-----로 끝나는 GPG 키를 복사한다.

  13. Giuthub Access - SSH and GPG Keys 설정 페이지로 이동한다.

  14. GPG Keys 섹션에서 New GPG Key를 클릭하여 복사한 GPG 키를 등록한다.

  15. git-commit 서명하기:
    -S 옵션으로 커밋 서명이 가능하다.

    git commit -S -m "커밋 메시지"
    # 서명된 commit을 생성한다
    # 커밋시 GPG 키 생성에 등록한 비밀번호 프롬프트가 나온다
  16. (선택) 항상 모든 커밋에 서명을하고 싶다면 아래 같은 설정을 추가하면된다.

    git config --global commit.gpgsign true

0개의 댓글