Lecture 7 — Public Key Infrastructure
กุญแจสาธารณะไม่มีชื่อเจ้าของเขียนอยู่ในตัวมัน คาบนี้ว่าด้วยเอกสารที่มัดกุญแจเข้ากับชื่อ และโครงสร้างทั้งระบบที่ทำให้เอกสารใบนั้นเชื่อถือได้
เลกเชอร์ 7 · อ่าน 45 นาที · เรียบเรียงจากสไลด์ Chapter 7 ของ Krerk Piromsopa, Ph.D.
กุญแจสาธารณะเป็นแค่ตัวเลขก้อนหนึ่ง ไม่มีชื่อเจ้าของอยู่ในตัวมัน certificate คือเอกสารที่เอาชื่อกับกุญแจมาวางคู่กันแล้วให้คนที่เราเชื่ออยู่แล้วเซ็นทับ ส่วน PKI คือคน กฎ และขั้นตอนทั้งระบบที่ทำให้ลายเซ็นบนเอกสารใบนั้นมีน้ำหนักพอให้เชื่อ
เนื้อหามาจากสไลด์ Chapter 7 ทั้ง 29 หน้า คำนิยาม ชื่อองค์ประกอบ ชื่อผู้ออกใบรับรอง และค่าในใบรับรองของ www.chula.ac.th มาจากสไลด์จริง ส่วนคำอธิบาย รูป ผลการรันคำสั่ง และกล่องที่ติดป้าย "เสริม" เขียนขึ้นใหม่
คาบนี้จะพาไปไหน
| คำถาม | คำตอบอยู่ที่ |
|---|---|
| การเข้ารหัสที่เรียนมาแล้ว ยังเหลือช่องอะไร | ส่วนที่ 1 |
| certificate คืออะไร และข้างในมีอะไร | ส่วนที่ 2 |
| PKI คืออะไร และเกิดมาตอบคำถามข้อไหน | ส่วนที่ 3 |
| ใครทำอะไรบ้างในระบบนี้ | ส่วนที่ 4 |
| ทำไมเราถึงต้องเชื่อ CA | ส่วนที่ 5 |
| ถ้าความเชื่อนี้ถูกใช้ผิดทาง จะเสียหายแค่ไหน | ส่วนที่ 6 |
ส่วนที่ 1 — ช่องเดียวที่การเข้ารหัสยังปิดไม่ได้
เครื่องมือสามกลุ่ม และข้อที่ยังค้างของแต่ละกลุ่ม
Lecture 6 ให้เครื่องมือมาสามกลุ่ม แต่ละกลุ่มถูกเอามาวัดด้วยคุณสมบัติชุดเดียวกัน แล้วเหลือข้อที่ยังตอบไม่ได้คนละข้อ
| กลุ่ม | ความเร็ว | คุณสมบัติที่เอามาพิจารณา | ข้อที่ยังให้ไม่ครบ |
|---|---|---|---|
| Hash / Digest | เร็วที่สุด | integrity | ไม่มี |
| Symmetric Encryption | เร็ว | confidentiality, integrity, scalability, authentication, non-repudiation | integrity |
| Asymmetric Encryption | ช้ากว่า symmetric 100–1000 เท่า | confidentiality, integrity, scalability, authentication, non-repudiation | authentication |
Non-Repudiation (การปฏิเสธไม่ได้ว่าตัวเองเป็นคนทำ) คือคุณสมบัติที่ทำให้คนเซ็นเอกสารแล้วมาอ้างทีหลังไม่ได้ว่าไม่ได้เซ็น คำอธิบายของคำนี้เป็นข้อมูลเสริม
ข้อสรุปของทั้งสามแถวคือ การเอาโปรโตคอลหลายตัวมาต่อกันแก้ปัญหาได้เกือบทุกข้อ ยกเว้น authentication และทั้งบทนี้มีไว้แก้ข้อที่เหลือข้อเดียวนั้น
กุญแจสมมาตรกี่ดอกถึงพิสูจน์ได้ว่าใครเขียน
อาจารย์คนหนึ่งแชร์ข้อมูลกับนิสิต 100 คน และต้องพิสูจน์ integrity ของข้อมูลได้ด้วย คือพิสูจน์ว่าเอกสารนี้อาจารย์เป็นคนสร้าง กุญแจสมมาตรที่ต้องใช้คือ 100 ดอก ดอกละคน เพราะถ้ามีดอกเดียวที่ถือร่วมกันทั้งชั้น ใครที่ถือกุญแจนั้นก็เขียนข้อความได้เหมือนกันหมด เหตุผลเต็ม ๆ อยู่ใน ส่วนที่ 8 ของ Lecture 6
นี่คือที่มาของคำถามค้างในแถว symmetric — กุญแจที่ใช้ร่วมกัน ทำให้ทุกคนที่ถือกุญแจสร้างข้อความที่ดูถูกต้องได้เท่ากันหมด integrity ของมันจึงกันได้แค่คนนอกวง ไม่ได้บอกว่าใครในวงเป็นคนเขียน
กุญแจคู่เดียวพอสำหรับคนทั้งโลก
กุญแจไม่สมมาตรตัดปัญหาข้างบนทิ้ง เพราะ เราเก็บแค่ private key ส่วน public key แจกได้อย่างอิสระ เช่นเอาไปแปะไว้บนหน้าเว็บส่วนตัว
กุญแจหนึ่งคู่ใช้ทำได้สามอย่าง
- Confidentiality — ล็อกด้วย public key แล้วมีแต่คนที่ถือ private key ที่อ่านได้
- Integrity — เปิดออกได้ด้วย public key แปลว่ามีแต่คนที่ถือ private key ที่สร้างมันขึ้นมาได้
- Scalability — คนหนึ่งคนมีกุญแจคู่เดียวก็พอ ไม่ว่าจะคุยกับกี่คน
ช่องที่เหลือ — กุญแจไม่มีชื่อเจ้าของอยู่ในตัวมัน
ลองนึกภาพว่ามีคนส่งซองปิดผนึกมาให้ ข้างในมี public key หนึ่งดอก และบนซองเขียนชื่อคนคนหนึ่งไว้
ซองนั้นพิสูจน์อะไรได้บ้าง
พิสูจน์ได้แค่ว่ามีคนเขียนชื่อนั้นลงบนซอง ตัวกุญแจข้างในไม่ได้เปลี่ยนไปตามชื่อบนซองเลย มันเป็นตัวเลขก้อนเดิมไม่ว่าจะใส่ซองไหน ใครจะหยิบกุญแจของตัวเองใส่ซองแล้วเขียนชื่อธนาคารลงไปก็ได้
ข้อสรุปของหัวข้อนี้คือ ถ้ามัด private key เข้ากับตัวคนไม่ได้ เราก็แก้ authentication ไม่ได้ ซึ่งเรียกกันว่า Missing Link (ข้อต่อที่ขาดหายไประหว่างกุญแจกับตัวตน) ของการเข้ารหัสแบบกุญแจไม่สมมาตร
สไลด์ตั้งคำถามเรื่องซองที่เขียนชื่อไว้ แต่ไม่ได้แสดงว่าการอ้างชื่อคนอื่นทำได้ง่ายแค่ไหน คำสั่งนี้สร้างกุญแจคู่ใหม่แล้วออกเอกสารที่เขียนชื่อ www.chula.ac.th ไว้ บนเครื่องของใครก็ได้ ใน 1 วินาที
openssl req -x509 -newkey rsa:2048 -nodes -keyout self.key -out self.crt \
-days 365 -subj "/CN=www.chula.ac.th"
openssl x509 -in self.crt -noout -subject -issuersubject=CN = www.chula.ac.th
issuer=CN = www.chula.ac.thsubject คือชื่อที่ใบนี้อ้างว่าเป็นของใคร และ issuer คือชื่อคนที่เซ็นใบ ซึ่งในใบนี้เป็นชื่อเดียวกันเพราะเราเซ็นให้ตัวเอง ชื่อที่เขียนไว้ไม่ได้ทำให้กุญแจดอกนี้เป็นของจุฬาฯ และไม่มีอะไรในไฟล์นี้ที่ห้ามเราพิมพ์ชื่ออะไรลงไปก็ได้
ลองตอบดู: เพื่อนส่งไฟล์ public key มาทางแชท บอกว่าเป็นของธนาคาร เราเอาไปตรวจลายเซ็นของอีเมลฉบับหนึ่งแล้วผ่าน ตกลงเราพิสูจน์อะไรได้บ้าง
ลายเซ็นที่ตรวจผ่านด้วยกุญแจดอกนี้ บอกได้อย่างเดียวว่าคนเซ็นถือ private key ที่คู่กับกุญแจดอกนี้ และบอกได้ว่าอีเมลไม่ถูกแก้ระหว่างทาง
คำตอบคือ พิสูจน์ได้ว่าอีเมลมาจากเจ้าของกุญแจดอกนั้นจริง แต่ไม่ได้พิสูจน์เลยว่าเจ้าของกุญแจดอกนั้นคือธนาคาร ถ้าเพื่อนสร้างกุญแจเองแล้วบอกว่าเป็นของธนาคาร ทุกอย่างก็ยังตรวจผ่านเหมือนเดิม
คำตอบที่ผิดบ่อยคือ "พิสูจน์ได้ว่าอีเมลมาจากธนาคาร" ซึ่งข้ามข้อต่อที่ขาดไปพอดี คือเรายังไม่มีอะไรยืนยันว่ากุญแจดอกนั้นเป็นของธนาคารตั้งแต่แรก
ส่วนที่ 2 — ใบรับรอง: เอกสารที่มัดกุญแจเข้ากับชื่อ
เครื่องมือที่ใช้มัดคือลายเซ็นดิจิทัล
Digital Signature (ลายเซ็นดิจิทัล) คือการย่อข้อความด้วย hash แล้วล็อกค่าย่อยด้วย private key ฝั่งผู้รับเปิดลายเซ็นด้วย public key แล้วเทียบกับค่าย่อยที่ตัวเองคำนวณได้ ผลลัพธ์ออกมาเป็นผ่านหรือไม่ผ่านเท่านั้น
คุณสมบัติที่ได้มีสองข้อ
- ผู้รับตรวจสอบความเป็นต้นฉบับของข้อความธรรมดาได้
- รวมความเร็วของ message digest เข้ากับความยืดหยุ่นเรื่องจำนวนของ public key
รูปและตัวอย่างเต็มอยู่ใน ส่วนที่ 10 ของ Lecture 6 ของที่ต้องจำไว้ใช้ต่อในบทนี้คือ ลายเซ็นผูกอยู่กับสองอย่างพร้อมกัน คือเนื้อความที่ถูกเซ็น และ private key ที่ใช้เซ็น แก้อย่างใดอย่างหนึ่ง ลายเซ็นก็ไม่ผ่านทันที
Digital Certificate คืออะไร
เรามีปัญหาคือกุญแจไม่มีชื่อ และมีเครื่องมือคือลายเซ็นที่ผูกเนื้อความเข้ากับคนเซ็น
ทางแก้คือเอาสองอย่างมาต่อกันตรง ๆ — เขียนชื่อกับกุญแจไว้ในเอกสารใบเดียวกัน แล้วให้คนที่สามที่เราเชื่ออยู่แล้วเซ็นทับเอกสารทั้งใบ
ตั้งแต่วินาทีนั้น ใครแก้ชื่อหรือสลับกุญแจในเอกสาร ลายเซ็นจะไม่ตรงทันที ชื่อกับกุญแจจึงถูกมัดติดกันด้วยลายเซ็นของคนที่สาม
Digital Certificate (ใบรับรองดิจิทัล) มีนิยามสองท่อน
- การมัด public key ของ entity หนึ่ง เข้ากับ attribute อย่างน้อยหนึ่งอย่างที่บอกว่ามันคือใคร
- เป็นเอกสารที่เชื่อถือได้ ซึ่งออกและเซ็นด้วยลายเซ็นดิจิทัลโดยบุคคลที่สามที่รู้จักหรือไว้ใจได้
ข้างในใบรับรองมีอะไรบ้าง
สี่ช่องที่เป็นแกนของทั้งใบ ตามมาตรฐานชื่อ X.509 ที่ทุกใบบนเว็บใช้ร่วมกัน คือ Issuer, Subject, Subject Public Key และ Issuer Digital Signature
- Subject คือชื่อของเจ้าของใบ เขียนเป็น Distinguished Name (ชื่อแบบเต็มยศที่ระบุตัวตนได้ไม่ซ้ำ) หรือ DN ซึ่งเป็นชุดของฟิลด์ เช่น
C=GB, O=Baltimore Technologies, OU=PSDโดยCคือประเทศOคือองค์กร และOUคือหน่วยงานย่อย - Subject Public Key คือกุญแจสาธารณะของเจ้าของใบ มาคู่กับ user public key parameters ที่บอกว่ากุญแจดอกนี้เป็นอัลกอริทึมอะไร เช่น RSA
- Issuer คือ DN ของคนออกใบ ซึ่งก็คือ CA
- Issuer Digital Signature คือลายเซ็นของ CA ที่ครอบทุกช่องข้างบน บางที่เรียกช่องนี้ว่า CA Signature
ช่องที่เหลือในใบมีอีกห้ากลุ่ม
- Version ที่บอกว่าใบนี้เขียนตามรูปแบบรุ่นไหนของมาตรฐาน
- Serial number ที่ CA เป็นคนออกให้ ใช้อ้างถึงใบใบนี้ใบเดียว
- Validity period หรืออายุของใบ ซึ่งปกติประมาณหนึ่งปี
- Extensions เช่นชื่อสำรองของเจ้าของใบ อย่างอีเมล และ key usage ที่บอกว่ากุญแจดอกนี้เอาไปใช้ทำอะไรได้บ้าง เช่น digital signature หรือ key encipherment ซึ่งคือการเอากุญแจดอกนี้ไปห่อกุญแจสมมาตรที่สองฝั่งใช้คุยกันจริง คำขยายของ key encipherment เป็นข้อมูลเสริม
- Signing algorithm parameters ที่บอกว่า CA เซ็นด้วยอัลกอริทึมอะไร เช่น SHA-1 หรือ MD5
| ช่องในใบ | ค่าที่อยู่ในใบจริง |
|---|---|
| Subject (Issued To) | CN = www.chula.ac.th ส่วน O และ OU เป็น <Not Part Of Certificate> คือไม่ได้ใส่มาในใบ |
| Serial Number | 09:22:09:61:E6:36:9C:F3:81:B2:17:BB:24:9C:BA:CD |
| Issuer (Issued By) | CN = Thawte TLS RSA CA G1, O = DigiCert Inc, OU = www.digicert.com |
| Validity | 29 ธันวาคม 2560 ถึง 29 ธันวาคม 2562 |
| ใบนี้ใช้ทำอะไรได้ | SSL Client Certificate และ SSL Server Certificate |
| SHA-256 fingerprint | E1:F2:42:B1:21:CF:6C:25:F0:4F:8E:8E:21:FC:EF:C6:B6:D4:4C:E6:73:B3:E2:A3:4F:30:31:EA:82:05:81:E3 |
| SHA-1 fingerprint | DF:C4:47:09:27:86:31:CA:1F:46:FD:1D:A1:25:CA:04:DA:CA:1D:49 |
fingerprint คือค่า hash ของทั้งใบ ใช้เทียบด้วยตาว่าใบที่ถืออยู่เป็นใบเดียวกับที่อีกฝั่งหมายถึงหรือเปล่า
สังเกตว่า Subject บอกว่าใบนี้เป็นของ www.chula.ac.th แต่ Issuer บอกว่าคนเซ็นคือ Thawte ซึ่งเป็นคนละคนกัน นั่นคือรูปร่างปกติของใบที่ออกโดย CA
ค่าในใบเปลี่ยนทุกครั้งที่ใบหมดอายุแล้วออกใหม่ ค่าชุดข้างบนจึงไม่ใช่ชุดที่ได้จากเว็บวันนี้
openssl s_client -connect www.chula.ac.th:443 -servername www.chula.ac.th </dev/null \
| openssl x509 -noout -subject -issuer -datessubject=CN = *.chula.ac.th
issuer=C = GB, O = Sectigo Limited, CN = Sectigo Public Server Authentication CA DV R36
notBefore=Jan 5 00:00:00 2026 GMT
notAfter=Feb 5 23:59:59 2027 GMTผู้ออกใบเปลี่ยนจาก Thawte เป็น Sectigo และ Subject กลายเป็น *.chula.ac.th ซึ่งคือใบที่ครอบทุกชื่อที่ลงท้ายด้วย chula.ac.th ส่วนโครงของใบยังเป็นชุดช่องเดิมทุกช่อง
ใบของ www.chula.ac.th ถูกเชื่อได้ยังไง
ใบของ www.chula.ac.th เซ็นโดย Thawte ซึ่งเราไม่เคยเจอหน้า ไม่เคยได้รับ public key ของเขามาด้วยมือ และไม่มีอะไรยืนยันว่าชื่อ Thawte บนใบนั้นเป็นของจริง
ถ้าใบรับรองแก้ปัญหาด้วยการย้ายความเชื่อไปไว้ที่คนออกใบ คำถามเดิมก็แค่ขยับที่ คือกลายเป็นว่าเราจะเชื่อคนออกใบได้ยังไง
Web of Trust (สายความเชื่อที่ต่อกันเป็นทอด ๆ) คือหลักข้อเดียวที่ทำให้ใบรับรองใช้งานได้จริง — ถ้าเรามี public key ของคนหรือองค์กรที่เชื่อถือได้อยู่ในมือแล้ว เอกสารที่เซ็นด้วย private key คู่นั้น ก็ควรเชื่อถือได้ตามไปด้วย
ในบทนี้ Web of Trust หมายถึงหลักข้างบน ซึ่งถูกเอาไปใช้กับสายที่มี CA เป็นชั้น ๆ แต่ในวงการ ชื่อเดียวกันนี้มักหมายถึงโมเดลของ PGP ที่ไม่มี CA เลย และให้ผู้ใช้แต่ละคนเซ็นรับรองกุญแจของกันเองจนกลายเป็นตาข่าย กล่องนี้เป็นข้อมูลเสริม เขียนไว้กันสับสนเวลาเจอคำนี้ที่อื่น
ใบของ www.chula.ac.th ใช้หลักนี้สองทอด
- DigiCert Inc ตรวจแล้วว่า Thawte TLS RSA มีตัวตนจริง
- Thawte TLS RSA ตรวจแล้วว่า www.chula.ac.th มีตัวตนจริง
ผลคือ ถ้าเรามี public key ของ DigiCert Inc อยู่ในมือ เราก็ตรวจได้ว่า www.chula.ac.th ใช้ได้จริง ทั้งที่ไม่เคยรู้จักทั้ง Thawte และจุฬาฯ มาก่อน
ใบบนสุดของสายเรียกว่า Root Certificate (ใบรับรองต้นสาย) มันเซ็นตัวเอง และมาพร้อมกับระบบปฏิบัติการหรือเบราว์เซอร์ตั้งแต่ตอนติดตั้ง ที่เก็บใบพวกนี้เรียกว่า Trust Store (ที่เก็บ root ที่เครื่องเชื่ออยู่ก่อนแล้ว) ย่อหน้านี้เป็นข้อมูลเสริม
สายใบรับรองของ www.chula.ac.th วันนี้ยาวสามทอด
0 s:CN = *.chula.ac.th
i:C = GB, O = Sectigo Limited, CN = Sectigo Public Server Authentication CA DV R36
1 s:C = GB, O = Sectigo Limited, CN = Sectigo Public Server Authentication CA DV R36
i:C = GB, O = Sectigo Limited, CN = Sectigo Public Server Authentication Root R46
2 s:C = GB, O = Sectigo Limited, CN = Sectigo Public Server Authentication Root R46
i:C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network,
CN = USERTrust RSA Certification Authority
Verification: OKs: คือ Subject และ i: คือ Issuer ของแต่ละใบ สังเกตว่า Issuer ของใบหนึ่งคือ Subject ของใบถัดขึ้นไปเสมอ นั่นคือรูปร่างของสายที่ต่อกันติด
ผลนี้ได้จากคำสั่ง openssl s_client -connect www.chula.ac.th:443 -servername www.chula.ac.th โดยตัดบรรทัด a: ที่บอกชนิดกุญแจ และบรรทัด v: ที่บอกอายุของแต่ละใบออก และขึ้นบรรทัดใหม่ให้ชื่อของ USERTrust ที่ของจริงพิมพ์ติดกันบรรทัดเดียว กล่องนี้เป็นข้อมูลเสริม
ความเชื่อที่ต้องทิ้งคือ ใบรับรองคือสิ่งที่ทำให้การเชื่อมต่อถูกเข้ารหัส ถ้ามีใบก็แปลว่าปลอดภัย
ความเชื่อนี้ไม่จริง
มันดูจริงเพราะใบรับรองโผล่มาพร้อมกับ HTTPS เสมอ และเว็บที่ไม่มีใบก็เชื่อมต่อแบบเข้ารหัสไม่ได้จริง ๆ
สิ่งที่ถูกต้องคือ การเข้ารหัสเกิดจากกุญแจ ไม่ได้เกิดจากใบ ใบทำหน้าที่เดียวคือบอกว่ากุญแจดอกที่อีกฝั่งยื่นมานั้นเป็นของใคร กรณีที่แยกสองเรื่องนี้ออกจากกันชัดที่สุดคือคนดักกลางที่ยื่นกุญแจของตัวเองมาให้ การเชื่อมต่อจะถูกเข้ารหัสอย่างแข็งแรงทุกประการ แต่ปลายทางอีกด้านคือคนดักกลาง ไม่ใช่ธนาคาร
ลองตอบดู: ถ้าลบใบของ DigiCert ที่อยู่บนสุดของสายออกจาก trust store ของเครื่อง แล้วเปิด www.chula.ac.th เบราว์เซอร์จะทำยังไง
ใบของเว็บและใบของ Thawte ยังเหมือนเดิมทุกไบต์ ลายเซ็นบนทั้งสองใบก็ยังถูกต้อง แต่การตรวจต้องเดินขึ้นไปจนจบที่ใบที่เราเชื่ออยู่ก่อนแล้ว พอใบบนสุดหายไป สายก็ไม่มีที่สิ้นสุด
คำตอบคือ เบราว์เซอร์เตือนว่าเชื่อใบนี้ไม่ได้ ทั้งที่ตัวเว็บไม่ได้เปลี่ยนอะไรเลยสักอย่าง
คำตอบที่ผิดบ่อยคือ "ยังเข้าได้ปกติ เพราะใบของเว็บยังไม่หมดอายุ" ซึ่งมองข้ามว่าความเชื่อไม่ได้อยู่ในใบของเว็บ แต่อยู่ที่ปลายบนของสาย
ใบที่เซ็นเอง
Self-Signed Certificate (ใบรับรองที่เจ้าของเซ็นเอง) คือใบที่ Issuer กับ Subject เป็นคนเดียวกัน อย่างใบที่ออกด้วยคำสั่งเดียวในส่วนที่ 1 ข้อเท็จจริงเรื่องนี้มีสองข้อ
- ในทางเทคนิค ใครก็สร้างและเซ็นใบรับรองของตัวเองได้
- เราส่งกุญแจหรือใบรับรองให้อีกคนด้วยมือได้ เช่นให้เขา import ใบนั้นเข้าเบราว์เซอร์เอง
คำถามที่เหลือจึงเป็น เราเชื่อคนคนนั้นหรือเปล่า ซึ่งไม่ใช่คำถามเชิงเทคนิค ใบที่เซ็นเองใช้กุญแจแข็งแรงเท่ากับใบที่ CA ออกให้ และเข้ารหัสได้เหมือนกันทุกอย่าง สิ่งที่ต่างคือ ไม่มีใครนอกจากเจ้าตัวรับรองว่าชื่อบนใบนั้นเป็นของจริง การ import ใบเข้าเครื่องด้วยมือ จึงเท่ากับเราเป็นคนตัดสินใจเชื่อเอง แทนที่จะให้คนที่สามตัดสินแทน
ส่วนที่ 3 — คำถามที่ใบรับรองใบเดียวตอบไม่ได้
หกคำถามที่ยังค้างอยู่
พอตกลงกันว่าจะใช้ใบรับรอง คำถามชุดใหม่ก็โผล่มาทันที
- ใบรับรองออกกันยังไง
- ใครเป็นคนออก
- ทำไมเราถึงต้องเชื่อคนที่ออกใบ
- จะตรวจได้ยังไงว่าใบใบหนึ่งยังใช้ได้อยู่
- จะยกเลิกใบได้ยังไง
- ใครเป็นคนยกเลิก
สังเกตว่าหกข้อนี้ไม่มีข้อไหนแก้ได้ด้วยอัลกอริทึม
อัลกอริทึมตอบได้แค่ว่าลายเซ็นบนใบถูกต้องหรือไม่ แต่ตอบไม่ได้ว่าคนเซ็นตรวจตัวตนของเจ้าของใบมาดีแค่ไหน ยกเลิกใบที่ออกผิดหรือเปล่า และถ้าออกใบผิดจนเราเสียหาย ใครรับผิดชอบ
คำตอบของหกข้อนี้จึงต้องเป็นคน กฎ และขั้นตอนการทำงาน ไม่ใช่โค้ด
PKI คืออะไร
Public Key Infrastructure (โครงสร้างพื้นฐานของกุญแจสาธารณะ) หรือ PKI คือ ชุดของบทบาท (ในเชิงกายภาพ) นโยบาย และขั้นตอน ที่บังคับให้เกิดสามเรื่อง
- การลงทะเบียนกุญแจสาธารณะ
- การบริหารกุญแจสาธารณะ คือสร้าง เก็บ แจกจ่าย ตรวจสอบ และเพิกถอน
- การตรวจสอบความถูกต้องของกุญแจสาธารณะ
และมีคุณสมบัติสองข้อ
- ตั้งอยู่บนใบรับรองดิจิทัล
- มัดกุญแจสาธารณะเข้ากับตัวตน ไม่ว่าจะเป็นคนหรือองค์กร
คำว่า "ในเชิงกายภาพ" ในนิยามข้างบนคือหัวใจ — PKI ไม่ใช่อัลกอริทึมและไม่ใช่ซอฟต์แวร์ตัวใดตัวหนึ่ง มันคือองค์กรจริงที่มีพนักงาน มีขั้นตอนการตรวจเอกสาร และมีเอกสารที่บอกว่าตัวเองรับผิดแค่ไหน
มาตรฐานที่ใช้จริงคือ X.509
มาตรฐานของ PKI มีหลายตัว เช่น X.509 และ SPKI ตัวที่ใช้กันจริงบนเว็บทุกวันนี้คือ X.509 ซึ่งกำหนดไว้สองส่วน คือ X.509 PKI ที่เป็นรูปแบบของตัวระบบ และ X.509 Digital Certificates ที่เป็นรูปแบบของใบรับรอง มาตรฐานชุดนี้กำหนดโดย IETF กลุ่มทำงาน PKIX ที่ ietf.org
SPKI เป็นมาตรฐานอีกตัวที่ผูกสิทธิ์เข้ากับกุญแจโดยตรงโดยไม่ต้องมีชื่อเจ้าของ จึงเดินคนละทางกับ X.509 ที่มัดกุญแจเข้ากับชื่อ ประโยคนี้เป็นข้อมูลเสริม
โครงของใบในรูปที่ 1 ก็คือโครงที่ X.509 กำหนดไว้ ทุกช่องที่เห็นในใบของ www.chula.ac.th จึงมีชื่อและตำแหน่งเดียวกันกับใบของเว็บอื่นทุกใบในโลก ย่อหน้านี้เป็นข้อมูลเสริม
ลองตอบดู: ทำไมนิยามของ PKI ถึงต้องพูดถึงการเพิกถอนกุญแจ ทั้งที่การเข้ารหัสทำงานถูกต้องอยู่แล้ว
การเข้ารหัสรับประกันได้แค่ว่าใครที่ถือ private key จะสร้างลายเซ็นที่ตรวจผ่านได้ แต่ไม่ได้รับประกันว่าคนที่ถือกุญแจอยู่ตอนนี้ยังเป็นเจ้าของเดิม กุญแจหลุด พนักงานลาออก หรือเครื่องถูกยึด ล้วนทำให้ข้อความที่ตรวจผ่านกลายเป็นข้อความที่ไม่ควรเชื่อ
คำตอบคือ เพราะความถูกต้องทางคณิตศาสตร์ไม่หมดอายุ แต่ความน่าเชื่อถือหมดได้ จึงต้องมีกลไกประกาศว่าใบใบหนึ่งใช้ไม่ได้แล้ว ก่อนที่มันจะหมดอายุตามกำหนด
คำตอบที่ผิดบ่อยคือ "เพราะกุญแจเก่าถูกเจาะได้ง่ายขึ้นเมื่อเวลาผ่านไป" ซึ่งเป็นคนละเรื่อง นั่นคือเหตุผลของการกำหนดอายุใบ ส่วนการเพิกถอนมีไว้สำหรับใบที่ต้องตายก่อนหมดอายุ
ส่วนที่ 4 — ใครทำอะไรใน PKI
ผู้เล่นในระบบ
X.509 PKI แบ่งงานออกเป็นเจ็ดส่วน แต่ละส่วนมีงานของตัวเองชัดเจน
| ผู้เล่น | งานที่รับผิดชอบ |
|---|---|
| Certificate Authority (ผู้ออกใบรับรอง) (CA) | เซ็นใบรับรอง และเพิกถอนใบที่ออกไปแล้ว |
| Registration Authority (ผู้รับลงทะเบียน) (RA) | ตรวจว่าคนที่มาขอใบเป็นตัวจริงตามที่อ้าง เป็นส่วนที่มีหรือไม่มีก็ได้ |
| Verification Authority (ผู้ตอบว่าใบยังใช้ได้ไหม) (VA) | ตอบคำถามว่าใบใบหนึ่งยังใช้ได้อยู่หรือถูกเพิกถอนไปแล้ว |
| Certificate management system | ระบบที่ดูแลใบตลอดอายุของมัน ตั้งแต่ออกจนหมดอายุ |
| Central directory | ที่เก็บกลางสำหรับค้นหาใบรับรอง กุญแจ และ Certificate Revocation List (รายการใบรับรองที่ถูกเพิกถอน) หรือ CRL |
| Certificate policy | เอกสารที่บอกว่าระบบนี้ทำงานด้วยกฎอะไร |
| PKI-Enabled Applications | โปรแกรมที่เอาใบไปใช้จริง เช่นเบราว์เซอร์และโปรแกรมอีเมล |
คำขอที่วิ่งในเส้นทางที่ 1 เรียกว่า Cert. Request และใบที่วิ่งกลับมาในเส้นทางที่ 3 เรียกว่า Signed Certificate ในระบบจริง CA กับ RA อยู่ในขอบเขตเดียวกันที่เรียกว่า Certification Entity โดย RA เป็นด่านหน้าที่รับเรื่องจากภายนอก และ CA อยู่ข้างหลัง
ฝั่งที่ขอใบมีสองแบบที่วิ่งผ่านอินเทอร์เน็ตมาเหมือนกัน คือ Application Service ซึ่งเป็นเครื่องที่ให้บริการ และ Remote Person ซึ่งเป็นคนที่อยู่ไกล ส่วน Local Person ที่ทำงานอยู่ในองค์กรเดียวกับ CA เดินไปลงทะเบียนกับ RA ตรง ๆ ได้เลย
เหตุผลที่แยก RA ออกจาก CA คือสองงานนี้ต้องการของคนละอย่างโดยสิ้นเชิง
งานของ CA คือถือ private key ที่เซ็นใบทุกใบในระบบ กุญแจดอกนั้นต้องอยู่ในที่ที่ปลอดภัยที่สุด ยิ่งมีคนเข้าถึงน้อยยิ่งดี
งานของ RA คือเจอหน้าคน ตรวจบัตรประชาชน โทรกลับไปที่บริษัท ซึ่งต้องกระจายไปอยู่ใกล้ผู้ใช้ให้มากที่สุด
ถ้ารวมสองงานไว้ที่เดียว เราจะต้องเลือกระหว่างกุญแจที่ปลอดภัยแต่คนเข้าถึงยาก กับจุดบริการที่สะดวกแต่มีกุญแจสำคัญวางอยู่ การแยกทำให้ได้ทั้งสองอย่าง
วงจรของใบหนึ่งใบมีสามช่วง
เจ้าของกุญแจสร้างกุญแจคู่ของตัวเอง แล้วส่งคำขอพร้อม public key ไปที่ RA จากนั้น RA ตรวจว่าคนที่มาขอเป็นตัวจริงตามชื่อที่อ้าง ช่วงนี้คือช่วงเดียวที่มีการพิสูจน์ตัวตนของคนจริง ๆ และเป็นช่วงที่ตัดสินว่าใบที่ออกไปจะเชื่อถือได้แค่ไหน
หน้าที่ของ CA และ RA แบบละเอียด
CA ทำหกอย่าง
- Key Generation — สร้างกุญแจ
- Digital Certificate Generation — ประกอบใบรับรอง
- Issuance and Distribution — ออกใบและแจกจ่าย
- Revocation — เพิกถอนใบ
- Key Backup and Recovery System — ระบบสำรองและกู้กุญแจคืน
- Cross Certification — ออกใบข้ามให้ CA อื่น
RA ทำสี่อย่าง
- Face-to-Face Registration — ลงทะเบียนแบบเจอหน้า
- Remote Registration — ลงทะเบียนจากระยะไกล
- Automatic Registration — ลงทะเบียนอัตโนมัติ คือให้ระบบตรวจสิทธิ์เอง โดยไม่มีคนมานั่งดู เช่นตรวจว่าผู้ขอคุมโดเมนนั้นอยู่จริง คำขยายข้อนี้เป็นข้อมูลเสริม
- Revocation — รับเรื่องเพิกถอน
ความเชื่อที่ต้องทิ้งคือ private key เป็นของเราคนเดียวเสมอ ไม่มีใครมีสำเนาได้
ในระบบ PKI จริง ข้อนี้ไม่จริงเสมอไป
มันดูจริงเพราะทั้งบทที่ผ่านมาย้ำว่า private key ต้องไม่ออกจากมือเจ้าของ ซึ่งถูกต้องในแง่ความปลอดภัย
สองย่อหน้าต่อจากนี้เป็นคำอธิบายเสริม — รายการงานของ CA ข้างบนมีทั้ง Key Generation และ Key Backup and Recovery System อยู่ด้วย แปลว่าในระบบแบบนั้น CA เป็นคนสร้างกุญแจให้ผู้ใช้ และเก็บสำเนาไว้กู้คืนได้ องค์กรที่เข้ารหัสไฟล์ของพนักงานไว้ต้องการแบบนี้ เพราะถ้าพนักงานลาออกแล้วทำกุญแจหาย ไฟล์ทั้งหมดจะเปิดไม่ได้อีกเลย
ราคาที่จ่ายคือ non-repudiation หายไป เพราะถ้ามีคนอื่นถือสำเนาของ private key เจ้าของก็อ้างได้ว่าลายเซ็นนั้นไม่ใช่ของตน
ระบบแจกจ่ายใบ และรายการใบที่ตายแล้ว
งานของ central directory ในตารางข้างบน ทำโดยส่วนที่เรียกว่า Certificate Distribution System ซึ่งดูแลของสามอย่าง
- Digital Certificates — ตัวใบรับรองเอง
- CRLs — รายชื่อใบที่ถูกยกเลิกก่อนหมดอายุ
- LDAP (โพรโทคอลสำหรับค้นข้อมูลในไดเรกทอรี) หรือฐานข้อมูลเฉพาะทาง — ที่เก็บที่ทำให้ค้นหาใบได้เร็ว
CRL คือคำตอบของคำถามข้อที่ห้าและหกในส่วนที่ 3 ใบรับรองที่แจกออกไปแล้วเรียกคืนไม่ได้ เพราะมันถูกคัดลอกไปอยู่ในเครื่องของคนอื่นหมดแล้ว สิ่งเดียวที่ทำได้คือประกาศเลขลำดับของใบนั้นลงในรายการกลาง แล้วหวังว่าคนที่จะเชื่อใบนั้นจะมาอ่านรายการก่อน
ใบของ www.chula.ac.th วันนี้ไม่ได้ชี้ไปที่ไฟล์ CRL แต่ชี้ไปที่ OCSP - URI:http://ocsp.sectigo.com ซึ่งเป็นที่อยู่ของ OCSP (Online Certificate Status Protocol) (โพรโทคอลที่ถามสถานะของใบทีละใบ) บริการที่ตอบว่าใบใบหนึ่งยังใช้ได้ไหม แทนที่จะให้ทุกคนโหลดรายชื่อใบที่ตายแล้วทั้งก้อนมาเก็บไว้เอง นี่คือช่องทางที่ VA ในตารางข้างบนใช้ตอบจริง ๆ กล่องนี้เป็นข้อมูลเสริมที่ได้จากการอ่านใบจริง
ลองตอบดู: CA แห่งหนึ่งออกใบชื่อ yourbank.com ให้กับคนที่ไม่ใช่เจ้าของธนาคาร โดยที่ลายเซ็นบนใบถูกต้องทุกประการ ความผิดพลาดเกิดที่ขั้นตอนไหน
ลายเซ็นถูกต้องแปลว่าขั้นตอน issuance ทำงานตามที่ออกแบบไว้ทุกอย่าง CA เอาข้อมูลที่ได้รับมาประกอบเป็นใบแล้วเซ็น ซึ่งเป็นงานเชิงกลไกล้วน ๆ
คำตอบคือ พลาดที่ขั้น enrollment คือขั้นที่ RA ต้องตรวจว่าคนที่มาขอใบเป็นเจ้าของชื่อนั้นจริง เมื่อการตรวจตัวตนหละหลวม ใบที่ออกมาก็ผิดตั้งแต่ต้น แล้วทุกขั้นหลังจากนั้นก็ทำงานถูกต้องบนข้อมูลที่ผิด
คำตอบที่ผิดบ่อยคือ "อัลกอริทึมการเซ็นไม่แข็งแรงพอ" ซึ่งไม่เกี่ยวเลย เพราะต่อให้เปลี่ยนไปใช้กุญแจยาวขึ้นสิบเท่า ใบใบนี้ก็ยังออกได้เหมือนเดิม
ส่วนที่ 5 — ทำไมถึงเชื่อ CA
สองคำตอบของคำถามว่าทำไมต้องเชื่อ
คำถามว่า ทำไมฉันถึงต้องเชื่อ CA มีคำตอบเชิงโครงสร้างสองข้อ คือ certificate hierarchies และ cross-certification
Certificate Hierarchy (ลำดับชั้นของใบรับรอง) คือสายที่เห็นไปแล้วในรูปที่ 2 — เราไม่ได้เชื่อ CA ทุกเจ้าในโลก เราเชื่อ root ไม่กี่ใบที่ติดมากับเครื่อง แล้วความเชื่อไหลลงมาตามสายที่ root เซ็นรับรองไว้
Cross-certification คือทางออกสำหรับกรณีที่ปลายทางไม่ได้อยู่ใต้ root ที่เราเชื่อ
สองบริษัทที่ต่างฝ่ายต่างสร้าง PKI ของตัวเองขึ้นมา จะเจอปัญหาทันทีในวันที่ต้องส่งเอกสารเซ็นชื่อหากัน
พนักงานฝั่ง ก ตรวจลายเซ็นของพนักงานฝั่ง ข ไม่ผ่าน ไม่ใช่เพราะลายเซ็นผิด แต่เพราะสายของใบฝั่ง ข จบที่ root ที่เครื่องฝั่ง ก ไม่รู้จัก
ทางแก้แบบง่ายคือให้ทุกเครื่องฝั่ง ก ติดตั้ง root ของฝั่ง ข เพิ่ม ซึ่งแปลว่าต้องไปยุ่งกับทุกเครื่อง และต้องทำใหม่ทุกครั้งที่มีคู่ค้าเพิ่ม
ทางแก้ที่ขยายได้คือให้ root ของฝั่งเราออกใบรับรองให้ root ของอีกฝั่งหนึ่งใบ แล้วปล่อยให้การตรวจเดินข้ามผ่านใบนั้นเอง ถ้าทั้งสองฝั่งต้องตรวจของกันและกัน ก็ออกใบข้ามคนละใบ
Cross-Certification (การที่ CA สองเจ้าออกใบรับรองให้กัน) ทำให้เกิดงานอีกอย่างที่ฝั่งผู้ตรวจ คือ Path Discovery (การหาเส้นทางของใบจากปลายทางกลับมาถึง root ที่เราเชื่อ) — การไล่หาว่ามีสายไหนบ้างที่เดินจาก root ที่เราเชื่อ ไปถึงใบที่กำลังตรวจอยู่
รูปที่ 4 วาดกรณีที่ง่ายที่สุด คือใบข้ามใบเดียวระหว่าง root สองใบ ของจริงยืดหยุ่นกว่านั้นสองทาง — ใบข้ามออกจาก CA ระดับไหนก็ได้ ไม่จำเป็นต้องเป็น root และ เส้นทางหนึ่งเส้นเดินผ่านใบข้ามได้มากกว่าหนึ่งใบ สามองค์กรที่ต่อกันเป็นลูกโซ่ด้วยใบข้ามสองใบ ทำให้ฝั่งแรกตรวจใบของฝั่งที่สามได้ ทั้งที่ไม่เคยเซ็นใบข้ามให้กันโดยตรง นั่นคือเหตุผลที่งานนี้ถูกเรียกว่า path discovery แทนที่จะเรียกว่าการตรวจใบข้าม
CA ของจริงโตขึ้นเป็นชั้น ๆ
ระบบจริงโตขึ้นเป็นลำดับ จาก CA เดี่ยว ๆ ไปจนถึงโครงที่มีหลายชั้น
- CA เดียว ทำทุกอย่างเอง
- CA หนึ่งตัวกับ RA หนึ่งตัว แยกงานตรวจตัวตนออกมา
- CA ที่มี CA ลูกและ RA หลายตัว เมื่อองค์กรใหญ่ขึ้นจนด่านหน้าเดียวไม่พอ
- CA ที่ต่อกับ Directory Services เพื่อให้ทุกฝ่ายค้นใบและอ่าน CRL จากที่เดียวกัน
- RA ที่กระจายออกไปหลังอินเทอร์เน็ต เพื่อรับลงทะเบียนจากคนที่อยู่ไกล
- LRA หรือ Local Registration Authority ที่เป็นด่านหน้าระดับท้องถิ่น อยู่ปลายสุดของโครง ใกล้ผู้ใช้ที่สุด
CP กับ CPS บอกว่า CA รับผิดแค่ไหน
คำถามที่ว่า จะรู้ได้ยังไงว่า CA รับผิดชอบแค่ไหน มีคำตอบเป็นเอกสารสองฉบับ
- Certificate Policies (CP) — นโยบายที่บอกว่าใบแต่ละแบบของ CA นี้ออกภายใต้กฎอะไร และเอาไปใช้กับงานแบบไหนได้
- Certificate Policy Statement (CPS) — เอกสารที่บอกว่า CA ทำงานตามนโยบายนั้นด้วยขั้นตอนอะไรจริง ๆ
สองฉบับนี้คือสิ่งที่ทำให้คำว่า "เชื่อ CA" มีความหมายในทางกฎหมาย เพราะมันเขียนไว้เป็นลายลักษณ์อักษรว่า CA สัญญาอะไรไว้บ้าง และถ้าทำไม่ได้ตามนั้นจะเกิดอะไรขึ้น
ในเอกสารของ IETF และในวงการ ตัวย่อ CPS มาจาก Certification Practice Statement ไม่ใช่ Certificate Policy Statement ทั้งสองชื่อหมายถึงเอกสารฉบับเดียวกัน กล่องนี้เป็นข้อมูลเสริม เขียนไว้กันสับสนตอนไปอ่านเอกสารจริง
ลองตอบดู: บริษัท ก กับบริษัท ข ทำ cross-certification กันแล้ว ต่อมาบริษัท ข ปล่อยให้ CA ลูกของตัวเองออกใบให้ใครก็ได้โดยไม่ตรวจตัวตน ผลกระทบตกกับใคร
ใบข้ามที่ ก เซ็นให้ ข ทำให้ทุกใบที่ออกใต้ ข กลายเป็นใบที่เครื่องฝั่ง ก ตรวจผ่าน โดยที่ฝั่ง ก ไม่ได้ตรวจอะไรเพิ่มอีกเลย
คำตอบคือ ตกกับฝั่ง ก ด้วย พนักงานฝั่ง ก จะเชื่อใบปลอมที่ออกจากฝั่ง ข เหมือนกับที่เชื่อใบของเพื่อนร่วมงานตัวเอง ความเชื่อที่เซ็นไปแล้วจึงไม่ใช่แค่เรื่องของสองบริษัท แต่เป็นการรับความเสี่ยงของอีกฝ่ายเข้ามาทั้งชุด
คำตอบที่ผิดบ่อยคือ "ตกกับฝั่ง ข ฝ่ายเดียว เพราะเป็นคนออกใบเอง" ซึ่งมองข้ามว่าใบข้ามทำงานสองทาง และเป็นเหตุผลที่ CP กับ CPS ต้องถูกอ่านก่อนเซ็นใบข้ามให้ใคร
ส่วนที่ 6 — เมื่อความเชื่อถูกใช้ผิดทาง
ถ้ามีคนเอา root certificate ปลอมมาใส่ในเครื่องเรา
ถ้าคนร้ายติดตั้ง root certificate ลงในเครื่องของเราได้สำเร็จ มันจะแย่ได้แค่ไหน
คำตอบอยู่ในรูปที่ 2 — การตรวจใบจะหยุดเดินขึ้นทันทีที่เจอใบที่อยู่ใน trust store แล้ว ใบปลอมที่ออกโดย root ปลอมจึงตรวจผ่านเหมือนใบจริงทุกประการ
สไลด์ตั้งคำถามข้อนี้ไว้โดยไม่ได้ลงรายละเอียดว่าทำได้จริงแค่ไหน คำสั่งชุดนี้สร้าง root ปลอมหนึ่งใบ แล้วให้มันออกใบให้ชื่อ www.chula.ac.th
openssl req -x509 -newkey rsa:2048 -nodes -keyout evil-ca.key -out evil-ca.crt \
-days 3650 -subj "/CN=Evil Root CA"
openssl req -newkey rsa:2048 -nodes -keyout fake.key -out fake.csr \
-subj "/CN=www.chula.ac.th"
openssl x509 -req -in fake.csr -CA evil-ca.crt -CAkey evil-ca.key \
-CAcreateserial -out fake.crt -days 365
openssl x509 -in fake.crt -noout -subject -issuer
openssl verify -CAfile evil-ca.crt fake.crtลองทายก่อน: บรรทัดสุดท้ายจะเป็น OK หรือ verification failed
subject=CN = www.chula.ac.th
issuer=CN = Evil Root CA
fake.crt: OK-CAfile evil-ca.crt คือการบอกว่าให้เชื่อ root ใบนี้ ซึ่งเทียบเท่ากับการที่ root ปลอมถูกติดตั้งลงในเครื่องไปแล้ว
ใบใบเดียวกันนี้ ถ้าไม่มี root ปลอมในเครื่อง
openssl verify fake.crtCN = www.chula.ac.th
error 20 at 0 depth lookup: unable to get local issuer certificate
error fake.crt: verification failedไฟล์ไม่ได้เปลี่ยนไปแม้แต่ไบต์เดียว สิ่งที่เปลี่ยนคือรายชื่อ root ที่เครื่องเชื่อเท่านั้น
สไลด์ทิ้งคำถามไว้ว่าความเสียหายคืออะไรโดยไม่ได้ตอบ คำตอบข้างล่างนี้เป็นข้อมูลเสริม และแบ่งได้เป็นสามชั้น
- HTTPS ถูกดักกลางได้โดยไม่มีคำเตือน คนดักกลางออกใบของทุกเว็บที่เราเปิดได้เอง เบราว์เซอร์จะขึ้นแม่กุญแจตามปกติ ทั้งที่ปลายทางอีกด้านคือเครื่องของคนร้าย
- ซอฟต์แวร์ที่เซ็นด้วยใบปลอมจะดูเหมือนของแท้ เพราะการตรวจลายเซ็นของโปรแกรมก็ไล่สายขึ้นไปหา root เหมือนกัน
- อีเมลและเอกสารที่เซ็นชื่อคนอื่นจะตรวจผ่าน เพราะกลไกที่ใช้คือใบรับรองชุดเดียวกัน
WoSign กับ StartCom — ตัวอย่างที่เกิดขึ้นจริง
สามชั้นข้างบนสมมติว่าคนร้ายต้องแอบเอา root มาใส่ในเครื่องเราให้ได้ก่อน ซึ่งฟังดูยาก
แต่ root ที่ติดมากับเบราว์เซอร์ทุกตัวตั้งแต่แรก ไม่ต้องแอบใส่เลย มันอยู่ในเครื่องของทุกคนบนโลกอยู่แล้วโดยการตัดสินใจของผู้ผลิตเบราว์เซอร์
คำถามจึงกลายเป็นว่า ถ้า CA ที่ได้สิทธิ์นั้นไปแล้วใช้มันผิดทาง จะเกิดอะไรขึ้น และมีกรณีจริงให้ดูแล้ว
CA สัญชาติจีนชื่อ WoSign ได้สิทธิ์นั้นมาโดยไม่ต้องแอบ คือขอให้เบราว์เซอร์ทุกเจ้าใส่ root ของตัวเองมาตั้งแต่ต้น แล้วใช้สิทธิ์นั้นผิดทาง
เหตุการณ์ของ WoSign และ StartCom ราวปี 2016 จบลงด้วย การถอด root certificate ของทั้งสองเจ้าออกจากเบราว์เซอร์รายใหญ่ทั้งหมด คือ Google, Mozilla, Apple และ Microsoft สาเหตุมีสี่กลุ่ม
- Secret Acquisition — WoSign ซื้อกิจการ StartCom โดยไม่เปิดเผย ทั้งที่โปรแกรมรับรอง CA ของเบราว์เซอร์ต้องรู้ว่าใครเป็นเจ้าของ CA แต่ละเจ้า เพราะการเปลี่ยนเจ้าของแปลว่าคนที่ถือ private key ของ root เปลี่ยนไปด้วย
- Issuing Certificates for Domains Without Proper Authorization — ออกใบให้โดเมนที่ผู้ขอไม่ได้เป็นเจ้าของ ด้วยข้อบกพร่องสองแบบ
- Unprivileged Port Validation — ระบบตรวจสิทธิ์เหนือโดเมนด้วยการให้ผู้ขอเปิดบริการที่พอร์ตไหนก็ได้ ทั้งที่พอร์ตสูง ๆ เป็นพอร์ตที่ผู้ใช้ธรรมดาบนเครื่องนั้นเปิดได้โดยไม่ต้องเป็นผู้ดูแลระบบ คนที่มีบัญชีธรรมดาบนเซิร์ฟเวอร์จึงขอใบของทั้งโดเมนได้
- Base Domain from Subdomain — ผู้ขอที่พิสูจน์ได้ว่าคุมซับโดเมนหนึ่งได้ กลับได้ใบที่ครอบโดเมนหลักไปด้วย ทั้งที่การคุมซับโดเมนเป็นสิ่งที่บริการฝากเว็บทั่วไปแจกให้ผู้ใช้อยู่แล้ว
- Backdating SHA-1 Certificates — ยังออกใบที่เซ็นด้วย SHA-1 หลังเส้นตายที่วงการกำหนดให้เลิกใช้ แล้วลงวันที่ย้อนหลังให้ดูเหมือนออกก่อนเส้นตาย เพื่อให้เบราว์เซอร์ยังรับใบนั้น
- Failure to Report and Concealment — ไม่รายงานเหตุที่เกิด และปกปิดเมื่อถูกถาม ข้อนี้เป็นข้อที่หนักที่สุด เพราะระบบทั้งระบบตั้งอยู่บนสมมติฐานว่า CA จะบอกเองเมื่อออกใบผิด
สไลด์ให้มาเป็นชื่อของทั้งสี่ข้อ คำอธิบายว่าแต่ละข้อทำงานยังไงและเสียหายยังไงเป็นข้อมูลเสริม
รายละเอียดของสองช่องโหว่ จากบันทึกการสอบสวนของ Mozilla
ช่วงที่ระบบออกใบฟรีของ WoSign ยอมให้ผู้ขอเลือกพอร์ตไหนก็ได้ในการตรวจสิทธิ์ คือ 10 มกราคม ถึง 23 เมษายน 2015 มีนักวิจัยขอใบของโดเมนมหาวิทยาลัยแห่งหนึ่งได้สำเร็จด้วยการเปิดพอร์ตหมายเลขเกินห้าหมื่น และมีใบที่ออกผิดจากช่องโหว่นี้ 72 ใบ
ช่องโหว่ที่ขยายจากซับโดเมนไปเป็นโดเมนหลัก อยู่ในกลุ่มที่พบเดือนมิถุนายน 2015 รูปแบบของมันคือผู้ขอที่พิสูจน์ได้ว่าคุม <subdomain>.example.tld ได้ใบที่ครอบ example.tld ติดมาด้วย และในกลุ่มเดียวกันยังมีอีกช่องโหว่หนึ่งที่เติมโดเมนอะไรก็ได้เข้าไปในคำขอหลังผ่านการตรวจไปแล้ว
การซื้อกิจการ StartCom เสร็จสมบูรณ์เมื่อ 1 พฤศจิกายน 2015 และไม่ได้แจ้งการเปลี่ยนเจ้าของให้โปรแกรมรับรอง CA ทราบ ซึ่งเป็นหน้าที่ที่ต้องทำ
สามย่อหน้านี้ไม่ได้อยู่ในเนื้อหาของบท มาจาก CA:WoSign Issues ของ Mozilla
ลองตอบดู: ถ้า CA เจ้าหนึ่งออกใบผิดไปแล้วรีบประกาศเองทันทีว่าออกใบผิดกี่ใบ ใบไหนบ้าง และเพิกถอนทั้งหมด ทำไมผลถึงต่างจากกรณี WoSign ทั้งที่ความผิดพลาดตั้งต้นเหมือนกัน
ความผิดพลาดทางเทคนิคเกิดขึ้นได้กับ CA ทุกเจ้า และระบบก็ออกแบบมาเผื่อเรื่องนี้ไว้แล้วด้วยการเพิกถอนใบ สิ่งที่ระบบไม่มีทางเผื่อได้คือ CA ที่รู้แล้วแต่ไม่บอก เพราะไม่มีใครนอกจาก CA ที่รู้ว่าตัวเองออกใบอะไรไปบ้าง
คำตอบคือ เพราะสิ่งที่ถูกถอนความเชื่อไม่ใช่ความสามารถทางเทคนิค แต่เป็นความซื่อสัตย์ในการรายงาน CA ที่รายงานเองยังเป็นคู่ค้าที่ประเมินความเสี่ยงได้ ส่วน CA ที่ปกปิด ทำให้ทุกใบที่เคยออกไปกลายเป็นสิ่งที่ตรวจสอบไม่ได้ย้อนหลัง
คำตอบที่ผิดบ่อยคือ "เพราะจำนวนใบที่ออกผิดน้อยกว่า" ซึ่งไม่ตรงประเด็น เบราว์เซอร์ถอด root ของ WoSign ออกเพราะพฤติกรรมการปกปิด ไม่ใช่เพราะนับจำนวนใบแล้วเกินเกณฑ์
PKI ที่ทั้งหน้านี้ไล่มา คือโครงสร้างพื้นฐานเชิงกายภาพสำหรับบริหารจัดการใบรับรอง และหน้าที่หลักของมันคือตรวจสอบตัวตนของเจ้าของกุญแจสาธารณะ ส่วนของนโยบายและกฎหมายไม่ได้อยู่ในขอบเขตของบทนี้ ทั้งที่หกคำถามในส่วนที่ 3 ครึ่งหนึ่งเป็นคำถามเชิงกฎหมาย
- hash เร็วที่สุดและให้ integrity, symmetric เร็วแต่ integrity ยังมีคำถามค้าง, asymmetric ช้ากว่า symmetric 100–1000 เท่า และ authentication ยังมีคำถามค้าง
- การต่อโปรโตคอลหลายตัวแก้ได้เกือบทุกข้อ ยกเว้น authentication
- กุญแจคู่หนึ่งให้ confidentiality, integrity และ scalability และเก็บแค่ private key ส่วน public key แจกได้
- Missing Link — ถ้ามัด private key เข้ากับตัวคนไม่ได้ ก็แก้ authentication ไม่ได้
- Digital Certificate คือการมัด public key ของ entity เข้ากับ attribute ที่บอกตัวตน และเป็นเอกสารที่ออกและเซ็นโดยบุคคลที่สามที่ไว้ใจได้
- สี่ช่องแกนของใบคือ Issuer, Subject, Subject Public Key, Issuer Digital Signature และมี version, serial number, validity period, extensions กับ signing algorithm ประกอบ
- Web of Trust — ถ้าเรามี public key ของฝ่ายที่เชื่อถือได้ เอกสารที่เซ็นด้วย private key คู่นั้นก็ควรเชื่อได้
- ใบของ
www.chula.ac.thถูกเชื่อผ่านสองทอด คือ DigiCert รับรอง Thawte และ Thawte รับรองwww.chula.ac.th - Self-signed certificate — ใครก็เซ็นใบของตัวเองได้ และส่งให้คนอื่น import เองได้ คำถามที่เหลือคือเราเชื่อคนคนนั้นไหม
- หกคำถามที่ค้าง: ออกใบยังไง ใครออก ทำไมต้องเชื่อคนออก ตรวจความถูกต้องยังไง เพิกถอนยังไง และใครเพิกถอน
- PKI คือชุดของบทบาท นโยบาย และขั้นตอน สำหรับการลงทะเบียน การบริหาร (สร้าง เก็บ แจกจ่าย ตรวจสอบ เพิกถอน) และการตรวจสอบกุญแจสาธารณะ
- ตั้งอยู่บนใบรับรอง และมัดกุญแจเข้ากับตัวตนของคนหรือองค์กร
- มาตรฐานมีหลายตัว เช่น X.509 และ SPKI ตัวที่ใช้จริงคือ X.509 ซึ่งกำหนดโดย IETF PKIX WG
- เจ็ดส่วน: CA, VA, certificate management system, central directory, certificate policy, RA (มีหรือไม่มีก็ได้) และ PKI-enabled applications
- วงจรสามช่วง: Enrollment, Issuance, Validation
- CA ทำ key generation, certificate generation, issuance and distribution, revocation, key backup and recovery, cross certification
- RA ทำ face-to-face, remote และ automatic registration รวมถึงรับเรื่อง revocation
- ระบบแจกจ่ายใบดูแล ใบรับรอง, CRLs และ LDAP หรือฐานข้อมูลเฉพาะทาง
- คำตอบเชิงโครงสร้างคือ certificate hierarchies และ cross-certification ซึ่งพ่วงมากับงาน path discovery
- ของจริงโตจาก CA เดี่ยว ไปจนถึงหลายชั้นที่มี directory services และ LRA อยู่ปลายสุด
- ความรับผิดเขียนอยู่ใน Certificate Policies (CP) และ CPS
- root ปลอมในเครื่องหนึ่งใบ ทำให้ใบปลอมของทุกเว็บตรวจผ่าน ทั้ง HTTPS ซอฟต์แวร์ที่เซ็น และอีเมลที่เซ็น
- WoSign และ StartCom ราวปี 2016 ถูกถอด root ออกจากเบราว์เซอร์รายใหญ่ทั้งหมด
- สี่สาเหตุ: secret acquisition, ออกใบให้โดเมนที่ผู้ขอไม่มีสิทธิ์ (unprivileged port validation และ base domain from subdomain), backdating SHA-1 certificates และ failure to report and concealment
- ข้อสรุปของบท: PKI คือโครงสร้างพื้นฐานเชิงกายภาพ หน้าที่หลักคือตรวจสอบตัวตนของเจ้าของ public key