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

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

สร้าง 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 แล้วทำตามนี้
- กด Add new key
- วาง public key ลงในช่อง Key
- ตั้ง Title เช่น
Git Signingkey - เลือก Usage type เป็น Signing
- กดเพิ่ม key
GitLab จะตรวจสอบด้วยว่า committer email ใน commit ตรงกับอีเมลที่ยืนยันแล้วในบัญชีหรือไม่
เพิ่ม Signing Key ใน GitHub
ใช้ public key เดียวกันได้เลย โดยเข้าไปที่ SSH and GPG keys ของ GitHub
- กด New SSH key
- ตั้ง Title เช่น
Git Signingkey - เลือก Key type เป็น Signing Key
- วาง public key ลงในช่อง Key
- กด 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 ที่ไม่หลุดไปอยู่ในมือคนอื่นที่ไม่ใช่เรานะ...

Member discussion