ในขณะที่คุณได้พบคุณสามารถปิดการใช้งานการตรวจสอบใบรับรองที่เข้ารหัส SSL / TLS ระดับการจับมือกันภายใน Apache Httpd SSLVerifyCLient optional_no_ca
โดยใช้
ปัญหาที่สองที่คุณกำลังเผชิญกับสิ่งที่คุณพยายามทำคือการให้ลูกค้าส่งใบรับรอง เนื่องจากใบรับรองของคุณไม่ได้มีวัตถุประสงค์เพื่อเป็นภายใน PKI พวกเขาอาจลงนามด้วยตนเองและมีผู้ออกใบรับรองหลายราย
เมื่อร้องขอใบรับรองไคลเอ็นต์เซิร์ฟเวอร์จะส่งCertificateRequest
ข้อความ TLSไปยังไคลเอนต์ระหว่าง handhsake ข้อความนี้มีcertificate_authorities
รายการ:
รายการของชื่อที่แตกต่างของหน่วยงานออกใบรับรองที่ยอมรับได้ ชื่อจำเพาะเหล่านี้อาจระบุชื่อจำเพาะที่ต้องการสำหรับรูต CA หรือสำหรับผู้ใต้บังคับบัญชา ดังนั้นข้อความนี้สามารถใช้เพื่ออธิบายทั้งรูทที่รู้จักและพื้นที่การอนุญาตที่ต้องการ หากรายการ certificate_authorities ว่างเปล่าไคลเอ็นต์อาจส่งใบรับรองใด ๆ ของ ClientCertificateType ที่เหมาะสมยกเว้นว่ามีการจัดเรียงภายนอกบางอย่างในทางตรงกันข้าม
เบราว์เซอร์ใช้สิ่งนี้เพื่อเลือกใบรับรองไคลเอ็นต์ที่จะส่ง (ถ้ามี)
(โปรดทราบว่าส่วนที่เกี่ยวกับรายการที่ว่างเปล่าจะมีเฉพาะในสเปคตั้งแต่ TLS 1.1 เป็นต้นไป SSL 3.0 และ TLS 1.0 จะเงียบในเรื่องนี้และในทางปฏิบัติมันจะทำงานด้วย)
คุณมีสองทางเลือกสำหรับสิ่งนี้
หากใบรับรองลูกค้าที่คุณคาดว่าจะลงนามด้วยตนเองพวกเขาทั้งหมดจะมี บริษัท ผู้ออกหลักทรัพย์ที่แตกต่างกัน เนื่องจากคุณไม่รู้ว่าจะคาดหวังอะไรเซิร์ฟเวอร์จะต้องส่งรายการว่าง หากต้องการทำสิ่งนี้ให้ใช้SSLCADNRequestFile
คำสั่งและชี้ไปที่ไฟล์ที่มีเพียงบรรทัดว่าง (ถ้าฉันจำได้ดีมันจะไม่ทำงานกับไฟล์ที่ว่างเปล่าอย่างสมบูรณ์)
ตัวเลือกที่สอง (สะอาดน้อยกว่า) คือการยอมรับ DN ของผู้ออกที่ใช้ร่วมกันกับใบรับรองไคลเอ็นต์ทั้งหมดที่คุณคาดหวังไม่ว่าพวกเขาจะได้รับใบรับรอง CA นั้นจริงหรือไม่ก็ตาม (หรือว่า CA นั้นมีอยู่จริงหรือไม่ก็ตาม) ด้วยการทำเช่นนี้คุณจะทำลายโมเดล PKI มากขึ้น (มากขึ้น)
หากคุณเห็นด้วยกับผู้ออก DN เช่นCN=Dummy CA
(ตัวอย่าง) ทุกคนสามารถสร้างใบรับรองที่ลงนามเองได้โดยใช้CN=Dummy CA
เป็นหัวเรื่อง DN (และผู้ออก DN) ซึ่งอาจมีคีย์ที่แตกต่างกัน แม้ว่าSSLCADNRequestFile
directive คาดว่าจะถูกกำหนดค่าด้วยใบรับรองเพื่อสร้างรายการเหล่านี้ไม่ได้ใช้ในการตรวจสอบใบรับรองลูกค้าเลยมันเป็นเพียงความซับซ้อน (แต่เป็นธรรมชาติในบริบทของคำสั่งอื่น ๆ ) ของการกำหนดค่าcertificate_authorities
รายการ หากคุณเป็นผู้ให้บริการใส่ใบรับรองที่ลงนามเองด้วยชื่อเหล่าSSLCADNRequestFile
นี้สิ่งนี้จะทำให้CertificateRequest
ข้อความ TLS ใช้CN=Dummy CA
ในcertificate_authorities
รายการ (นี่เป็นเพียงชื่อไม่ใช่ใบรับรองในขั้นตอนนี้) จากนั้นลูกค้าจะสามารถรับใบรับรองของตนเองด้วยผู้ออก DNCN=Dummy CA
ไม่ว่าจะสามารถตรวจสอบลายเซ็นได้หรือไม่โดยใบรับรองนั้น (คีย์เดียวกัน) หรือไม่เนื่องจากไม่มีการยืนยันลายเซ็นในขั้นตอนเหล่านี้
สิ่งนี้ถูกกล่าวว่าโปรดจำไว้ว่าด้วยSSLVerifyCLient optional_no_ca
ไม่มีการตรวจสอบใบรับรองจริง (ฉันคิดว่าคุณสามารถตรวจสอบSSL_CLIENT_VERIFY
ตัวแปรได้หากการตรวจสอบด้วยตนเองของคุณเป็นเพียงโซลูชันสำรองสำหรับ PKI ที่คุณกำหนดค่าไว้แล้ว) สิ่งที่คุณจะรู้ในขั้นตอนนั้นคือลูกค้ามีกุญแจส่วนตัวสำหรับใบรับรองกุญแจสาธารณะที่นำเสนอ (รับประกันโดยCertificateVerify
ข้อความTLS ): คุณจะต้องทำการยืนยันบางรูปแบบหากคุณต้องการให้มีการรับรองความถูกต้อง ประเภท (คุณไม่สามารถเชื่อถือเนื้อหาใด ๆ ของใบรับรองนั่นคือการเชื่อมโยงระหว่างพับลิกคีย์และชื่อ / แอททริบิวที่มีอยู่)
สิ่งนี้จะทำงานได้ไม่ดีกับไฟล์ แต่คุณสามารถทำได้สำหรับแอปพลิเคชัน (เช่น PHP / CGI / ... แม้กระทั่ง Java หากคุณส่งใบรับรองไปยังเซิร์ฟเวอร์ Java ที่พร็อกซี) หนึ่งในวิธีการขั้นพื้นฐานจะมีรายชื่อก่อนที่รู้จักของกุญแจสาธารณะหรือคุณอาจจะดูที่ความคิดในfoaf + SSL / WebID