Git 커밋에 서명을 원합니다.

macOS Catalina에서 Git 커밋에 서명을 붙인 이야기. 서명에는 OpenPGP 구현GnuPG을 사용한다.

상상도





준비하는 것



homebrew package


  • gnupg
  • pinentry
  • pinentry-mac

  • homebrew cask


  • gpg-suite

  • 열쇠 만들기



    일반적인 비밀키의 암호화 방식은 ed25519 하지만, --expert 옵션이 없으면 사용할 수 없다.
    % gpg --full-gen-key --expert
    

    상세한 설명은 gpg 없음을 읽고 싶으면, 목적에 맞게 subkey를 만들 수 있다. 이번에는 서명과 인증용으로 두 가지 준비한다.

    Git에 서명


    commit.gpgsign 옵션이 있으므로 활성화하십시오. user.signingkey 선택적으로 서명에 사용할 키 ID를 지정합니다. 키의 ID는 --list-keys (또는 --list-secret-keys) 옵션으로 출력할 수 있다 1.
    % cat ~/.gitconfig
    ───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
           │ File: /Users/unlovingly/.gitconfig
    ───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1   │ [commit]
       2   │   gpgsign = true
       3   │ [user]
       4   │   signingkey = B933F6FE0FC19F4F
    ───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    % gpg --list-keys --keyid-format long [email protected]
    pub   ed25519/5E4449CA75763271 2020-06-05 [C]
          9FACEB719D03D05FF61045485E4449CA75763271
    uid                 [ultimate] unlovingly <[email protected]>
    sub   ed25519/B933F6FE0FC19F4F 2020-06-05 [S] [expires: 2021-06-05]
    sub   ed25519/48AA4D1E17FF6BA9 2020-06-05 [A] [expires: 2021-06-05]
    

    커밋 할 때 pinentry가 비밀 키의 패스 문구를 묻습니다. Keychain Access.app에서 기억할 수도 있습니다(이미지는 pinentry-curses).



    나머지는 GitHub에 열쇠를 등록하면, 처음의 Verified 배지를 얻을 수 있다.

    GitHub에 키 등록



    GitHub 계정에 새 GPG 키 추가 - GitHub 고객센터

    SSH 연결에 사용


    Authenticate 용으로 subkey 48AA4D1E17FF6BA9를 준비했습니다.

    그런데 GnuPG에서 공개 키 인증을 한다면 ssh-agent(1) 대신 gpg-agent(1)를 사용한다.

    gpg-agent에는 OpenSSH 에이전트의 에뮬레이션 기능이 있습니다.
    % cat ~/.gnupg/gpg-agent.conf
    ───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
           │ File: /Users/unlovingly/.gnupg/gpg-agent.conf
    ───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1   │ default-cache-ttl 86400
       2   │ max-cache-ttl 86400
       3   │ pinentry-program /usr/local/bin/pinentry-mac
    ───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    

    gpg-agent는 인증 할 키의 키 그립을 가르칩니다.
    % gpg --list-secret-keys --with-keygrip [email protected]
    sec   ed25519 2020-06-05 [C]
          9FACEB719D03D05FF61045485E4449CA75763271
          Keygrip = 84500D69B6BAAF559687F31981319E74BF5B0386
    uid           [ultimate] unlovingly <[email protected]>
    ssb   ed25519 2020-06-05 [S] [expires: 2021-06-05]
          Keygrip = 6ADFDE069EC89D029B34AA3B2409EAC3B5854709
    ssb   ed25519 2020-06-05 [A] [expires: 2021-06-05]
          Keygrip = F304C7E7D0A5715E550FDAAE2237B0A44CADF5CC
    
    % echo F304C7E7D0A5715E550FDAAE2237B0A44CADF5CC >> ~/.gnupg/sshcontrol
    

    또한 공개 키를 생성하여 원격 호스트에 설정해야 합니다. 생성에는 --export-ssh-key 옵션을 사용한다. 인수는 key ID 를 취한다. suffix !가 있으면 Authentication capability를 확인하지 않습니다.
    % gpg --export-ssh-key 48AA4D1E17FF6BA9
    

    gpg-agent를 시작합니다.
    % gpgconf --launch gpg-agent
    
    % cat ~/.ssh/config
    ───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
           │ File: /Users/unlovingly/.ssh/config
    ───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1   │ Host *
       2   │     ForwardAgent yes
    ───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    % ssh example.com
    

    참고


  • gpg 없음
  • 이제 GnuPG에서도 ECC를 표준으로 사용하는 것이 좋지 않을까요 — OpenPGP 구현 | text.Baldanders.info
  • GnuPG - ArchWiki
  • GitHub 계정에 새 GPG 키 추가 - GitHub 고객센터
  • gnupg - Are GPG and SSH keys interchangable? - Super User
  • 힘내 서명의 거짓말 - 아마네케!



  • 이 기사를 쓸 때 열쇠를 만들었기 때문에 처음의 이미지와는 ID가 다르다 

    좋은 웹페이지 즐겨찾기