Commit GitHub ด้วย signature verification กับ Keybase
06 Oct 2023 04:00
Written by: Yosapol Jitrak
ไม่แน่ใจว่าหลาย ๆ ท่านเคยสังเกตเห็นคำว่า Verified เวลา Merge commit ผ่าน GUI ของ GitHub แบบนี้กันบ้างไหม
แต่ถ้าเป็น 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 ของเราได้ มาเริ่มกันเลยดีกว่าครับ
brew install gpg keybase
brew install --cask keybase
## Login Keybase via CLI
keybase login
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
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 ไว้จากคำสั่งล่าสุดได้เลย
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
หวังว่าบทความนี้จะเป็นประโยชน์นะครับ เจอกันใหม่บทความหน้า Bye Bye 👋