- github 에서 서명된 커밋 (gpg) 사용하기2022년 08월 01일
- 루루개발자
- 작성자
- 2022.08.01.오후11:41
반응형안녕하세요! 루루개발자 입니다.
회사 업무를 하다 보면 가끔은 집에 있는 개인 PC 에서 재택으로 일을 하는 경우가 있는데, 그러다보니 git 의 글로벌 설정으로 user.name 과 user.email 을 회사 계정으로 설정해두고 사용하고 있었습니다. 하지만 가끔은 제 개인 레포지토리에 푸쉬를 날릴 때도 있는데, 이 때 실수로 제 회사 계정 정보로 커밋된 정보가 제 개인 레포지토리로 푸쉬 되는 경우가 종종 있었습니다. 이를 방지하기 위해 github 에서 public 으로 공개된 제 개인 레포지토리들의 branch rule 에서 서명된 커밋만 푸쉬가 가능하도록 설정하였고, 이후 서명된 커밋을 이용하는 방법에 대해 공유드리고자 합니다.
1. 개발 PC 에서 gpg 설치하기
우선 커밋할 때 서명을 사용하기 위해서는 gpg 를 설치해야 합니다.
Window 인 경우에는 아래 링크에서 설치하시면 됩니다.
https://gpg4win.org/get-gpg4win.html
Gpg4win - Get Gpg4win
gpg4win.org
Linux 인 경우에는 배포판인 경우 기본적으로 gpg 가 설치되어 있습니다.
Mac OS 인 경우에는 아래 명령어로 설치하시면 됩니다.
brew install gnupg2
2. gpg private key 생성하기
아래 명령어를 입력하여 커밋에 서명할 때 사용할 gpg private key 를 생성합니다.
gpg --full-generate-key
1. Please select what kin of key you want
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) (14) Existing key from card Your selection?
=> 1 을 입력하고 Enter
2. RSA keys may be between 1024 and 4096 bits long
RSA keys may be between 1024 and 4096 bits long.
=> 4096 을 입력하고 Enter
3. Please specify how long the key should be valid
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
=> 원하는 유효기간을 입력하고 Enter
4. Is this correct? (y/N)
Is this correct? (y/N)
=> y 를 입력하고 Enter
5. Real name:
Real name:
=> 커밋할 때 user name 에 해당하는 값을 입력하고 Enter
6. Email address:
Email address:
=> 커밋할 때 user email 에 해당하는 값을 입력하고 Enter
7. Comment:
Comment:
=> 원하는 Commnet 를 입력하고 Enter
8. Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
You selected this USER-ID: "honggildong <honggildong@test.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
=> 수정할 부분이 없다면 O 를 입력하고 Enter
9. Please enter the passphrase to protect your new key
=> private key 에 대한 암호를 입력 후 Enter
이렇게 해서 private key 생성이 완료되었습니다.
3. gpg public key 생성하기
우선 아래 명령어를 입력하여 gpg private key 목록을 확인합니다.
gpg --list-secret-keys --keyid-format LONG
그럼 다음과 같이 결과가 표시됩니다.
gpg: checking the trustdb gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u /root/.gnupg/pubring.kbx ------------------------ sec rsa4096/92C6F339530BAB4F 2022-08-01 [SC] FA34272A16E3C69B1648AB3E92C6F339530BAB4F uid [ultimate] honggildong <honggildong@test.co> ssb rsa4096/8DA2A021FC72E5CA 2022-08-01 [E]
위 결과 중에 "sec rsa4096/" 다음에 표시된 secret key id 에 해당하는 문자를 복사해둡니다. (위 예시 결과에서는 "92C6F339530BAB4F" 에 해당합니다.)
그리고 아래 명령어를 입력합니다.
gpg --armor --export {secret key id}
{secret key id} 부분에는 아까 복사한 secret key id 를 입력하면 됩니다.
그럼 다음과 같이 public key 가 표시됩니다.
-----BEGIN PGP PUBLIC KEY BLOCK----- mQINBGLn17gBEADE7amSrFXua7qesXVEv4YnwJ7LSm2KEmyHf8TIRVvLwF952Gi7 dSVAvOXaRo/Smxe+MsNSftHfaRmQhSE5K8CGRuz9UqA9bAXUrFBaV/eoKpzkTYu0 oGYLMYfJP/0DMWFCF/c0cz/eL2HE3BB0VBWOYxmZ5wkTLFU1fGdu1sPy4z3i8l/m 1KZp+g3tUIO5bJAb/UnteS77Us2Did4nIAIIJe/UdYy/yHECdvO7kc8+PWZWWECJ OnKpf54Ai2xs3ylV3mfbmsWAuV7GiEIK/UaENVf9xJOwy1uoIQ1dWGFrjYj+coDA ... ... (중간 생략) ... Tqnamb6Cl0+Ey6+0J9YrNL/l/4wE6ok7vGdZCCccssVlqqFCSi/zgZonQjHjCZA2 mlkjDqxPX288KwIwtq4lR2Ajz9E+FuQvbVwR/wFZ69kxKi0qhd/Rxt64nH+GfOtK Mvw5jMySOETdxgzQ0hUOsTXgw1z7NgWklSmYUa51+tMWcbO0eBSF+7qy1ly77jG8 kFZkTTG95RAYEMTl2V4GNDrThNMpvsdhz3G6WuQY0qtCPChXAsjT37tDfhaQxfhy vrM9G6TUIrvuF9DEwPAaKI5zvKbigHLsV2/TK85BD9FM4Go4NJNkLPcS1sWjliMh plq0RJEFznS8DXSOrEjjEKce5E9YuSH9pwY+xtSFWwi0m2TAHevBH4QFZVRv =fN8V -----END PGP PUBLIC KEY BLOCK-----
위에 나온 public key 를 복사해 둡니다.
4. github 에 gpg key 등록하기
이제 public key 를 github 에 등록해보겠습니다.
1. github 에 로그인 한 후 아래 url 에 접속합니다.
https://github.com/settings/keys
GitHub: Where the world builds software
GitHub is where over 83 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...
github.com
2. New GPG Key 버튼을 클릭합니다.
3. Key 부분에 아까 복사한 public key 를 붙여넣고 Add GPG Key 버튼을 클릭합니다.
이제 github 에 gpg public key 가 등록되었습니다.
5. 서명된 커밋만 푸쉬 가능하도록 설정하기
1. github 에서 서명된 커밋만 허용할 레포지토리의 설정 화면으로 들어가 좌측 메뉴 중에 "Branch" 를 클릭합니다.
2. Add rule 을 클릭합니다.
3. Branch Rule 이 적용될 branch 명 조건을 적습니다.
=> * 로 지정하면 모든 브랜치에 rule 이 적용됩니다.
4. "Require signed commits", "Include administrators" 항목에 체크합니다.
5. create 버튼을 클릭합니다.
6. 개발 PC 에서 프로젝트 git config 설정하기
이제 커밋을 할 때 서명을 적용할 프로젝트 경로로 가서 아래 명령어들을 입력해줍니다.
1. 커밋 할 때 gpg 서명 사용 옵션을 활성화 합니다.
git config commit.gpgsign true
2. gpg program 경로를 지정합니다.
Window 인 경우는 아래 명령어를 입력합니다.
git config gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Linux 인 경우는 아래 명령어를 입력합니다.
git config gpg.program /usr/local/bin/gpg
Mac 인 경우는 아래 명령어를 입력합니다.
git config gpg.program /opt/homebrew/bin/gpg
경로는 다소 상이할 수도 있으니 gpg 가 설치된 경로가 저게 맞는지 꼭 확인해보세요!
3. commit 에 사용할 서명키 설정
아래 명령어를 입력합니다.
git config user.signingkey {secret key id}
=> {secret key id} 부분에는 "gpg --list-secret-keys --keyid-format LONG" 명령어 결과에서 확인했던 secret key id 를 입력하면 됩니다.
4. mac vscode 에서 commit 시 "gpg failed to sign the data" 에러가 발생하는 경우
brew install pinentry-mac
위 명령어를 입력 후 vscode 에서 커밋 재시도를 합니다.
만약 그래도 안된다면, 아래 명령어를 통해 터미널로 커밋을 시도합니다.
export GPG_TTY=$(tty) git commit -m "커밋 메시지"
7. private key 백업과 private key 불러오기
private key 를 따로 백업하여 별도의 저장소에 저장해야 하는 경우가 있을 수 있습니다. 그럴 때는 아래 명령어를 통해 private key 를 파일로 내보내기 할 수 있습니다.
gpg --export-secret-keys --armor {secret key id} > {백업 경로}
반대로 private key 를 불러와야 하는 경우에는 아래 명령어를 통해 불러올 수 있습니다.
gpg --import {private key 경로}
마무리하며
이제 해당 레포지토리에서 해당 조건에 해당하는 branch 에 푸쉬를 할 때는 서명된 커밋을 필요로 하게 됩니다. 만약 커밋이 서명되어 있지 않거나, 서명의 name, email 과 커밋한 자의 name, email 이 일치하지 않는다면 github 로 푸쉬가 되지 않습니다. 서명된 커밋을 사용하는 이유는 커밋한 자의 name 과 email 이 정말 본인이 맞는지 확인하기 위함입니다. 만약 서명된 커밋을 사용하지 않는다면 레포지토리의 권한이 있는 다른 사람이 나의 name 과 email 로 설정하고 커밋 후 푸쉬하면 github 에는 내 계정 정보로 커밋한 기록이 생성되게 됩니다. 내가 푸쉬한게 아닌데도 내가 한걸로 나오게 된다는 말이죠. 이를 방지하기 위해 각 작업자별로 gpg private key, public key 를 생성하고 각 작업자들은 본인들의 gpg private key 로 커밋을 서명하고 푸쉬를 하는 것입니다.
반응형'IT 기타' 카테고리의 다른 글
안드로이드 디바이스가 절전모드일 때 발생한 이슈 (0) 2022.10.01 GET 메소드 요청시 body 를 보낼 수 있을까? (0) 2022.08.28 OAuth 2.0 에 대하여 (0) 2021.11.27 OSI 7계층 (0) 2021.10.27 프로세스(Process)와 스레드(Thread) (1) 2021.10.25 다음글이전글이전 글이 없습니다.댓글