ก่อนอื่น โปรดทราบว่าฉันยังใหม่กับการกำหนดค่า SSL ในอดีต ฉันโชคดีเสมอที่มีแผนกไอทีคอยจัดเตรียมเรื่องนั้นให้ฉันล่วงหน้า ดังนั้นจงเตรียมพร้อมสำหรับความเป็นไปได้ที่ฉันอาจจะต้องขอคำชี้แจงในคำตอบบางส่วนของคุณ =)
สิ่งที่ฉันกำลังพยายามทำ
ฉันกำลังตั้งค่าเว็บไซต์อินทราเน็ตของบริษัทสำหรับพนักงาน ตัวอย่างเช่น จะมีหน้าเริ่มต้นของเบราว์เซอร์ที่แสดงเนื้อหาที่ปรับแต่งสำหรับพนักงานแต่ละคน ด้วยเหตุนี้ ฉันจึงต้องสามารถระบุตัวพนักงานคนดังกล่าวได้โดยไม่ต้องใช้ชื่อผู้ใช้/รหัสผ่านหรือการแจ้งเตือนอื่นๆ (แต่การตั้งค่าครั้งเดียวก็ใช้ได้ ฉันแค่ไม่อยากให้พวกเขาได้รับแจ้งทุกครั้ง) โดยปกติแล้ว SSL ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้
ฉันจะมีการตั้งค่าฐานข้อมูล MySQL เพื่อเชื่อมโยงบัญชี "ผู้ใช้" กับ SSL_CLIENT_M_SERIAL และ SSL_CLIENT_I_DN ซึ่งฉันถือว่าจะไม่ซ้ำกันสำหรับใบรับรองไคลเอ็นต์แต่ละรายการ (?) ฉันได้รับแนวคิดนั้นจากบทความนี้: http://cweiske.de/tagebuch/ssl-client-certificates.htm
ครั้งแรกที่ผู้ใช้ไปที่เว็บไซต์ภายใน พวกเขาจะไม่มีใบรับรอง (ฉันไม่ต้องการสร้างใบรับรองด้วยตนเองสำหรับลูกค้า!) ซึ่งในกรณีนี้ $_SERVER["SSL_CLIENT_VERIFY"] == "NONE" หากเป็นเช่นนั้น ระบบจะไปที่หน้าการตั้งค่าบัญชีผู้ใช้ ซึ่งจะรวมขั้นตอนที่ PHP สร้างใบรับรองไคลเอ็นต์ SSL และส่งไปยังเบราว์เซอร์เพื่อให้ผู้ใช้ติดตั้ง ดีและเรียบง่าย จากนั้นผู้ใช้จะติดตั้งใบรับรอง สร้างการเชื่อมโยง และหลังจากรีสตาร์ทเบราว์เซอร์ (เพื่อการวัดผลที่ดี) ผู้ใช้จะกลับไปที่เว็บไซต์ภายใน
ณ จุดนี้ Apache ควรขอใบรับรองไคลเอ็นต์ซึ่งเบราว์เซอร์จะส่งไป จากนั้นสคริปต์ PHP จะแยกวิเคราะห์ตัวแปร $_SERVER ที่จำเป็น เปรียบเทียบกับฐานข้อมูล MySQL และทุกคนต่างก็มีช่วงเวลาดีๆ อีกครั้งที่ดีและเรียบง่าย
สิ่งที่ได้ผลจนถึงขณะนี้
ฉันติดตั้งใบรับรองฝั่งเซิร์ฟเวอร์แล้ว และใช่ พวกเขาลงนามด้วยตนเอง (ด้วยเหตุผลที่ชัดเจน) Apache ได้ติดตั้ง mod_ssl แล้วและทุกอย่างดูเหมือนว่าจะทำงานได้ดี ฉันสร้างสคริปต์ PHP ที่เพิ่งดัมพ์อาร์เรย์ $_SERVER และค่าคีย์ SSL_SERVER_* ทั้งหมดตรงกับใบรับรองที่ฉันสร้างไว้
ปัญหา
ฉันไม่สามารถรับใบรับรองไคลเอ็นต์ให้ทำงานได้! ในสคริปต์ PHP เดียวกันนั้น ไม่ว่าฉันจะทำอะไรก็ตาม SSL_CLIENT_VERIFY == "NONE" และคีย์ SSL_CLIENT_* อื่นๆ หายไป นี่คือสิ่งที่จะเกิดขึ้นหากฉันตั้งค่า SSLVerifyClient เป็นตัวเลือกใน ssl.conf ตามบทช่วยสอนทุกรายการที่ฉันได้อ่าน ทุกคนบอกว่าเว็บเซิร์ฟเวอร์ควรขอใบรับรองไคลเอ็นต์จากเบราว์เซอร์ ประเด็นก็คือ ฉันไม่สามารถทำมันได้! มันตรงไปที่สคริปต์ PHP และถือว่าฉันไม่มีใบรับรองไคลเอนต์เลย สิ่งนี้เกิดขึ้นใน Firefox, Chrome และ IE
ดังนั้นฉันจึงลองตั้งค่า SSLVerifyClient เป็นจำเป็นและรีสตาร์ทเว็บเซิร์ฟเวอร์ ด้วยตัวเลือกนั้น ฉันไม่สามารถสร้างการเชื่อมต่อ SSL ได้ Firefox เพิ่งบอกว่าการเชื่อมต่อถูกรีเซ็ตแล้ว (เบราว์เซอร์อื่นแสดงข้อผิดพลาดในเวอร์ชันของตัวเองเช่นกัน) สิ่งที่แปลกคือบันทึกไม่แสดงกิจกรรมใด ๆ ในความพยายามในการเชื่อมต่อเหล่านี้! เช่น. access_log, error_log, ssl_access_log, ssl_error_log และ ssl_request_log ทั้งหมดไม่แสดงใดๆ; ราวกับว่าความพยายามไม่เคยเกิดขึ้นด้วยซ้ำ สิ่งนี้น่าหงุดหงิดเพราะหมายความว่าฉันไม่มีข้อความแสดงข้อผิดพลาดให้ดำเนินการด้วยซ้ำ แค่เว็บเซิร์ฟเวอร์ที่คอยบอกให้ฉันตกนรก
ฉันพยายามสร้าง/ติดตั้งใบรับรองไคลเอ็นต์ของตัวเองด้วยตนเองโดยใช้ส่วนขยาย OpenSSL ของ PHP ใบรับรองติดตั้งได้ดี แม้ว่าฉันจะไม่พบข้อมูลใด ๆ เกี่ยวกับวิธีเชื่อมโยงใบรับรองนั้นกับเซิร์ฟเวอร์ (สมมติว่าฉันต้องการด้วยซ้ำ) นอกจากนี้ ดูเหมือนจะไม่สำคัญอยู่แล้ว เนื่องจาก Apache ยังคงไม่ขอใบรับรองไคลเอ็นต์ด้วยซ้ำหากตั้งค่าเพิ่มเติมไว้ และถ้ากำหนดไว้ มันก็ระเบิดโดยไม่มีคำอธิบาย ฉันจำเป็นต้องตั้งค่าเป็นตัวเลือกเพื่อให้สคีมานี้ทำงานได้
สิ่งแวดล้อม
ระบบปฏิบัติการ: CentOS 5.7 64 บิต (VirtualBox)
อาปาเช่: 2.2.3
PHP: 5.3.10
ฉันเดาว่าคุณอาจต้องการข้อมูลเพิ่มเติมเพื่อช่วยฉัน ดังนั้นโปรดถาม! ฉันจะจัดหาสิ่งที่คุณต้องการให้คุณ
โดยสรุป ฉันจำเป็นต้องรู้วิธีรับ Apache เพื่อขอใบรับรองไคลเอ็นต์ SSL โดยมีเงื่อนไขที่อธิบายไว้ข้างต้น นอกจากนี้ หากมีการลงนามพิเศษ / ฯลฯ ที่ต้องทำเพื่อทำให้ใบรับรองไคลเอ็นต์ "เข้ากันได้" กับใบรับรองเซิร์ฟเวอร์ (อีกครั้งโดยไม่ต้องทำด้วยตนเองผ่านเชลล์สำหรับใบรับรองไคลเอ็นต์แต่ละอัน!) ฉันจะต้องรู้ว่าเป็น ดี.
ตอนนี้ฉันติดเรื่องนี้ 100% ไม่พบสิ่งใดที่เป็นประโยชน์จากระยะไกลบน Google ความช่วยเหลือใด ๆ ที่คุณสามารถให้ได้จะได้รับการชื่นชมอย่างมาก !! ขอบคุณ! =)