รู้จักกับ Keybase และวิธีเซ็นต์ Git Commit แบบอัตโนมัติ

2 min readJan 4, 2017

คนที่ใช้งาน Git CLI โดยปกติคงจะเจอกันอยู่แล้วว่า Git จะบังคับให้เราตั้งชื่อและอีเมลด้วยคำสั่งด้านล่างนี้ถ้าเราติดตั้งครั้งแรก

$ git config --global user.name "YOUR_DISPLAY_NAME"
$ git config --global user.email "YOUR_EMAIL_ADDRESS"

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

ทางออกคือการเซ็นต์กำกับทุก ๆ Git Commit ของเรานั่นเอง! โดยใช้ PGP Key ที่ผูกเข้ากับอีเมลและสั่งให้ Git เซ็นต์ด้วย PGP Key ตัวนี้เท่านี้ก็เรียบร้อย แต่ผมขี้เกียจจัดเก็บ PGP Key และมันยุ่งยากในกรณีถ้าต้องย้ายเครื่องทำงานไป ๆ มา ๆ เลยใช้บริการ Keybase ที่รับฝาก PGP Key ไว้บน cloud แทน

ก่อนอื่นเข้าไปที่เว็บ https://keybase.io จัดการสมัครสมาชิกและยืนยันอีเมลให้เรียบร้อยจากนั้นติดตั้ง Keybase CLI และ GPG CLI ด้วย Homebrew

$ brew install keybase gpg

ทำการล็อกอินด้วยคำสั่ง

$ keybase login

ทำการสร้าง PGP Key และอัพโหลดขึ้นไปเก็บไว้บน Keybase ด้วยคำสั่ง

$ keybase pgp gen --multi
Enter your real name, which will be publicly visible in your new key: YOUR_DISPLAY_NAME
Enter a public email address for your key: YOUR_EMAIL_ADDRESS
Enter another email address (or <enter> when done): (ENTER)
Push an encrypted copy of your new secret key to the Keybase.io server? [Y/n] Y

แฟลก --multi ใช้สำหรับข้ามการตรวจสอบกรณีที่เคยอัพโหลด PGP Key ขึ้น Keybase ไปแล้วเพื่อป้องกันการเขียนทับ Key ตัวเดิมถ้าถ้าใครที่เพิ่งเคยสร้างครั้งแรกไม่ต้องใส่ก็ได้ครับ

จากนั้น Keybase จะถาม YOUR_DISPLAY_NAME และ YOUR_EMAIL_ADDRESS ให้ใส่เหมือนกันกับที่เราตั้งค่าไว้กับ Git CLI และถ้ามีหลายอีเมลก็สามารถใส่เพิ่มได้จนกว่าจะพอใจจากนั้นกด Enter และ Keybase จะถามว่าจะให้อัพโหลด PGP Key ขึ้นไปเก็บไว้เลยไหม? ก็ตอบ Y เป็นอันเรียบร้อยครับ

มาต่อกันที่วิธีการเซ็นต์ Git Commit​ ก่อนอื่นทำการเรียกรายการ PGP Key ที่อยู่ในเครื่องด้วยคำสั่ง

$ gpg --list-secret-keys
/Users/nomkhonwaan/.gnupg/secring.gpg
-------------------------------------
sec 4096R/XXXXXXXX 2016-12-18 [expires: 2032-12-14]
uid Natcha Luangaroonchai <me@nomkhonwaan.com>
ssb 4096R/YYYYYYYY 2016-12-18

ให้ดูตรงรายการ sec จะมีตัวเลข 4096R/XXXXXXXX ให้ทำการคัดลอกตัวเลขตรง XXXXXXXX เอาไว้, ตรง 4096R หมายถึงเข้ารหัสด้วย RSA จำนวน 4096 bits จากนั้นตั้งค่า Git CLI ด้วยคำสั่งนี้

$ git config --global user.signingkey XXXXXXXX
$ git config --global commit.gpgsign true

แค่นี้ทุก ๆ Git Commit ก็จะถูกเซ็นต์ด้วย PGP Key ที่เราสร้างขึ้นแล้ว แต่ยังไม่เสร็จยังเหลืออีกหนึ่งขั้นตอนคือการอัพโหลด Public Key ไว้ที่ Git Hosting ด้วยเพื่อใช้สำหรับตรวจสอบลายเซ็นต์

ก่อนอื่นต้องเรียกดูรายการ PGP Key ที่เราสร้างไว้ด้วยคำสั่ง

$ keybase pgp list
Keybase Key ID: XXXXXXXX
PGP Fingerprint: YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYY
PGP Identities:
Natcha Luangaroonchai <me@nomkhonwaan.com>

จากนั้นให้คัดลอกตรง XXXXXXXX และใช้คำสั่งด้านล่างนี้เพื่อ export

$ keybase pgp export -q XXXXXXXX | pbcopy

จากนั้นเปิดหน้า https://github.com/settings/keys กดที่ปุ่ม New GPG Key และวาง Public Key ที่เพิ่ง export มาลงไปเป็นอันเสร็จ

ทดลอง Commit และ Push ขึ้น GitHub จากนั้นทุก ๆ Commit ของเราจะมีสัญลักษณ์แบบนี้เพื่อยืนยันว่า Commit ของเราได้รับการเซ็นต์และรับรองอย่างถูกต้อง

GitHub Verified Commit

สำหรับบทความนี้ถ้าใครที่งง ๆ กับ PGP และ GPG จริง ๆ แล้วมันเป็นอย่างนี้ครับ GPG คือ PGP Key ที่ถูกสร้างขึ้นด้วยโปรแกรมที่ชื่อว่า GnuPGP จึงได้มีชื่อย่อว่า GPG นั่นเอง ส่วน PGP เป็นวิธีการเข้ารหัสรูปแบบหนึ่งที่ต้องใช้ Asymetric Key ให้การเข้าและถอดรหัสซึ่งใช้ Algorithm RSA ในการสร้างนั่นเองครับ

--

--

No responses yet