ทำไมต้อง sign commit ของเรา
การ sign GPG กับ Git commit เป็นการรับรองว่าโค้ดถูกเปลี่ยนแปลงเกิดขึ้นจากเราจริงๆ (ไม่ใช่คนอื่นแอบอ้างเอาอีเมล์หรือชื่อของเราไป commit โค้ดแทนเรา) ทำให้โค้ดเรามีความน่าเชื่อถือเพิ่มมากขึ้นและป้องกันการแก้ไขโดยไม่ได้รับอนุญาต คนอื่นมั่นใจแน่ๆว่าเราเป็นคน commit จริงๆ พร้อมสามารถตรวจสอบย้อนกลับได้ ทำให้โปรเจคเรามีความน่าเชื่อถือสูงขึ้น อีกทั้งยังเป็นการเพิ่มความปลอดภัยและสร้างความมั่นใจให้คนใช้งานโปรเจคและทีมของเรา
สิ่งที่ต้องเตรียม
วิธี sign commit ด้วย GPG บน Gitlab
- สร้าง GPG key ใหม่
gpg --full-generate-key
- นำ GPG public key ไปเพิ่มใน Gitlab
gpg --armor --export EFABXXXXXXXX174
- บอก Git ให้ใช้ GPG key ของเรา sign commit
git config user.signingkey EFABXXXXXXXX174
- ทำการ sign ตอน git commit
- สั่งsignตอนcommit โดยส่ง
-S
ตอนcommitgit commit -S -m "message"
- หรือ
- ตั้งค่าsignอัตโนมัติ
git config commit.gpgsign true
เพียงครั้งเดียว หลังจากนั้นgit commit -m "message"
ตามปกติ
- สั่งsignตอนcommit โดยส่ง
- push ขึ้น Gitlab ตามปกติ และเช็คว่า commit ของเรา sign แล้วหรือยัง บน Gitlab
-
git push origin main
-
1. สร้าง GPG key ใหม่
gpg --full-generate-key
จากนั้นเลือก
- ประเภทของ key เป็น
ECC (sign and encrypt) *default*
(Elliptic Curve Cryptography) - เลือก elliptic curve เป็น
Curve 25519 *default*
- กำหนดระยะเวลาในการใช้งาน key หรือเลือก
0
ให้ key ไม่มีวันหมดอายุ - กรอกข้อมูลในการสร้าง key เช่น
Real name:
,Email address:
,Comment:
- ทำการยืนยันการข้อมูลโดยกด
O
(O)kay - กำหนด passphrase ให้กับ key ของเรา (เพื่อป้องกันการเข้าถึง key ของเรา เป็นรหัสผ่าน) แล้วเลือก
<OK>
ตัวอย่างผลลัพธ์จากขึ้นตอนด้านบน
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection?
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Your Name
Email address: your@email.com
Comment: your comment explanation your key
You selected this USER-ID:
"Your Name (your comment explanation your key) <your@email.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
┌─────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrases match. │
│ │
│ Passphrase: _______________________________________________ │
│ │
│ Repeat: ___________________________________________________ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ <OK> <Cancel> │
└─────────────────────────────────────────────────────────────┘
2. นำ GPG public key ไปเพิ่มใน Gitlab
2.1. list GPG keys
gpg --list-secret-keys --keyid-format=long
~/.gnupg/pubring.kbx
----------------------------------
sec ed25519/EFABA125EBAF174 2024-08-16 [SC]
1E37ABCEFAEF1F8B6697990BEFABA125EBAF174
uid [ultimate] Your Name (your comment explanation your key) <your@email.com>
ssb cv25519/2A2C03ACFEFDBA9C 2024-08-16 [E]
2.2. export GPG key
gpg --armor --export EFABA125EBAF174 | pbcopy
บน MacOS ใช้ pbcopy
คัดลอก public key ไปยัง clipboard ได้เลย
ถ้าไม่มี pbcopy
ให้ใช้คำสั่ง gpg --armor --export EFABA125EBAF174
แล้วคัดลอก public key ไปยัง Gitlab
2.3. นำ public key ไปเพิ่มใน Gitlab
นำ public key ที่คัดลอกไว้ไปใส่เพิ่มใน GitLab GPG Keys โดยกดปุ่ม Add new key
3. บอก Git ให้ใช้ GPG key ของเรา sign commit
ทำการบอก Git ให้ใช้ GPG key ของเรา sign commit โดยใช้คำสั่ง
git config --global user.signingkey EFABA125EBAF174
--global
คือการบอก Git ให้ใช้ GPG key นี้ sign commit ของเราในทุก repository ในเครื่องของเรา ไม่ว่าจะเป็น gitlab, github หรือ อื่นๆ
ซึ่งอาจจะไม่เหมาะสำหรับเราถ้าเรามีหลาย GPG key หรือต้องการใช้ GPG key ต่างกันใน repository ต่างๆ (บทความนี้จะไม่พูดถึงกรณีนี้)
หากต้องการใช้ GPG key เฉพาะใน repository นั้นๆ ให้ cd
เข้าไปใน repository นั้นๆ แล้วใช้คำสั่งเดียวกันแต่ไม่ต้องใส่ --global
git config commit.gpgsign true
git config user.signingkey EFABA125EBAF174
4. ทำการ sign ตอน git commit
หากเรา config ให้ใช้ GPG key ของเรา sign commit แล้ว ในขึ้นตอนก่อนหน้า
เราสามารถสั่ง git commit -m "message"
ได้เหมือนเดิม เพียงเท่านี้ commit ของเราจะถูก sign ด้วย GPG key ของเรา
หรือหากเราไม่ได้ config ให้ใช้ GPG key ของเรา sign commit ดังขึ้นตอนก่อนหน้า
เราสามารถใช้คำสั่ง git commit -S -m "message"
ในการ sign commit ด้วย GPG key ของเราเช่นกัน
5. push ขึ้น Gitlab ตามปกติ และเช็คว่า commit ของเรา sign แล้วหรือยัง บน Gitlab
หลังจากที่เรา push commit ขึ้น Gitlab แล้ว เราสามารถเช็คว่า commit ของเรา sign แล้วหรือยัง ได้โดยดูที่หน้า commit บน Gitlab ว่ามีเครื่องหมาย Verified
และ GPG key
ของเราอยู่ด้านล่างของ commit หรือไม่
FAQ:
หากใช้ gnupg2 และ gpg-agent 2.x อย่าลืมตั้งค่าตัวแปรสภาพแวดล้อม GPG_TTY
export GPG_TTY=$(tty)
Top comments (0)