เครื่องมือสำหรับนักพัฒนา · ตัวเข้ารหัสและตัวถอดรหัส Base64
PEM อธิบาย: เหตุใดใบรับรองและคีย์จึงเป็น Base64 ระหว่าง BEGIN และ END
· พื้นหลัง
base64 การเข้ารหัส
ไฟล์ PEM คือ DER ไบนารี่ที่หุ้มด้วย Base64 โดยมีเส้นเกราะที่มีป้ายกำกับ โพสต์นี้จะอธิบายที่มาของรูปแบบ กฎบรรทัดของรูปแบบ และสิ่งที่คุณเรียนรู้ได้และไม่สามารถเรียนรู้ได้ด้วยการถอดรหัสรูปแบบหนึ่ง
ใบรับรองที่ 'ดูเหมือนข้อความ' แต่ไม่สามารถแยกวิเคราะห์ได้ - การพิมพ์ผิดของส่วนหัว การขึ้นบรรทัดใหม่ที่หลงทาง และรูปแบบที่อยู่ด้านล่าง
ไฟล์ PEM เป็นไฟล์ไบนารีที่เข้ารหัส Base64 ซึ่งอยู่ในป้ายกำกับข้อความ ชื่อนี้มาจาก Privacy-Enhanced Mail (RFC 1421, 1992) ซึ่งใช้รูปแบบนี้สำหรับข้อความที่เข้ารหัส ปัจจุบันรูปแบบยังคงอยู่ในรูปแบบใบรับรอง TLS, คีย์ SSH และคีย์ GPG โครงสร้างนั้นเรียบง่าย: บรรทัดที่เขียนว่า -----BEGIN CERTIFICATE----- (หรือ BEGIN PRIVATE KEY, BEGIN PUBLIC KEY ฯลฯ) ตามด้วย 64-บรรทัดอักขระของข้อความ base64 ตามด้วย -----END CERTIFICATE-----
เนื้อความ base64 ถอดรหัสเป็นรูปแบบไบนารีที่เรียกว่า DER (กฎการเข้ารหัสเฉพาะ) ซึ่งเป็นวิธีการทำให้ข้อมูลที่มีโครงสร้างเป็นอนุกรม (โดยเฉพาะ โครงสร้าง ASN.1) การถอดรหัส base64 จะให้ไบนารี่แก่คุณ การอ่านไบนารีต้องใช้ความเข้าใจ ASN.1 ซึ่งซับซ้อน เกราะ PEM มีอยู่เนื่องจากไฟล์ไบนารียากที่จะส่งอีเมลและแก้ไข ไฟล์ใบรับรองในรูปแบบไบนารี่แท้อาจเสียหายเมื่อส่งผ่านระบบเมลเก่า USENET หรือแบบฟอร์มบนเว็บ
ชุดเกราะข้อความที่มองเห็นได้ในบล็อก PEM — ป้ายกำกับรอบๆ ตัว Base64
ด้วยการเข้ารหัสฐาน 64 ไบนารี่และล้อมไว้ในป้ายกำกับข้อความ ใบรับรองทั้งหมดจะกลายเป็นข้อความ 7-บิต ASCII ที่จะคงอยู่ต่อไปในการขนส่งใดๆ โปรแกรมแก้ไขข้อความสามารถเปิดได้ ระบบเมลจะไม่เสียหาย บรรทัด -----BEGIN และ -----END เป็นป้ายกำกับสำหรับมนุษย์และเครื่องมืออัตโนมัติ โดยจะระบุอย่างชัดเจนว่าข้อมูลประเภทใดอยู่ภายใน ใบรับรองมีป้ายกำกับ CERTIFICATE; รหัสส่วนตัวมีป้ายกำกับ PRIVATE KEY
ฉลากไม่ได้รับการตรวจสอบโดยซอฟต์แวร์เข้ารหัส มันเป็นเพียงคำใบ้สำหรับมนุษย์และเครื่องมือ ขีดจำกัดบรรทัด 64 อักขระใน PEM มาจาก RFC 1421 และ MIME เหตุผลเดียวกันกับฐานอีเมล 64: ระบบเมลแบบเก่ามีการจำกัดความยาวบรรทัด และ 64 อักขระพอดีกับเทอร์มินัลปี 1980 PEM ล้อมเอาต์พุต base64 ที่ 64 อักขระด้วยการลงท้ายบรรทัด (CR LF บน Windows, LF บน Unix)
จากข้อความที่มีป้ายกำกับไปจนถึงไบต์ที่ถอดรหัส — พื้นที่เก็บข้อมูลนี้ไม่ได้สร้างประวัติรูปแบบ
เมื่อถอดรหัสใบรับรอง PEM ตัวแยกวิเคราะห์จะต้องตัดเส้นเกราะ (-----BEGIN..., -----END...) และตัวแบ่งบรรทัด จากนั้น base64 ถอดรหัสส่วนที่เหลือ การขึ้นแคร่ที่หลงทางหรือป้ายกำกับที่ไม่ตรงกันอาจทำให้การแยกวิเคราะห์เสียหายได้ การตัดบรรทัดไม่ได้เป็นส่วนหนึ่งของมาตรฐาน base64 (RFC 4648 base64 ถูกแกะออก); เป็นข้อมูลเฉพาะสำหรับ PEM ภายใน base64 คือ DER-เข้ารหัสไบนารี่ DER คือ ASN.1 (สัญลักษณ์ไวยากรณ์นามธรรม) ซึ่งเป็นข้อกำหนดที่ซับซ้อนสำหรับการแสดงโครงสร้างข้อมูล
ใบรับรองคือบันทึกที่มีโครงสร้างซึ่งประกอบด้วยชื่อเรื่อง คีย์สาธารณะ ลายเซ็น และข้อมูลเมตา ASN.1 ไม่ได้อธิบายไบต์โดยตรง มันอธิบายว่าควรเข้ารหัสโครงสร้างอย่างไร
กายวิภาคของบล็อกเป็นอินพุตของเครื่องมือนี้ — ลบป้ายกำกับและส่งเฉพาะเนื้อหา Base64
การเข้ารหัสเริ่มต้นด้วย triplets ความยาวแท็ก ตัวอย่างเช่น SEQUENCE ใน ASN.1 จะถูกเข้ารหัสเป็นแท็ก 0x30 ตามด้วยความยาวของเนื้อหา ตามด้วยเนื้อหาเอง ใบรับรองจะเริ่มต้นด้วยไบต์ 0x30 0x82 เสมอ (ลำดับ ความยาวเข้ารหัสเป็นสองไบต์) ซึ่งปรากฏเป็น MII ใน base64
การตรวจสอบใบรับรองโดยไม่แยกวิเคราะห์: อักขระสามตัวแรกของเนื้อหาใบรับรอง PEM มักจะเป็น MII เสมอ (ซึ่งก็คือ 0x30 0x82 ใน base64 ซึ่งเป็นจุดเริ่มต้นของ SEQUENCE) หากบล็อก PEM ไม่ถอดรหัสเป็น 0x30 แสดงว่า base64 เสียหายหรือป้ายกำกับไม่ถูกต้อง เครื่องมือเข้ารหัสและถอดรหัส Base64 สามารถถอดรหัสเนื้อหาและแสดงเลขฐานสิบหกให้คุณเห็น: วางบรรทัด base64 (โดยไม่มีเกราะ -----BEGIN และ END) ลบตัวแบ่งบรรทัด และถอดรหัส
การถอดรหัสใดที่เปิดเผย: ไบต์ไบนารี ไม่ใช่ช่องใบรับรองที่แยกวิเคราะห์
หากเอาต์พุตเป็นไบนารีที่เริ่มต้นด้วย 30 82 เป็นไปได้ว่าโครงสร้างใบรับรองที่ถูกต้อง หากเป็นคำที่ไม่มีความหมายหรือข้อความ แสดงว่าการถอดรหัสล้มเหลวหรือ base64 ผิด ข้อผิดพลาด PEM ทั่วไป: ป้ายกำกับไม่ตรงกัน (เช่น เนื้อหาของใบรับรองที่มีป้ายกำกับ PRIVATE KEY), ปัญหาการจบบรรทัดของ Windows (ตัวแยกวิเคราะห์บางตัวใช้งาน CRLF), การพิมพ์ผิดในบรรทัดเกราะ (ช่องว่างหรืออักขระเพิ่มเติม) หรือการขึ้นบรรทัดใหม่หายไป
เครื่องมือคาดหวัง -----BEGIN CERTIFICATE----- ไม่ใช่ -----BEGIN CERT----- หรือ BEGIN CERTIFICATE การคัดลอกและวาง PEM จากเว็บเบราว์เซอร์หรือ PDF สามารถแนะนำเครื่องหมายคำพูด Unicode หรือเครื่องหมายคำพูดอัจฉริยะแทนเครื่องหมายคำพูด ASCII ได้ ทำให้ป้ายกำกับไม่ชัดเจน การวางคีย์ส่วนตัวลงในช่องใบรับรองถือเป็นข้อผิดพลาดทั่วไป โปรแกรมแยกวิเคราะห์จะปฏิเสธเนื่องจากป้ายกำกับไม่ตรงกัน PEM รองรับหลายบล็อกในไฟล์เดียว
ตัวอย่างการทำงาน: ถอดรหัสเนื้อหาแบบสั้นและตรวจสอบไบต์โดยไม่ต้องยืนยันลายเซ็นใบรับรอง
ไฟล์คีย์ SSH อาจมีทั้งคีย์ส่วนตัว (มีป้ายกำกับ PRIVATE KEY) และคีย์สาธารณะ (มีป้ายกำกับ PUBLIC KEY) หรือบล็อกใบรับรองหลายรายการ โปรแกรมแยกวิเคราะห์จะอ่านไฟล์จากด้านบน โดยมองหาบรรทัดที่ขึ้นต้นด้วย -----BEGIN เมื่อพบสิ่งใดสิ่งหนึ่ง มันจะอ่านจนกระทั่ง -----END โดยมีป้ายกำกับที่ตรงกัน แยกและถอดรหัส base64 เนื้อความ แล้วประมวลผล จากนั้นก็มองหาบล็อกถัดไปต่อไป
สายใบรับรองที่ต่อกันโดยไม่ได้ตั้งใจ (บล็อก PEM หลายบล็อกสำหรับใบรับรองและสื่อกลาง) ในไฟล์เดียวจะถือว่าใช้ได้หากป้ายกำกับทั้งหมดถูกต้อง รูปแบบ PEM ถูกกำหนดให้เป็นมาตรฐานสำหรับ Mail ที่ปรับปรุงความเป็นส่วนตัว (RFC 1421) ในช่วงต้นทศวรรษ 1990
สิ่งนี้ไม่ครอบคลุม — การแยกวิเคราะห์โครงสร้าง ASN.1 การเข้ารหัสคีย์ส่วนตัว และ PKCS#12 บันเดิล
RFC 7468 (2015) ปรับปรุงคำจำกัดความให้ทันสมัยขึ้น ชี้แจงกฎเกณฑ์ความยาวของบรรทัด รูปแบบแนวเกราะ และเคสขอบ เครื่องมือและมาตรฐานส่วนใหญ่อ้างอิงถึง RFC 7468 ทันที มีรูปแบบไบนารีเป็นข้อความอื่นๆ อยู่ (เช่น DER-to-hex สำหรับบางโปรโตคอล) แต่ PEM ที่มีป้ายกำกับ base64 และ ASCII ถือเป็นมาตรฐานโดยพฤตินัยสำหรับการเข้ารหัส และ TLS เนื่องจากเป็นข้อความธรรมดาที่มนุษย์สามารถอ่านได้ และคัดลอกหรือส่งได้ง่าย
การสร้างบล็อก PEM: นำไบนารี DER (เช่น ใบรับรองจากไลบรารีการเข้ารหัส) เข้ารหัสเป็น base64 ล้อมผลลัพธ์ด้วยอักขระ 64 ด้วยการขึ้นบรรทัดใหม่ และล้อมรอบด้วย -----BEGIN CERTIFICATE----- และ -----END CERTIFICATE----- บรรทัด แยกวิเคราะห์บล็อก PEM: ค้นหาบรรทัด -----BEGIN และ -----END แยกส่วนเนื้อหา base64 (ถอดเกราะและตัวแบ่งบรรทัดออก) ถอดรหัส base64 เพื่อรับไบนารี จากนั้นแยกวิเคราะห์ไบนารี DER และ ASN.1
ประเด็นสำคัญ: PEM คือ Base64 ที่มีป้ายกำกับ - วิธีที่ตัวเข้ารหัสและตัวถอดรหัส Base64 ให้พื้นที่ท้องถิ่นแก่คุณในการลองใช้เนื้อหา Base64 ของบล็อกทั้งหมดในเบราว์เซอร์
เครื่องมือส่วนใหญ่ทำสิ่งนี้โดยอัตโนมัติ คุณไม่ค่อยสร้าง PEM ด้วยมือ แต่การทำความเข้าใจโครงสร้างจะมีประโยชน์เมื่อแก้ไขข้อผิดพลาดในการแยกวิเคราะห์หรือเมื่อตรวจสอบใบรับรองด้วยตนเอง ใบรับรอง PEM ดูเหมือนข้อความ แต่เนื้อหาเป็นข้อมูลไบนารี การอ่านป้ายกำกับเริ่มต้นและสิ้นสุดไม่ได้บอกคุณว่าใบรับรองประกอบด้วยอะไรบ้าง คุณต้องถอดรหัส base64 และแยกวิเคราะห์ ASN.1 เพื่อดูชื่อเรื่อง คีย์สาธารณะ ผู้ออก และการหมดอายุ
เครื่องมือเข้ารหัสและถอดรหัส Base64 สามารถถอดรหัสเนื้อหาได้ ดังนั้นคุณจึงสามารถตรวจสอบสองสามไบต์แรกได้ สำหรับการแยกวิเคราะห์แบบเต็ม คุณต้องมี ASN.1 parser (ภาษาโปรแกรมส่วนใหญ่มีไลบรารีสำหรับสิ่งนี้) ข้อมูลเชิงลึกที่สำคัญคือ PEM เป็นรูปแบบคอนเทนเนอร์ โดยจะเก็บข้อมูลที่เข้ารหัส DER ไว้ ไม่ใช่แค่ใบรับรอง ป้ายบอกให้คุณทราบถึงวัตถุประสงค์การใช้งาน แต่ parser ต้องจัดการประเภทข้อมูลอย่างถูกต้อง