Security

SSH และ RSA Keys อธิบายครบจบ: สร้าง ใช้งาน และรักษาความปลอดภัย Key Pairs ของคุณ

คู่มือปฏิบัติเกี่ยวกับ SSH และ RSA key pairs — หลักการทำงาน วิธีสร้างในเบราว์เซอร์ และวิธีใช้สำหรับการเข้าถึงเซิร์ฟเวอร์อย่างปลอดภัยและการเข้ารหัสข้อมูล

7 นาทีในการอ่าน

Security keys concept

การเข้ารหัสด้วย public key คือรากฐานของการสื่อสารที่ปลอดภัยบนอินเทอร์เน็ต — ไม่ว่าจะเป็น SSH connections, HTTPS, JWT signing และอีเมลเข้ารหัสล้วนพึ่งพาหลักการนี้ทั้งสิ้น การเข้าใจว่า key pairs ทำงานอย่างไรจะทำให้คุณเป็นนักพัฒนาที่มีประสิทธิภาพมากขึ้นและตระหนักถึงความปลอดภัยมากยิ่งขึ้น

แนวคิดหลัก: public key และ private key

Key pair ประกอบด้วยกุญแจที่เชื่อมโยงกันทางคณิตศาสตร์สองดอก:

  • Private key — เก็บไว้บนเครื่องของคุณเท่านั้น ห้ามแชร์ให้ใครเด็ดขาด คิดว่ามันคือตัวตนของคุณ
  • Public key — แชร์ได้เต็มที่ ใส่ไว้บนเซิร์ฟเวอร์ ใน GitHub หรือใน JWT configurations

คณิตศาสตร์ทำงานในทิศทางเดียว: ข้อมูลที่เข้ารหัสด้วย public key จะถอดรหัสได้เฉพาะด้วย private key คู่กันเท่านั้น และข้อมูลที่ลงนามด้วย private key สามารถตรวจสอบได้ด้วย public key — โดยไม่เปิดเผย private key แต่อย่างใด

SSH keys: เข้าถึงเซิร์ฟเวอร์โดยไม่ต้องใช้รหัสผ่าน

SSH (Secure Shell) คือมาตรฐานสำหรับการเข้าถึงเซิร์ฟเวอร์จากระยะไกล การยืนยันตัวตนด้วยรหัสผ่านใช้งานได้แต่มีจุดอ่อน — รหัสผ่านอาจถูกเดา ถูก phish หรือรั่วไหล การยืนยันตัวตนด้วย SSH key มีความแข็งแกร่งกว่าในเชิงพื้นฐาน:

  1. Client ของคุณแสดงหลักฐานการเข้ารหัสโดยใช้ private key
  2. เซิร์ฟเวอร์ตรวจสอบหลักฐานนั้นกับ public key ที่คุณติดตั้งไว้
  3. ไม่มีรหัสผ่านส่งผ่านเครือข่าย — ไม่มีอะไรให้ดักจับได้

การตั้งค่า SSH key authentication:

# สร้าง key pair (Ed25519 คือมาตรฐานสมัยใหม่)
ssh-keygen -t ed25519 -C "your-email@example.com"

# คัดลอก public key ไปยังเซิร์ฟเวอร์
ssh-copy-id user@yourserver.com

# เชื่อมต่อ — ไม่ต้องใส่รหัสผ่าน
ssh user@yourserver.com

Public key จะถูกเพิ่มใน ~/.ssh/authorized_keys บนเซิร์ฟเวอร์ ส่วน private key จะไม่ออกจากเครื่องของคุณเลย

Ed25519 vs RSA สำหรับ SSH

Ed25519 คือคำแนะนำในปัจจุบัน:

  • กุญแจขนาดเล็กกว่า (256-bit) แต่มีความปลอดภัยเทียบเท่าหรือดีกว่า RSA-4096
  • สร้างและตรวจสอบลายเซ็นได้เร็วกว่า
  • รองรับโดย SSH server สมัยใหม่ทุกตัว

RSA ยังคงใช้กันอย่างแพร่หลาย โดยเฉพาะในองค์กรที่มีระบบเก่า:

  • 2048-bit คือขนาดขั้นต่ำที่ยอมรับได้ในปัจจุบัน
  • 4096-bit มีความปลอดภัยสำรองเพิ่มเติมสำหรับกุญแจที่ใช้งานระยะยาว
  • ขนาดกุญแจที่ใหญ่ขึ้นทำให้การยืนยันตัวตนช้าลงเล็กน้อย

สร้าง SSH keys ในเบราว์เซอร์ของคุณด้วย SSH Key Generator ของเรา — รองรับ Ed25519 และ ECDSA โดยใช้ Web Crypto API ข้อมูล key จะไม่ออกจากเบราว์เซอร์ของคุณ

RSA keys: การเข้ารหัสและการลงนาม

RSA keys ถูกใช้นอกเหนือจาก SSH — สำหรับ TLS certificates, JWT signing, อีเมลเข้ารหัส (PGP) และ API authentication

กรณีการใช้งาน RSA ที่พบบ่อย:

JWT (JSON Web Tokens) กับ RS256:

  • ลงนาม token ด้วย RSA private key ของคุณ
  • Client ตรวจสอบด้วย public key
  • ต่างจาก HS256 (แบบ symmetric) ตรงที่ผู้ตรวจสอบไม่จำเป็นต้องรู้ signing secret

Code signing:

  • ลงนาม release artifact ด้วย private key ของคุณ
  • ผู้ใช้ตรวจสอบลายเซ็นด้วย public key ที่คุณเผยแพร่
  • พิสูจน์ว่า artifact มาจากคุณและไม่ถูกแก้ไข

TLS/SSL certificates:

  • Certificate authority ลงนาม public key ของคุณด้วย private key ของพวกเขา
  • เบราว์เซอร์ตรวจสอบโดยใช้ public key ของ CA (ที่ฝังอยู่ในเบราว์เซอร์)

สร้าง RSA key pairs ในรูปแบบ PEM ด้วย RSA Key Generator ของเรา — ขนาด 2048-bit หรือ 4096-bit ทำงานทั้งหมดในเบราว์เซอร์ของคุณ

อธิบายรูปแบบ PEM

RSA และ SSH keys มักถูกเผยแพร่ในรูปแบบ PEM (Privacy Enhanced Mail):

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7o4qne60...
-----END PRIVATE KEY-----

ส่วนหัวและส่วนท้ายระบุประเภทของกุญแจ ส่วนกลางคือข้อมูล key ที่เข้ารหัสด้วย base64 header ที่แตกต่างกันบ่งบอกถึงประเภท key ที่ต่างกัน:

  • BEGIN RSA PRIVATE KEY — รูปแบบ PKCS#1 แบบดั้งเดิม
  • BEGIN PRIVATE KEY — รูปแบบ PKCS#8 (พบบ่อยกว่าในเครื่องมือสมัยใหม่)
  • BEGIN PUBLIC KEY — Public key ในรูปแบบ PKCS#8
  • BEGIN OPENSSH PRIVATE KEY — รูปแบบเฉพาะของ OpenSSH สำหรับ SSH keys

การปกป้อง private key ของคุณ

ความปลอดภัยของ private key เป็นเรื่องสำคัญมาก:

  1. อย่า commit ลง git เด็ดขาด — เพิ่ม *.pem, id_rsa และ id_ed25519 ลงใน .gitignore
  2. ใช้ passphrase — เข้ารหัส key ขณะเก็บไว้ แม้ใครจะได้ไฟล์นั้นไป ก็ไม่สามารถใช้งานได้โดยไม่มี passphrase
  3. จำกัดสิทธิ์การเข้าถึง — SSH กำหนดให้ใช้ chmod 600 กับไฟล์ private key และจะปฏิเสธการใช้งาน key ที่คนอื่นอ่านได้
  4. เปลี่ยนทันทีหากถูกเจาะ — สร้าง key pair ใหม่และลบ public key เก่าออกจากทุกเซิร์ฟเวอร์
# ตั้งค่าสิทธิ์ที่ถูกต้องบน private key ของคุณ
chmod 600 ~/.ssh/id_ed25519

Key fingerprints

Fingerprint คือ hash ย่อของ public key ที่ใช้ตรวจสอบตัวตนโดยไม่ต้องเปรียบเทียบ key ทั้งหมด:

ssh-keygen -lf ~/.ssh/id_ed25519.pub
# Output: 256 SHA256:abc123... your-email@example.com (ED25519)

เมื่อเชื่อมต่อกับเซิร์ฟเวอร์เป็นครั้งแรก SSH จะแสดง fingerprint ของ host และขอให้คุณยืนยัน ควรตรวจสอบ fingerprint นี้ผ่านช่องทางอื่น (เช่น เอกสารของผู้ให้บริการเซิร์ฟเวอร์) ก่อนยอมรับ

สรุป

SSH และ RSA key pairs มอบการยืนยันตัวตนและการเข้ารหัสที่แข็งแกร่งกว่ารหัสผ่านในเชิงพื้นฐาน ใช้ Ed25519 สำหรับ SSH, RSA-4096 สำหรับการลงนามและการเข้ารหัส ปกป้อง private key ด้วย passphrase เสมอ และสร้าง key บนเครื่องของคุณเอง — อย่าให้บริการของบุคคลที่สามสร้าง private key ให้คุณเด็ดขาด