การตรวจสอบห่วงโซ่ใบรับรองล้มเหลวในใบรับรองลีฟ

ฉันสร้างห่วงโซ่ใบรับรอง PEM (CA, ระดับกลางและลีฟ) โดยใช้ pyopenssl และฉันต้องการยืนยันว่าฉันกำหนดทุกอย่างถูกต้องแล้ว

นี่คือขั้นตอนที่ฉันดำเนินการ:

  1. ฉันสร้างใบรับรอง PEM สามใบ ลงนาม CA ด้วยตนเอง และกำหนดข้อจำกัดพื้นฐาน crypto.X509Extension(b'basicConstraints', False, b'CA:TRUE') ตามคำถามนี้
  2. ฉันคัดลอก CA และใบรับรองระดับกลางไปที่ /usr/local/share/ca-certificates (เป็นไฟล์ crt) และรัน sudo update-ca-cert
  3. ฉันได้ตั้งค่าเซิร์ฟเวอร์แบบง่ายตามตัวอย่าง OpenSSL นี้
  4. ฉันลองใช้เซิร์ฟเวอร์ด้วยใบรับรอง CA และดำเนินการ openssl s_client -connect localhost:4433 -CApath /etc/ssl/certs - ใช้งานได้ดี ได้รับ Verify return code: 0 (ok)
  5. ทำสิ่งเดียวกัน แต่คราวนี้เซิร์ฟเวอร์ใช้ใบรับรองระดับกลาง - เยี่ยมมาก Verify return code: 0 (ok)
  6. ทำสิ่งเดียวกัน แต่คราวนี้เซิร์ฟเวอร์ใช้ใบรับรองลีฟ - คราวนี้ฉันได้ Verify return code: 24 (invalid CA certificate)

นอกจากนี้ ฉันได้ลองตรวจสอบใบรับรองและได้รับสิ่งต่อไปนี้:

$ openssl verify 1-ca.pem
1-ca.pem: OK
$ openssl verify 2-intermediate.pem
2-intermediate.pem: OK
$ openssl verify 3-leaf.pem
C = NL, ST = Amsterdam, L = Zaandam, O = FakeDigiCert, OU = FakeFake, CN = www.fakedigicert.nl
error 24 at 1 depth lookup: invalid CA certificate
error 3-leaf.pem: verification failed

เหตุใดใบรับรอง CA จึงไม่ถูกต้องทันทีเมื่อใบรับรองของเซิร์ฟเวอร์อยู่ห่างจาก CA มากกว่าหนึ่งขั้นตอน


person GabeL    schedule 30.07.2020    source แหล่งที่มา
comment
คุณไม่ชัดเจนว่าคุณใส่อะไรในใบรับรองใด แต่คุณพูดว่า 'CA และสื่อกลาง' ราวกับว่าสื่อกลางไม่ใช่ CA ซึ่งก็คือ สิ่งที่คุณมีคือ Root CA, CA ระดับกลางหนึ่งรายการ และเอนทิตีปลายทางหรือที่เรียกว่า Leaf OpenSSL ต้องการ/แต่ละ CA ระดับกลางมี BasicConstraints.ca=true ไม่เช่นนั้นคุณจะได้รับการตรวจสอบข้อผิดพลาด 24; อย่างน้อย ณ ตอนนี้ก็ไม่ต้องการสิ่งนี้สำหรับรูท CA เว้นแต่ว่าโค้ดจะตั้งค่าสถานะ 'เข้มงวด' แต่รูท ควร ยังคงมีอยู่   -  person dave_thompson_085    schedule 31.07.2020
comment
@ dave_thompson_085 นั่นเป็นปัญหาจริงๆ ฉันคิดว่าใบรับรองระดับกลางไม่จำเป็นต้องเป็น CA เมื่อฉันเพิ่มข้อจำกัดพื้นฐานแล้ว การยืนยันก็ผ่านไป ขอบคุณ!   -  person GabeL    schedule 02.08.2020


คำตอบ (1)


นี่ดูเหมือนจะเป็นกับดักทั่วไปที่คนส่วนใหญ่ตกอยู่ในการตั้งค่าเว็บเซิร์ฟเวอร์ https ตลอดเวลา คุณต้องจัดเตรียมใบรับรองระดับกลางทั้งหมดให้กับเว็บเซิร์ฟเวอร์ด้วย (โดยปกติแล้วจะรวมไฟล์ leaf และไฟล์ pem ระดับกลางเป็นไฟล์ pem ไฟล์เดียว) ดังนั้นเมื่อเว็บเบราว์เซอร์ไปที่ไซต์ของคุณ การตั้งค่า SSL ควรส่งคืนใบรับรองทั้งใบและใบรับรองกลางจากเว็บเซิร์ฟเวอร์

คุณสามารถดูสิ่งนี้ได้บนเว็บไซต์ทั้งหมดที่ให้ใบรับรองระดับกลางเมื่อคุณใช้ตัวเลือก -showcerts กับ opensll s_client:

openssl s_client -connect www.example.com:443 -showcerts

เช่นเดียวกับคำสั่ง openssl verify เป็น ดี.

จากเอกสาร:

- ไฟล์ที่ไม่น่าเชื่อถือ

ไฟล์ใบรับรองที่ไม่น่าเชื่อถือเพิ่มเติม (CA ผู้ออกระดับกลาง) ที่ใช้ในการสร้างห่วงโซ่ใบรับรองจากใบรับรองเรื่องไปยังจุดยึดที่เชื่อถือได้ ไฟล์ควรมีใบรับรองอย่างน้อยหนึ่งใบในรูปแบบ PEM ตัวเลือกนี้สามารถระบุได้มากกว่าหนึ่งครั้งเพื่อรวมใบรับรองที่ไม่น่าเชื่อถือจากหลายไฟล์

ดังนั้นในตัวอย่างด้านบน คุณต้องทำ:

openssl verify 3-leaf.pem -untrusted 2-intermediate.pem
person Shane Powell    schedule 30.07.2020
comment
การละเว้นค่ากลางถือเป็นข้อผิดพลาดทั่วไป แต่ไม่สามารถทำให้เกิดข้อผิดพลาดเฉพาะที่แสดงในคำถามนี้ได้ - person dave_thompson_085; 31.07.2020
comment
@ dave_thompson_085 นั่นหมายความว่าใบรับรอง leaf ได้รับการตั้งค่าเป็น 'CA:TRUE' เมื่อไม่ควรใช่หรือไม่ - person Shane Powell; 31.07.2020
comment
@ShanePowell ดูเหมือนว่าโซลูชันของ dave_thompson_085 จะแก้ไขปัญหาได้ แต่ฉันขอขอบคุณสำหรับการชี้แจงในสิ่งที่คุณพูด หากฉันติดตั้งใบรับรองหลักบนโฮสต์ของไคลเอ็นต์ของฉัน จากนั้นจัดเตรียมไฟล์ลูกโซ่ที่มีใบรับรองทั้งสามใบ การตรวจสอบของ s_client ควรจะดีหรือไม่ เพราะเมื่อฉันถอนการติดตั้งใบรับรองระดับกลาง ฉันได้รับ Verify return code: 21 (ไม่สามารถตรวจสอบใบรับรองใบแรกได้) - person GabeL; 02.08.2020
comment
@GabeL: ตามมาตรฐาน เซิร์ฟเวอร์ SSL/TLS ควรส่งเชนทั้งหมด ยกเว้นว่า อาจ ละเว้นรูท (ไม่สำคัญ) ในกรณีของคุณควรส่ง leaf และ imed เป็นอย่างน้อย เซิร์ฟเวอร์ส่วนใหญ่ส่งสิ่งที่คุณกำหนดค่า (เท่านั้น) แต่บางเซิร์ฟเวอร์ก็แตกต่างกันไป หากเซิร์ฟเวอร์ส่งเฉพาะลีฟอย่างไม่ถูกต้อง สิ่งที่ไคลเอนต์ไม่ได้ระบุไว้ตามมาตรฐาน openssl s_client โดยเฉพาะ หากคุณมีทั้ง root และ imed ใน truststore (-CAfile และ/หรือ -CApath หรือค่าเริ่มต้น) ให้ใช้ imed จาก truststore เพื่อสร้าง chain และการตรวจสอบความถูกต้องจะสำเร็จ (หาก/เมื่อใบรับรองถูกต้อง) - person dave_thompson_085; 04.08.2020
comment
เชน: ไม่ ตามที่ฉันแสดงความคิดเห็นเกี่ยวกับคำถาม สาเหตุที่ทำให้การยืนยัน 24 เป็น ตัวกลาง ที่ ขาด ca=true OpenSSL ยอมรับ 'leaf' ด้วย ca=true ซึ่งรวมถึงแต่ไม่จำกัดเพียงใบรับรองที่ลงนามด้วยตนเอง โดยที่ leaf นั้นเป็นรูทด้วยและต้องได้รับความเชื่อถือโดยตรง - person dave_thompson_085; 04.08.2020