skip to content
my_small_recipe_book

git commit gnupg로 서명해서 보내기

/ 5 min read

Updated:

해야할 것 요약

  1. 필요한 패키지 설치
    • idx 설정, nix
  2. gnupg 설정
    • gpg.conf,gpg-agent.conf
  3. 키 만들기
  4. 깃허브에 등록하기
  5. 깃 설정하기

무슨 일이 있었나

github에서 pull request하는 중, commit이 서명되지 않았다는 보안 경고가 떳습니다.
git 보안 설정 중에 서명된 commit이 아니면 merge가 안 되게 하는 것이 켜져 있었습니다.
그래서 서명해서 commit을 push하는 법을 검색했습니다.

뭘 했나

먼저 필요한 도구를 찾아서 설치하려고 했습니다.

패키지 설치

google idx를 사용하는 중이라 nix로 패키지를 불러오는 법을 찾아서 적용했습니다.

  • shell.nix 파일을 작성해서 nix-shell을 실행할 때 필요한 도구를 설치하거나
    • 이 경우는 터미널에서 nix-shell을 실행해서 다음 작업을 진행해야 합니다.
shell.nix
# nix-shell로 실행할 때 필요한 설정
{ pkgs ? import <nixpkgs> {}
}: pkgs.mkShell {
nativeBuildInputs = with pkgs.buildPackages; [
gnupg
pinentry-curses
];
}
  • dev.nix 파일을 수정해서 필요한 도구를 작업공간 빌드할 때 추가해야 합니다.
dev.nix
# 작업 공간에 설치할 패키지 정의
{ pkgs, ... }: {
# ...
packages = [
# ...
pkgs.gnupg
pkgs.pinentry-curses
];
# ...
}

gnupg 설정

필요한 도구를 설치했으니 보안 키를 생성, 관리하는 gnupg를 설정합니다.
설정을 위해 아래와 같이 파일들을 작성합니다.

~/.gnupg/gpg.conf
use-agent
pinentry-mode loopback
~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-curses
allow-loopback-pinentry

gnupg 설정이 끝나면 gpg-agent를 종료합니다.

  • gpgconf --kill gpg-agent

참조, gnupg 문서

키 만들기

gnupg 설정이 끝나면 사용할 키를 생성하기 위해 아래 명령을 입력합니다.
gpg --full-generate-key

만들 키 종류, 옵션을 설정하고 키에 담을 개인 정보인 이름, 이메일, 암호를 입력합니다.

생성되면 키에 대한 정보가 출력됩니다. 출처

깃허브에 등록하기

만든 GPG 키를 깃허브에 등록합니다.

  • 깃허브 Setting > Access > SSH and GPG keys에서 New GPG key를 클릭해서 등록화면이 나옵니다.
  • 깃허브에 등록하기 위해서 키를 출력합니다.
    • gpg --armor --export {key fingerprint}
    • 출력된 키 복사할 때 ----BEGIN ...에서 ----END ... 줄까지 복사해서 붙여넣기 합니다.
    • 등록화면의 키 이름은 깃허브에서 구별하기 쉽게 하기 위해서 둔 것으로 키에는 영향이 없습니다. 참조

깃 설정하기

등록한 키를 사용하기 위해 깃을 설정합니다.

  • 사용할 키를 설정하기 위해 키 ID를 입력합니다.
    • git config --global user.signingkey {key fingerprint}
  • 커밋과 테그를 항상 서명하기 위해 다음과 같이 설정합니다.
    • git config --global commit.gpgsign true
    • git config --global tag.gpgsign true
  • 혹은 커밋 할 때, -S 옵션을 붙여서 서명할 수 있습니다.
    • git commit -S -m {"message"}

참조 1 참조 2

여담

  • 문제를 해결하려고 했던 일들 중에 어떤 일이 필요한 일인지 걸러내는 것이 골치 아프네요.

  • 위에 있는 설정들을 해도 vscode gui에서 커밋하려고 하면
    gpg: cannot open '/dev/tty': No such device or address 에러가 발생합니다.

  • 일단 bash에서 명령어를 입력해서 커밋하면 정상적으로 서명이 됩니다.

  • gpg-agent.conf에서 default-cache-ttl, default-cache-ttl 옵션을 추가해서
    세션 유지 시간을 늘려 놓은 뒤,

  • 처음에 bash에서 커밋하고 다음에는 vscode에서 커밋하는 것으로 대처하긴 했습니다.

  • 이건 더 찾아봐야 할 것 같습니다.

git 관련된 설정들

  • gpg.program
    • 깃에서 gpg키로 서명할 때 어떤 프로그램을 쓸지 정하는 옵션