Jitrak Blog

Commit GitHub with signature verification with Keybase

Commit GitHub ด้วย signature verification กับ Keybase

06 Oct 2023 04:00

Written by: Yosapol Jitrak

Commit with signature verification
Tags:

Git

GPG

GitHub

ไม่แน่ใจว่าหลาย ๆ ท่านเคยสังเกตเห็นคำว่า Verified เวลา Merge commit ผ่าน GUI ของ GitHub แบบนี้กันบ้างไหม Merge with signature verification

แต่ถ้าเป็น Commit อื่น ๆ ที่ Push ขึ้นไปจากเครื่องเราจะไม่มี Verified แบบนี้ แล้วมันคืออะไร แล้วจะให้ Commit จากเครื่องเรามี Verified แบบนี้ได้อย่างไร ก่อนอื่นเลยก็ต้องเข้าใจก่อนว่า Verified ที่แสดงหมายถึงอะไร About commit signature verification สรุปสั้น ๆ คือมาจากเครื่องที่เชื่อถือได้ มี Sign จริง ๆ หรือเครื่องเรานั้นเอง ซึ่งเราสามารถไปทำ Policy ว่าจะ Push commit ขึ้นมาได้ก็ต่อเมื่อมี Sign ที่ Verified แล้วเท่านั้นด้วยก็ได้ โดยสถานะจะมีอยู่ 3 แบบ

มีคนเคยเขียนสรุปวิธีการทำไว้แล้ว ถึงแม้จะเก่าหน่อย แต่สามารถไปอ่านบทความนี้ได้ รู้จักกับ Keybase และวิธีเซ็นต์ Git Commit แบบอัตโนมัติ แน่นอนบทความนี้ผมจะมาสอนวิธีการทำด้วยเช่นกัน เพราะบทความนั้นเก่ามากแล้ว หน้าตา Output ที่ได้มีปรับเปลี่ยนไปบ้างเล็กน้อยจากบทความ

ตอนนี้เราต้องมาเข้าใจก่อนว่าเราสามารถ Sign ด้วยอะไรได้บ้าง GPG, SSH หรือ S/MIME หลาย ๆ คนคงจะคุ้นเคยกับ SSH อยู่แล้ว แต่ SSH มีข้อจำกัด อย่างใส่เวลาหมดอายุ และ Revoke สิทธิ์ไม่ได้ ซึ่ง GPG สามารถทำสิ่งที่ว่ามาได้ ส่วน S/MIME เขาบอกว่าเหมาะกับองค์กรใหญ่ ซึ่งผมก็ไม่เคยใช้เหมือนกันครับ

ต่อมาถามว่าทำไมต้องใช้ Keybase ด้วย ซึ่งถ้าอ่านจาก Document ของ GitHub ก็จะเห็นว่าไม่เห็นจำเป็นจะต้องใช้ Keybase เลยก็ได้นิ Keybase สามารถช่วยเก็บ และจัดการ GPG key ของเราได้ มาเริ่มกันเลยดีกว่าครับ

  1. ติดตั้ง GPG และ Keybase ในตัวอย่างนี้ผมยกตัวอย่างเป็นการติดตั้งผ่าน Homebrew ครับ ซึ่งคุณผู้อ่านสามารถติดตั้งด้วยวิธีอื่นก็ได้เช่นกันครับ สำหรับ Windows ถ้าใช้ผ่าน WSL ไม่จำเป็นต้องติดตั้ง Keybase ที่เป็น GUI ก็ได้นะครับ
brew install gpg keybase
brew install --cask keybase
  1. ทำการสร้าง Account และ Login Keybase ให้เรียบร้อยครับ
## Login Keybase via CLI
keybase login
  1. Generate GPG
keybase pgp gen
Enter your real name, which will be publicly visible in your new key: Yosapol Jitrak
Enter a public email address for your key: [email protected]
Enter another email address (or <enter> when done): [email protected]
Enter another email address (or <enter> when done): [email protected]
Enter another email address (or <enter> when done):
Push an encrypted copy of your new secret key to the Keybase.io server? [Y/n] y
When exporting to the GnuPG keychain, encrypt private keys with a passphrase? [Y/n]

จะเห็นว่ามีให้เราเลือกได้ว่าจะ Push secret ขึ้น Keybase หรือไม่ อันนี้ผมก็ตอบ Yes ไปนะครับ

กรณีเคย Gen gpg ไปก่อนหน้านี้แล้ว แต่ต้องการ Generate ใหม่ สามารถทำได้โดยการใส่ --multi ครับ

keybase pgp gen --multi

หรือหากต้องการ Import key เดิม สามารถทำได้เช่นกัน

โดยการ List key มาก่อน

keybase pgp list

จะได้ Output ประมาณนี้

Keybase Key ID:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PGP Fingerprint: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
PGP Identities:
   Yosapol Jitrak <[email protected]>
   Yosapol Jitrak <[email protected]>
   Yosapol Jitrak <[email protected]>

Copy Keybase Key ID ที่ได้มา แล้วทำการ Import ด้วยคำสั่ง

keybase pgp export -q XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | gpg --import
keybase pgp export -q XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --secret | gpg --allow-secret-key-import --import
  1. ทำการ Export public key และเอาไปใส่ที่ GitHub account
keybase pgp list

จะได้ Output ประมาณนี้

Keybase Key ID:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PGP Fingerprint: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
PGP Identities:
   Yosapol Jitrak <[email protected]>
   Yosapol Jitrak <[email protected]>
   Yosapol Jitrak <[email protected]>
keybase pgp export -q XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | pbcopy

เข้าไปที่ GitHub > Settings > SSH and GPG keys > New GPG key แล้วใส่ชื่อ Key และ Public key ที่ Copy ไว้จากคำสั่งล่าสุดได้เลย

  1. ทำการ Config Git ให้ใช้ GPG ที่เรา Generate มา
gpg --list-secret-keys --keyid-format LONG

จะได้ Output ประมาณนี้

sec   rsa4096/XXXXXXXXXXXXXXXX 2023-09-03 [SC] [expires: 2039-08-30]
      YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
uid                 [ unknown] Yosapol Jitrak <[email protected]>
uid                 [ unknown] Yosapol Jitrak <[email protected]>
uid                 [ unknown] Yosapol Jitrak <[email protected]>
ssb   rsa4096/ZZZZZZZZZZZZZZZZ 2023-09-03 [E] [expires: 2039-08-30]

ให้เรา Copy ค่า XXXXXXXXXXXXXXXX หลัง rsa4096 เอาไว้

หลังจากนั้นให้ไปเติม Config ของ Git config ที่ Path ~/.gitconfig หรือที่ Path ของ Git account ที่เราทำแยกเอาไว้จากบทความที่แล้ว เรื่อง Manage multiple Git account in machine โดยเติม signingkey แล้วตามด้วยค่า XXXXXXXXXXXXXXXX ที่ได้ทำการ Copy เอาไว้ก่อนหน้านี้ และใส่ gpgsign = true ด้วย

ตัวอย่าง Git config

[user]
email = [email protected]
name = Yosapol Jitrak
signingkey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[github]
user = "Eji4h"

[commit]
gpgsign = true

[core]
sshCommand = "ssh -i ~/.ssh/id_ed25519_personal"

หลังจากนี้เวลาเรา Commit จะมีเครื่องหมาย Verified มาให้เราแล้วครับ ถ้าติดปัญหาสามารถลองไปอ่านวิธีแก้ปัญหาได้ที่ Set up Keybase.io, GPG & Git to sign commits on GitHub Final commit with verified

หวังว่าบทความนี้จะเป็นประโยชน์นะครับ เจอกันใหม่บทความหน้า Bye Bye 👋