คนเท่ๆ เขาจะมีแบบนี้กันนะรู้ยัง

Verified Commit ใน Gitlab
Verified Commit ใน Gitlab

เคยเห็นป้าย Verified สีเขียวข้าง Git commit ของคนอื่นไหม? นอกจากจะดูเท่ขึ้นนิดหน่อย ป้ายนี้ยังช่วยให้คนอื่นตรวจสอบได้ว่า commit ถูกเซ็นด้วย key ที่เชื่อมโยงกับบัญชีของเรา

ปกติชื่อและอีเมลใน Git ตั้งเป็นอะไรก็ได้ แต่การเซ็น commit จะเพิ่มลายเซ็นดิจิทัลเข้าไปให้ตรวจสอบได้อีกชั้นหนึ่ง

ทั้งนี้ Verified ไม่ได้แปลว่าโค้ดไม่มีบั๊กหรือปลอดภัยเสมอไป มันช่วยยืนยันที่มาของลายเซ็น ไม่ได้ช่วยรีวิวโค้ดแทนเพื่อนในทีม

วิธีที่ผมเลือกใช้คือ SSH key ซึ่งตั้งค่าได้ทั้งบน GitHub และ GitLab

Verified Commit ใน Github
Verified Commit ใน Github

สร้าง SSH Key สำหรับเซ็น Commit

ก่อนเริ่ม ตรวจสอบว่า Git เป็นเวอร์ชัน 2.34 ขึ้นไป และ OpenSSH เป็น 8.1 ขึ้นไป โดย GitLab ระบุว่า OpenSSH 8.7 มีปัญหาเรื่อง signing ถ้าใช้เวอร์ชันนี้ให้อัปเดตเป็น 8.8 ขึ้นไปก่อน

git --version
ssh -V

จากนั้นสร้าง key ใหม่ โดยเปลี่ยนอีเมลในตัวอย่างเป็นของตัวเอง

ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/GitSigningkey

เมื่อเสร็จแล้วจะได้สองไฟล์ใน ~/.ssh

  • GitSigningkey เป็น private key เก็บไว้กับตัว ห้ามส่งให้ใคร
  • GitSigningkey.pub เป็น public key เอาไว้เพิ่มใน GitHub และ GitLab

ดูชื่อไฟล์ให้ดีก่อนคัดลอกนะ ไฟล์ที่เราจะแชร์ได้คือไฟล์ที่ลงท้ายด้วย .pub เท่านั้น

ตั้งค่า Git ให้เซ็น Commit อัตโนมัติ

กำหนดชื่อและอีเมลสำหรับ commit ก่อน โดยใช้อีเมลที่เชื่อมโยงกับบัญชี GitHub หรือ GitLab ของเรา

git config --global user.name "Your_User_Name"
git config --global user.email "your_email@example.com"

จากนั้นตั้งค่าให้ Git ใช้ SSH key ที่เพิ่งสร้าง และเซ็น commit ใหม่โดยอัตโนมัติ

git config --global gpg.format ssh
git config --global user.signingkey "$HOME/.ssh/GitSigningkey.pub"
git config --global commit.gpgsign true

คำสั่งที่ใช้ --global จะเป็นค่าเริ่มต้นของทุก Repository บนเครื่อง ถ้าใช้บัญชีส่วนตัวกับบัญชีงานแยกกัน สามารถเปลี่ยนเป็น --local เพื่อตั้งค่าเฉพาะ Repository ได้

เพิ่ม Signing Key ใน GitLab

แสดง public key แล้วคัดลอกข้อความทั้งบรรทัด

cat ~/.ssh/GitSigningkey.pub

จากนั้นเข้าไปที่ SSH Keys ของ GitLab แล้วทำตามนี้

  1. กด Add new key
  2. วาง public key ลงในช่อง Key
  3. ตั้ง Title เช่น Git Signingkey
  4. เลือก Usage type เป็น Signing
  5. กดเพิ่ม key

GitLab จะตรวจสอบด้วยว่า committer email ใน commit ตรงกับอีเมลที่ยืนยันแล้วในบัญชีหรือไม่

เพิ่ม Signing Key ใน GitHub

ใช้ public key เดียวกันได้เลย โดยเข้าไปที่ SSH and GPG keys ของ GitHub

  1. กด New SSH key
  2. ตั้ง Title เช่น Git Signingkey
  3. เลือก Key type เป็น Signing Key
  4. วาง public key ลงในช่อง Key
  5. กด Add SSH key

แม้จะเคยเพิ่ม key เดียวกันไว้สำหรับเชื่อมต่อ GitHub แล้ว ถ้าต้องการใช้เซ็น commit ด้วย ก็ต้องเพิ่มอีกครั้งโดยเลือกชนิดเป็น Signing Key

ลองสร้าง Commit แล้วดูป้าย Verified

หลังตั้งค่าเสร็จ ลองสร้าง commit ใหม่และ push ตามปกติ

git add <file>
git commit -m "Add signed commit"
git push

เปลี่ยน <file> เป็นไฟล์ที่ต้องการ commit จากนั้นเปิดหน้า commit บน GitHub หรือ GitLab ถ้าทุกอย่างตรงกันก็จะเห็นป้าย Verified

การตั้งค่านี้มีผลกับ commit ใหม่ ไม่ได้เซ็น commit เก่าย้อนหลังให้อัตโนมัติ

ถ้ายังไม่ขึ้น Verified ลองตรวจว่าเพิ่มไฟล์ .pub ถูกบัญชี เลือกชนิด key เป็น signing และใช้อีเมลที่ตรงกับบัญชี โดยดูอีเมลใน commit ล่าสุดได้ด้วยคำสั่ง

git log -1 --format=full

แถม ตรวจสอบลายเซ็นในเครื่อง

ถ้าอยากตรวจลายเซ็นจากเครื่องตัวเองด้วย ให้สร้างไฟล์ allowed_signers แล้วบอก Git ว่าไฟล์อยู่ตรงไหน

touch ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile "$HOME/.ssh/allowed_signers"

เพิ่มอีเมลและ public key ของเราลงไป

echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/GitSigningkey.pub)" >> ~/.ssh/allowed_signers

ถ้าใช้หลายบัญชี ให้รันจาก Repository ที่ตั้งอีเมลไว้ถูกต้อง หรือเช็กอีเมลก่อนด้วย git config --get user.email

จากนั้นตรวจ commit ล่าสุดได้ด้วยคำสั่ง

git log -1 --show-signature

ถ้าผ่านจะเห็นข้อความ Good "git" signature ส่วนไฟล์ allowed_signers เป็นรายการ key ที่เราเชื่อถือในเครื่อง ไม่ได้ดึงรายชื่อมาจาก GitHub หรือ GitLab ให้อัตโนมัติ

เท่านี้ commit ใหม่ของเราก็มีลายเซ็นให้ตรวจสอบแล้ว สิ่งสำคัญที่สุดยังเหมือนเดิมคือเก็บ private key ให้ดี เพราะป้าย Verified จะน่าเชื่อถือได้ ก็ต้องเริ่มจาก key ที่ไม่หลุดไปอยู่ในมือคนอื่นที่ไม่ใช่เรานะ...