
언젠가 Github 의 내 PR에서 어떤 commit 은 왼쪽에 Verified 표시가 있고, 어떤 것은 없는 것을 눈치챘다. github 웹에서 update base 를 하거나, 바로 README.md 를 바꾸거나 하면, 해당 commit 왼쪽에 Verified 표시가 붙었다.
내가 만든 모든 commit 에 Verified 표시를 붙이고 싶어서, 어떻게 하면 되는지 찾아보기 시작했다.
$ gpg --full-generate-key
반드시 4096bits를 선택해야 한다.
하나의 gpg key만 있다면, 별도로 git에게 gpg key를 알려주지 않아도 된다.
하지만 여러개의 gpg key를 가지고 있다면, 어떤 gpg key를 사용할 것인지 git에게 알려주어야 한다.
이제부터는 cli에서 git commit 할 때 -S 옵션을 붙이면 commit에 디지털 서명이 들어가게 된다.(※ vscode 등의 IDE에서 GUI로 커밋하는 경우 자동으로 -S 옵션을 붙여주기도 한다.)
git config commit.gpgsign true
git config --global commit.gpgsign true
GnuPG는 RFC4880(PGP라고도 함)에서 정의한 OpenPGP 표준을 완전하고 무료로 구현한 것이다.
GnuPG는 사용자가 안전하게 통신할 수 있도록 공개 키 암호화(public-key cryptography)를 사용합니다.
공개 키 시스템에서는 각 사용자가 개인 키(private key)와 공개 키(public key)로 구성된 키 쌍을 가집니다.
사용자의 개인 키는 기밀로 유지되므로 절대 공개할 필요가 없습니다.
공용 키는 사용자가 통신하려는 모든 사용자에게 제공할 수 있습니다.
공용 키와 개인 키는 각각 문서를 암호화하고 암호를 해독할 때 특정한 역할을 합니다. 공개 키는 열린 금고로 간주할 수 있습니다. 통신원이 공개 키를 사용하여 문서를 암호화하면 해당 문서가 금고에 보관되고 금고가 잠깁니다. 해당 개인 키는 금고를 다시 열고 문서를 검색할 수 있는 조합입니다. 즉, 개인 키를 가지고 있는 사용자만 연관된 공용 키로 암호화된 문서를 복구할 수 있습니다.
예를 들어 앨리스와 톰이 암호로 메세지를 주고 받는다고 가정해보겠습니다.
1. 톰이 앨리스에게 보내는 메시지를 암호화
톰은 앨리스의 공개 키를 사용하여 암호화한 후 앨리스에게 보냅니다. 앨리스는 앨리스의 개인 키로 암호를 해독합니다.
2. 앨리스가 톰에게 암호화된 메세지를 보내려면
앨리스는 톰의 공개 키를 사용하여 메시지를 암호화하여 톰에게 보냅니다. 톰은 톰의 개인 키로 암호를 해독합니다.
GPG key를 이용하여 디지털 서명 기능도 이용할 수 있습니다. github 도 바로 이러한 기능을 사용하여 verified 표시를 하고 있습니다.
서명은 서명자의 개인 키를 사용하여 생성됩니다. 서명은 해당 공개 키를 사용하여 확인합니다.
git commit 시에 생성한 GPG private key로 디지털 서명을 합니다. 그뒤 remote repository에 push 합니다. github 는 유저가 등록한 public key를 이용하여 유저의 디지털 서명을 확인하여 실제로 유저가 push 한 것인지를 검증합니다.